mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
699 lines
103 KiB
HTML
699 lines
103 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>4/act</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
|
|
<!--Weave of '4/anl' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">★</a></li><li><a href="index.html">if</a></li><li><a href="index.html#4">Chapter 4: Actions</a></li><li><b>Action Name Lists</b></li></ul><p class="purpose">Action name lists provide a disjunction in the choice of action made by an action pattern. For instance, "taking or dropping the disc" results in a two-entry ANL. An empty ANL is also legal, and means "doing something" -- the generic I7 text for "any action at all".</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Definitions</a></li><li><a href="#SP10">§10. Specificity of ANLs</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">action_name_list</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">action_listed</span><span class="plain">; </span> <span class="comment">the action in this ANL list entry</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">named_action_pattern</span><span class="plain"> *</span><span class="identifier">nap_listed</span><span class="plain">; </span> <span class="comment">or a named pattern instead</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">; </span> <span class="comment">next in this ANL list</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">word_position</span><span class="plain">; </span> <span class="comment">and some values used temporarily during parsing</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">negate_pattern</span><span class="plain">; </span> <span class="comment">parity of the entire list which this heads</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain">; </span> <span class="comment">parity of just this individual item</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parc</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">parameter</span><span class="plain">[2];</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">in_clause</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">abbreviation_level</span><span class="plain">; </span> <span class="comment">number of words missing</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">anyone_specified</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">delete_this_link</span><span class="plain">; </span> <span class="comment">used temporarily during parsing</span>
|
|
<span class="plain">} </span><span class="reserved">action_name_list</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure action_name_list is accessed in 2/ri, 3/em, 3/scn, 3/tm2, 3/ts, 4/act, 4/ap, 4/nap, 5/tfg, 5/gl and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The action name list is the part of an action pattern identifying
|
|
which actions are allowed: "taking, dropping or examining" for
|
|
example. The following routine extracts this from a potentially longer
|
|
text (e.g. "taking, dropping or examining a door").
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain">);</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> = -1;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> = 1;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>abbreviation_level</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>anyone_specified</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::log</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">=0; </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">++) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ANL entry %s(%d@%d): %s "</span><span class="plain">,</span>
|
|
<span class="plain">(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain">)?</span><span class="string">"(to be deleted) "</span><span class="plain">:</span><span class="string">""</span><span class="plain">,</span>
|
|
<span class="identifier">c</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">,</span>
|
|
<span class="plain">(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain">==1)?</span><span class="string">"+"</span><span class="plain">:</span><span class="string">"-"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">)</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">-</span><span class="element">>present_name</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">)</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W"</span><span class="plain">, </span><span class="identifier">Nouns::nominative</span><span class="plain">(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">-</span><span class="element">>name</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NULL"</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">" [%d: %W]"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">" [in: %W]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::log_briefly</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<null-anl>"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NOT[ "</span><span class="plain">);</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">a</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">a</span><span class="plain">; </span><span class="identifier">a</span><span class="plain"> = </span><span class="identifier">a</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"not-"</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W / "</span><span class="plain">, </span><span class="identifier">Nouns::nominative</span><span class="plain">(</span><span class="identifier">a</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">-</span><span class="element">>name</span><span class="plain">));</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ANY / "</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"not-"</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%W / "</span><span class="plain">, </span><span class="identifier">a</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">-</span><span class="element">>present_name</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" ]"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::get_singleton_action</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Supposed singleton ANL is empty"</span><span class="plain">);</span>
|
|
<span class="identifier">an</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Singleton ANL points to null AN"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">an</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl_being_parsed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::anl_new is used in <a href="#SP3_1">§3.1</a>, <a href="#SP4_2">§4.2</a>, <a href="#SP6_1">§6.1</a>, <a href="#SP6_2">§6.2</a>, <a href="#SP9">§9</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::log is used in 1/im (<a href="1-im.html#SP4">§4</a>, <a href="1-im.html#SP4_4">§4.4</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::log_briefly is used in 4/ap (<a href="4-ap.html#SP5">§5</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::get_singleton_action is used in 4/ap (<a href="4-ap.html#SP29">§29</a>, <a href="4-ap.html#SP33">§33</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The following handles action name lists, such as:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>doing something other than waiting</p>
|
|
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>taking or dropping the box</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">At this stage in parsing, we are identifying possible actions, and
|
|
what their possible operands are, but we aren't trying to parse those
|
|
operands.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ::=</span>
|
|
<span class="identifier">doing</span><span class="plain"> </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> </span><span class="identifier">other</span><span class="plain"> </span><span class="identifier">than</span><span class="plain"> <</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">> | ==> </span><span class="identifier">FALSE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">doing</span><span class="plain"> </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> </span><span class="identifier">except</span><span class="plain"> <</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">> | ==> </span><span class="identifier">FALSE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">doing</span><span class="plain"> </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">/</span><span class="identifier">with</span><span class="plain"> <</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">to</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">doing</span><span class="plain"> </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> | ==> </span><<span class="cwebmacro">Construct ANL for anything</span> <span class="cwebmacronumber">3.1</span>>
|
|
<span class="identifier">doing</span><span class="plain"> </span><span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> ... | ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">> ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">> </span><span class="identifier">to</span><span class="plain">/</span><span class="identifier">with</span><span class="plain"> {<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">minimal</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">>} | ==> </span><<span class="cwebmacro">Add to-clause to excluded ANL</span> <span class="cwebmacronumber">3.2</span>><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">> ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::flip_anl_parity</span><span class="plain">(</span><span class="identifier">RP</span><span class="plain">[1], </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">minimal</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> ::=</span>
|
|
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">or</span><span class="plain"> ... | ==> </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span><span class="plain">;</span>
|
|
<span class="plain">... </span><span class="identifier">to</span><span class="plain">/</span><span class="identifier">with</span><span class="plain"> ... | ==> </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span><span class="plain">;</span>
|
|
<span class="plain">... ==> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_1"></a><b>§3.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Construct ANL for anything</span> <span class="cwebmacronumber">3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">();</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>The trickiest form is:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>doing something to the box in the dining room</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where no explicit action occurs at all, but we have to parse the rest of
|
|
the text as if it does, including an "in" clause.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">So the following finds the first "in" within its range of words, except that
|
|
it throws out an "in" that we consider bogus for our own syntactic purposes:
|
|
for instance, we don't want to count the "in" from "fixed in place".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">to</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> <</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><<span class="cwebmacro">Augment ANL with in clause</span> <span class="cwebmacronumber">4.1</span>>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ==> </span><<span class="cwebmacro">Construct ANL for anything applied</span> <span class="cwebmacronumber">4.2</span>>
|
|
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="identifier">fixed</span><span class="plain"> </span><span class="identifier">in</span><span class="plain"> </span><span class="identifier">place</span><span class="plain"> *** | ==> </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span><span class="plain"> + </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1]) - </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain">/</span><span class="identifier">was</span><span class="plain">/</span><span class="identifier">were</span><span class="plain">/</span><span class="identifier">been</span><span class="plain">/</span><span class="identifier">listed</span><span class="plain"> </span><span class="identifier">in</span><span class="plain"> *** | ==> </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span><span class="plain"> + </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1]) - </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">in</span><span class="plain"> ... ==> </span><span class="identifier">TRUE</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1"></a><b>§4.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Augment ANL with in clause</span> <span class="cwebmacronumber">4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">anl</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">>, 1);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_2"></a><b>§4.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Construct ANL for anything applied</span> <span class="cwebmacronumber">4.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((!</span><span class="identifier">preform_lookahead_mode</span><span class="plain">) && (</span><span class="identifier">anl_being_parsed</span><span class="plain">)) </span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="identifier">anl_being_parsed</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">new_anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">();</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">] = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">++;</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>Now for the basic list of actions being included:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">> <</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><<span class="cwebmacro">Join parsed ANLs</span> <span class="cwebmacronumber">5.1</span>>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="plain">, </span><span class="identifier">_or</span><span class="plain"> <</span><span class="identifier">anl</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">or</span><span class="plain"> <</span><span class="identifier">anl</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Which reduces us to an internal nonterminal for an entry in this list.
|
|
It actually produces multiple matches: for example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>taking inventory</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">will result in a list of two possibilities — "taking inventory", the
|
|
action, with no operand; and "taking", the action, applied to the
|
|
operand "inventory". (It's unlikely that the last will succeed in the
|
|
end, but it's syntactically valid.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">named</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">> | ==> </span><<span class="cwebmacro">Make an action pattern from named behaviour</span> <span class="cwebmacronumber">6.1</span>>
|
|
<span class="plain"><</span><span class="identifier">named</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">> <</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><<span class="cwebmacro">Make an action pattern from named behaviour plus in</span> <span class="cwebmacronumber">6.2</span>>
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">named</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">named_action_pattern</span><span class="plain"> *</span><span class="identifier">nap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::Named::by_name</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nap</span><span class="plain">) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">nap</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_parse_internal</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Make an action pattern from named behaviour</span> <span class="cwebmacronumber">6.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">();</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_2"></a><b>§6.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Make an action pattern from named behaviour plus in</span> <span class="cwebmacronumber">6.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">();</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">>, 1);</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3_2"></a><b>§3.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Add to-clause to excluded ANL</span> <span class="cwebmacronumber">3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::flip_anl_parity</span><span class="plain">(</span><span class="identifier">RP</span><span class="plain">[1], </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">PL::Actions::can_have_parameters</span><span class="plain">(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">anl</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">] = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">>, 1);</span>
|
|
<span class="identifier">anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">++;</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Join parsed ANLs</span> <span class="cwebmacronumber">5.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">left_atom</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">right_tail</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">left_atom</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">right_tail</span><span class="plain">; }</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">right_tail</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">left_atom</span><span class="plain">; }</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="identifier">right_tail</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">left_atom</span><span class="plain">;</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">right_tail</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::flip_anl_parity</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">flip_all</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">flip_all</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">L</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> = (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == 1)?(-1):1;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain"> = (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain">)?</span><span class="identifier">FALSE</span><span class="plain">:</span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">anl</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::flip_anl_parity is used in <a href="#SP3">§3</a>, <a href="#SP3_2">§3.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">anl_parsing_tense</span><span class="plain"> = </span><span class="identifier">IS_TENSE</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::parse</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tense</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::mismatched_brackets</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">anl_parsing_tense</span><span class="plain">;</span>
|
|
<span class="identifier">anl_parsing_tense</span><span class="plain"> = </span><span class="identifier">tense</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">anl_parsing_tense</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">r</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::parse is used in 4/ap (<a href="4-ap.html#SP23">§23</a>, <a href="4-ap.html#SP26_3">§26.3</a>, <a href="4-ap.html#SP26_4">§26.4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::anl_parse_internal</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Parsing ANL from %W (tense %d)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">anl_parsing_tense</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tense</span><span class="plain"> = </span><span class="identifier">anl_parsing_tense</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl_list</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">new_anl</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">();</span>
|
|
<span class="identifier">anl_list</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x_ended</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">fc</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">it_optional</span><span class="plain"> = </span><span class="functiontext">PL::Actions::it_optional</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">abbreviable</span><span class="plain"> = </span><span class="functiontext">PL::Actions::abbreviable</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="functiontext">PL::Actions::set_text_to_name_tensed</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">);</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> = </span><span class="identifier">an</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> = 1;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w_m</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">), </span><span class="identifier">x_m</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">w_m</span><span class="plain"> <= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) && (</span><span class="identifier">x_m</span><span class="plain"> <= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">x_m</span><span class="plain">++) != </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">w_m</span><span class="plain">++)) {</span>
|
|
<span class="identifier">fc</span><span class="plain">=1; </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">DontInclude</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x_m</span><span class="plain"> > </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">)) { </span><span class="identifier">x_ended</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">>(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">x_m</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w_m</span><span class="plain"> > </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">x_ended</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = -1, </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=(</span><span class="identifier">it_optional</span><span class="plain">)?(</span><span class="identifier">w_m</span><span class="plain">):(</span><span class="identifier">w_m</span><span class="plain">+1); </span><span class="identifier">k</span><span class="plain"><=</span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">); </span><span class="identifier">k</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">) == </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">x_m</span><span class="plain">+1)) { </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"><0) { </span><span class="identifier">fc</span><span class="plain">=2; </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">DontInclude</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">-1 >= </span><span class="identifier">w_m</span><span class="plain">) {</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">] = </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">w_m</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1);</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">++;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">] = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">w_m</span><span class="plain"> = </span><span class="identifier">j</span><span class="plain">; </span><span class="identifier">x_m</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x_ended</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">w_m</span><span class="plain"> > </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) && (</span><span class="identifier">x_ended</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">abbreviable</span><span class="plain">) </span><span class="identifier">x_ended</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">fc</span><span class="plain">=3; </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">DontInclude</span><span class="plain">; }</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x_m</span><span class="plain"> <= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">)) </span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>abbreviation_level</span><span class="plain"> = </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">)-</span><span class="identifier">x_m</span><span class="plain">+1;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inc</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">w_m</span><span class="plain"> > </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">inc</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">>(</span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">w_m</span><span class="plain">))) {</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">>, 1);</span>
|
|
<span class="identifier">inc</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::can_have_parameters</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">)) {</span>
|
|
<span class="identifier">anl_being_parsed</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">to</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">>(</span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">w_m</span><span class="plain">))) {</span>
|
|
<span class="identifier">inc</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">anl_being_parsed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inc</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl_list</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">anl_list</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">anl_list</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">pos</span><span class="plain">) && (</span><span class="identifier">pos</span><span class="plain">-</span><span class="element">>abbreviation_level</span><span class="plain"> < </span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>abbreviation_level</span><span class="plain">))</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev</span><span class="plain">) </span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">anl_list</span><span class="plain"> = </span><span class="identifier">new_anl</span><span class="plain">;</span>
|
|
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::anl_new</span><span class="plain">();</span>
|
|
<span class="identifier">DontInclude</span><span class="plain">: ;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Parsing ANL from %W resulted in:\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">anl_list</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">anl_list</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scanning_anl_only_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::extract_actions_only</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="identifier">scanning_anl_only_mode</span><span class="plain">;</span>
|
|
<span class="identifier">scanning_anl_only_mode</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s2</span><span class="plain"> = </span><span class="identifier">permit_trying_omission</span><span class="plain">;</span>
|
|
<span class="identifier">permit_trying_omission</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::list</span><span class="plain">(<<</span><span class="identifier">rp</span><span class="plain">>>);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="identifier">anl</span><span class="plain">-</span><span class="element">>anyone_specified</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>> == </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">) </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>anyone_specified</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">scanning_anl_only_mode</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
|
|
<span class="identifier">permit_trying_omission</span><span class="plain"> = </span><span class="identifier">s2</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">anl</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Lists::get_single_action</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">posn</span><span class="plain"> = -1, </span><span class="identifier">matchl</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">anf</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">, </span><span class="string">"Getting single action from:\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_stem_length</span><span class="plain">(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) - </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>abbreviation_level</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> != </span><span class="identifier">posn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">posn</span><span class="plain"> >= 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">posn</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">;</span>
|
|
<span class="identifier">anf</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">;</span>
|
|
<span class="identifier">matchl</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> > </span><span class="identifier">matchl</span><span class="plain">) {</span>
|
|
<span class="identifier">matchl</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="identifier">anf</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">, </span><span class="string">"Posn %d AN $l\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">posn</span><span class="plain">, </span><span class="identifier">anf</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">anf</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::get_explicit_anyone_flag</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>anyone_specified</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::negated</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::compile</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"CANL: $L"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">optimise</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">)</span>
|
|
<span class="identifier">optimise</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">optimise</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"action %s"</span><span class="plain">, (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain">==1)?</span><span class="string">"=="</span><span class="plain">:</span><span class="string">"~="</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%n"</span><span class="plain">, </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" or "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(~~"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(%n())"</span><span class="plain">, </span><span class="functiontext">PL::Actions::Patterns::Named::identifier</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">));</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"action == %n"</span><span class="plain">, </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" || "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::emit</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"CANL: $L"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">C</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">++;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) { </span><span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::opcode</span><span class="plain">(</span><span class="identifier">NOT_BIP</span><span class="plain">)); </span><span class="identifier">Emit::down</span><span class="plain">(); }</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = 0, </span><span class="identifier">downs</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> != </span><span class="identifier">L</span><span class="plain">-</span><span class="element">>parity</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"mixed parity"</span><span class="plain">);</span>
|
|
<span class="identifier">N</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> < </span><span class="identifier">C</span><span class="plain">) { </span><span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::opcode</span><span class="plain">(</span><span class="identifier">OR_BIP</span><span class="plain">)); </span><span class="identifier">Emit::down</span><span class="plain">(); </span><span class="identifier">downs</span><span class="plain">++; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">) {</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::opcode</span><span class="plain">(</span><span class="identifier">INDIRECT0_BIP</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">PL::Actions::Patterns::Named::identifier</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::opcode</span><span class="plain">(</span><span class="identifier">EQ_BIP</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::down</span><span class="plain">();</span>
|
|
<span class="identifier">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTION_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::val_iname</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">downs</span><span class="plain"> > 0) { </span><span class="identifier">Emit::up</span><span class="plain">(); </span><span class="identifier">downs</span><span class="plain">--; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="identifier">Emit::up</span><span class="plain">();</span>
|
|
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::anl_parse_internal is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::extract_actions_only appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::get_single_action is used in 4/ap (<a href="4-ap.html#SP26_3">§26.3</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::get_explicit_anyone_flag appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::negated is used in 4/ap (<a href="4-ap.html#SP34_1">§34.1</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::compile appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::emit is used in 4/ap (<a href="4-ap.html#SP34_1_1_1">§34.1.1.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Specificity of ANLs. </b>The following is one of NI's standardised comparison routines, which
|
|
takes a pair of objects A, B and returns 1 if A makes a more specific
|
|
description than B, 0 if they seem equally specific, or -1 if B makes a
|
|
more specific description than A. This is transitive, and intended to be
|
|
used in sorting algorithms.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::compare_specificity</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl1</span><span class="plain">, </span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl2</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">count1</span><span class="plain">, </span><span class="identifier">count2</span><span class="plain">;</span>
|
|
<span class="identifier">count1</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::count_actions_covered</span><span class="plain">(</span><span class="identifier">anl1</span><span class="plain">);</span>
|
|
<span class="identifier">count2</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::count_actions_covered</span><span class="plain">(</span><span class="identifier">anl2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count1</span><span class="plain"> < </span><span class="identifier">count2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count1</span><span class="plain"> > </span><span class="identifier">count2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::compare_specificity is used in 4/ap (<a href="4-ap.html#SP27">§27</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>Where:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::count_actions_covered</span><span class="plain">(</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">infinity</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">action_name</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">infinity</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain">) </span><span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=0; </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1) </span><span class="identifier">parity</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) && (</span><span class="identifier">k</span><span class="plain"> < </span><span class="identifier">infinity</span><span class="plain">)) </span><span class="identifier">k</span><span class="plain">++;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = </span><span class="identifier">infinity</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parity</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">k</span><span class="plain"> = </span><span class="identifier">infinity</span><span class="plain">-</span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Lists::count_actions_covered is used in <a href="#SP10">§10</a>.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="4-act.html">Back to 'Actions'</a></li><li><a href="4-ap.html">Continue with 'Action Patterns'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</body>
|
|
</html>
|
|
|