1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/4-anl.html
2020-03-22 10:50:19 +00:00

748 lines
105 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 name="viewport" content="width=device-width initial-scale=1">
<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>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler</b></a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '4/anl' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</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">&#167;1. Definitions</a></li><li><a href="#SP10">&#167;10. Specificity of ANLs</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;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>&#167;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">&gt;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">&gt;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">&gt;parc</span><span class="plain"> = 0;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;word_position</span><span class="plain"> = -1;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;parity</span><span class="plain"> = 1;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;abbreviation_level</span><span class="plain"> = 0;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;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">&gt;word_position</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;action_listed</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;nap_listed</span><span class="plain">-</span><span class="element">&gt;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">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">"&lt;null-anl&gt;"</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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;nap_listed</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;action_listed</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&#167;3.1</a>, <a href="#SP4_2">&#167;4.2</a>, <a href="#SP6_1">&#167;6.1</a>, <a href="#SP6_2">&#167;6.2</a>, <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function PL::Actions::Lists::log is used in 1/im (<a href="1-im.html#SP4">&#167;4</a>, <a href="1-im.html#SP4_4">&#167;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">&#167;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">&#167;29</a>, <a href="4-ap.html#SP33">&#167;33</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;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">&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; ::=</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"> &lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">&gt; | ==&gt; </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"> &lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">&gt; | ==&gt; </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"> &lt;</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">&gt; | ==&gt; </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"> | ==&gt; </span>&lt;<span class="cwebmacro">Construct ANL for anything</span> <span class="cwebmacronumber">3.1</span>&gt;
<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"> ... | ==&gt; </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">&lt;</span><span class="identifier">anl</span><span class="plain">&gt; ==&gt; </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">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">&gt; </span><span class="identifier">to</span><span class="plain">/</span><span class="identifier">with</span><span class="plain"> {&lt;</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">&gt;} | ==&gt; </span>&lt;<span class="cwebmacro">Add to-clause to excluded ANL</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">&gt; ==&gt; </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">&lt;</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">&gt; ::=</span>
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">or</span><span class="plain"> ... | ==&gt; </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"> ... | ==&gt; </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">... ==&gt; </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Construct ANL for anything</span> <span class="cwebmacronumber">3.1</span>&gt; =
</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">&gt;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">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;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">&lt;</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">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">&gt; &lt;</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">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Augment ANL with in clause</span> <span class="cwebmacronumber">4.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">&gt; ::=</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Construct ANL for anything applied</span> <span class="cwebmacronumber">4.2</span>&gt;
<span class="plain">&lt;</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">&gt; ::=</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"> *** | ==&gt; </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"> *** | ==&gt; </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"> ... ==&gt; </span><span class="identifier">TRUE</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4_1"></a><b>&#167;4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Augment ANL with in clause</span> <span class="cwebmacronumber">4.1</span>&gt; =
</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">&gt;in_clause</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</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">&gt;, 1);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_2"></a><b>&#167;4.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Construct ANL for anything applied</span> <span class="cwebmacronumber">4.2</span>&gt; =
</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">) &amp;&amp; (</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">&gt;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">&gt;parameter</span><span class="plain">[</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Now for the basic list of actions being included:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; &lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Join parsed ANLs</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
<span class="plain">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">&gt; ::=</span>
<span class="plain">, </span><span class="identifier">_or</span><span class="plain"> &lt;</span><span class="identifier">anl</span><span class="plain">&gt; | ==&gt; 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"> &lt;</span><span class="identifier">anl</span><span class="plain">&gt; ==&gt; 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>&#167;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 &mdash; "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">&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</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">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Make an action pattern from named behaviour</span> <span class="cwebmacronumber">6.1</span>&gt;
<span class="plain">&lt;</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">&gt; &lt;</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">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Make an action pattern from named behaviour plus in</span> <span class="cwebmacronumber">6.2</span>&gt;
<span class="plain">&lt;</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">&gt; ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
<span class="plain">&lt;</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">&gt; </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">&lt;</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">&gt; </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>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make an action pattern from named behaviour</span> <span class="cwebmacronumber">6.1</span>&gt; =
</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">&gt;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">&gt;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">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make an action pattern from named behaviour plus in</span> <span class="cwebmacronumber">6.2</span>&gt; =
</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">&gt;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">&gt;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">&gt;in_clause</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</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">&gt;, 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">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add to-clause to excluded ANL</span> <span class="cwebmacronumber">3.2</span>&gt; =
</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">&gt;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">&gt;parameter</span><span class="plain">[</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;parc</span><span class="plain">] = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">anl</span><span class="plain">-</span><span class="identifier">excluded</span><span class="plain">&gt;, 1);</span>
<span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;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">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Join parsed ANLs</span> <span class="cwebmacronumber">5.1</span>&gt; =
</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">&gt;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">&gt;next</span><span class="plain">;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;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">&gt;next</span><span class="plain">) {</span>
<span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;parity</span><span class="plain"> = (</span><span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;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">&gt;negate_pattern</span><span class="plain"> = (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;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">&#167;3</a>, <a href="#SP3_2">&#167;3.2</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;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"> = &lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt;(</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"> &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</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">&#167;23</a>, <a href="4-ap.html#SP26_3">&#167;26.3</a>, <a href="4-ap.html#SP26_4">&#167;26.4</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;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">&gt;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">&gt;parc</span><span class="plain"> = 0;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;parity</span><span class="plain"> = 1;</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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"> &lt;= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">x_m</span><span class="plain"> &lt;= </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"> &gt; </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"> (&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">&gt;(</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"> &gt; </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">&lt;=</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">&lt;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 &gt;= </span><span class="identifier">w_m</span><span class="plain">) {</span>
<span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;parameter</span><span class="plain">[</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;parameter</span><span class="plain">[</span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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"> &gt; </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) &amp;&amp; (</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"> &lt;= </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">&gt;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"> &gt; </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"> (&lt;</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">&gt;(</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">&gt;in_clause</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</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">&gt;, 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"> (&lt;</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">&gt;(</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">&gt;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">) &amp;&amp; (</span><span class="identifier">pos</span><span class="plain">-</span><span class="element">&gt;abbreviation_level</span><span class="plain"> &lt; </span><span class="identifier">new_anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;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"> (&lt;</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">&gt;(</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">(&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;);</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">&gt;anyone_specified</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">) </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;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">&gt;action_listed</span><span class="plain">) - </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">&gt;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">&gt;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"> &gt;= 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">&gt;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">&gt;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"> &gt; </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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;parity</span><span class="plain"> == -1) { </span><span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">NOT_BIP</span><span class="plain">); </span><span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</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">&gt;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">&gt;parity</span><span class="plain"> != </span><span class="identifier">L</span><span class="plain">-</span><span class="element">&gt;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"> &lt; </span><span class="identifier">C</span><span class="plain">) { </span><span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">OR_BIP</span><span class="plain">); </span><span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</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">&gt;nap_listed</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">INDIRECT0_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</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">&gt;nap_listed</span><span class="plain">));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</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">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</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">&gt;action_listed</span><span class="plain">));</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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"> &gt; 0) { </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">&gt;parity</span><span class="plain"> == -1) </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">&#167;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">&#167;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">&#167;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">&#167;34.1.1.1</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;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"> &lt; </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"> &gt; </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">&#167;27</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;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">&gt;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">&gt;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">&gt;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">&gt;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">&gt;action_listed</span><span class="plain">) &amp;&amp; (</span><span class="identifier">k</span><span class="plain"> &lt; </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">&#167;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-->
</main>
</body>
</html>