1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-30 22:14:58 +03:00

Updated phrase options

This commit is contained in:
Graham Nelson 2021-03-29 09:18:07 +01:00
parent 7b2df20585
commit 1ff736a2a0
58 changed files with 1669 additions and 1686 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6R64 'Krypton' (28 March 2021)
v10.1.0-alpha.1+6R65 'Krypton' (29 March 2021)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 28 March 2021
Build Number: 6R64
Build Date: 29 March 2021
Build Number: 6R65

View file

@ -163,7 +163,7 @@ OP match the following:
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">use_option</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure use_option is accessed in 3/dbtr, 3/rpr, 4/ass, 5/tpf, 6/tc, 6/tbl, 6/eqt and here.</li></ul>
<ul class="endnotetexts"><li>The structure use_option is accessed in 3/dbtr, 3/rpr, 4/ass, 5/tpf, 5/po, 6/tc, 6/tbl, 6/eqt and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>&#167;3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Create a new use option</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
</p>

View file

@ -185,7 +185,7 @@ container (called the sack) is capacious if...".
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-idf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresscurrent">adf</li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-tpf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-idf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresscurrent">adf</li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-tpf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -276,7 +276,6 @@ Inform 7 source text written underneath the heading.
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">id_type_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">type_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">id_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">options_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">id_runtime_context_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">id_compilation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
@ -286,14 +285,13 @@ Inform 7 source text written underneath the heading.
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Creating body: &lt;%W&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">log_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_body</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::Options::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::Context::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax"> = </span><a href="5-ptd.html#SP2" class="function-link"><span class="function-syntax">IDTypeData::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IDCompilation::new_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure id_body is accessed in 5/idf, 5/adf, 5/tpf, 5/ptd, 5/rf, 6/eqt and here.</li></ul>
<ul class="endnotetexts"><li>The structure id_body is accessed in 5/idf, 5/adf, 5/tpf, 5/ptd, 5/po, 5/rf, 6/eqt and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>Definition bodies can be written in two different ways. In one way, the
body is a list of instructions to follow. For example:
</p>
@ -442,7 +440,7 @@ Inter kit instead.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-imp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresscurrent">id</li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-idf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-imp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresscurrent">id</li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-idf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -294,7 +294,7 @@ go into the Phrasebook page of the index.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-id.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresscurrent">idf</li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-adf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-id.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresscurrent">idf</li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-adf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -41,10 +41,10 @@ function togglePopup(material_id) {
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="index.html"><span class="selectedlink">assertions</span></a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="index.html"><span class="selectedlink">imperative</span></a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
@ -70,92 +70,21 @@ function togglePopup(material_id) {
<main role="main">
<!--Weave of 'Phrase Options' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#3">Chapter 3: Phrases</a></li><li><b>Phrase Options</b></li></ul></div>
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">assertions</a></li><li><a href="index.html#5">Chapter 5: Imperative Code</a></li><li><b>Phrase Options</b></li></ul></div>
<p class="purpose">To create and subsequently parse against the list of phrase options with which the user can choose to invoke a To phrase.</p>
<ul class="toc"><li><a href="3-po.html#SP3">&#167;3. Creation</a></li><li><a href="3-po.html#SP4">&#167;4. Parsing</a></li><li><a href="3-po.html#SP5">&#167;5. Parsing phrase options in a declaration</a></li><li><a href="3-po.html#SP8">&#167;8. Parsing phrase options in an invocation</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-po.html#SP1">&#167;1. Introduction</a></li><li><a href="5-po.html#SP2">&#167;2. Creation</a></li><li><a href="5-po.html#SP4">&#167;4. Parsing</a></li><li><a href="5-po.html#SP6">&#167;6. Parsing phrase options in a declaration</a></li><li><a href="5-po.html#SP8">&#167;8. Parsing phrase options in an invocation</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>A "phrase option" is a sort of modifier tacked on to the instruction to
do something, changing how it works but not enough to merit an entirely new
phrase. It's like an argument passed to a routine which specifies optional
behaviour, and indeed that will be how it is compiled.
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>A "phrase option" is a sort of modifier tacked on to an invocation of a
phrase; the only modifiers allowed are those declared in that phrase's
preamble. Phrase pptions are an early feature of Inform 7 going back to a
time when its priority was to enable the paraphrasing of Inform 6 library
features (such as the bitmap passed as a parameter to the list-printer).
</p>
<p class="commentary">Like the token names, phrase option names have local scope (which is why
they are here and not in the excerpts database). Unlike them, they are not
valid as values, since a condition is not also a value in Inform 7.
</p>
<p class="commentary">The packet of these associated with a phrase is stored in the PHOD structure.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_OPTIONS_PER_PHRASE</span><span class="plain-syntax"> </span><span class="constant-syntax">16</span><span class="plain-syntax"> </span><span class="comment-syntax"> because held in a 16-bit Z-machine bitmap</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax"> *</span><span class="identifier-syntax">options_permitted</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_OPTIONS_PER_PHRASE</span><span class="plain-syntax">]; </span><span class="comment-syntax"> see below</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_options_permitted</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">options_declaration</span><span class="plain-syntax">; </span><span class="comment-syntax"> the text declaring the whole set of options</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiple_options_permitted</span><span class="plain-syntax">; </span><span class="comment-syntax"> can be combined, or mutually exclusive?</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure id_options_data is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>There's nothing to a phrase option, really:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of name</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure phrase_option is accessed in 2/rls, 2/fao, 2/act, 4/sv, 6/cii, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Creation. </b>By default, a phrase has no options.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">multiple_options_permitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">options_declaration</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::allows_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Parsing. </b>This isn't very efficient, but doesn't need to be, since phrase options
are parsed only in a condition context, not in a value context, and
these are relatively rare in Inform source text.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::parse</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Phrases::Options::parse</span></span>:<br/><a href="3-po.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_permitted</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (1 &lt;&lt; </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Parsing phrase options in a declaration. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::parse_declared_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_declaration</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;phrase-option-declaration-list&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">) </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">multiple_options_permitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>I have to say that I regret the syntax for phrase options, which makes
us write commas like the one here:
<p class="commentary">I now sligjtly regret the existence of phrase options, but above all the
comma-based syntax used for them, as here. Brackets would have been better;
it makes phrase options impossible to use for text substitutions.
</p>
<blockquote>
@ -168,74 +97,153 @@ But it's mostly the comma which annoys me (making text substitutions unable
to support phrase options); I should have gone for brackets.
</p>
<p class="commentary">The syntax for declaring phrase options is uncontroversial &mdash; it's just
a list of names &mdash; but there are wrinkles: if the list is divided with "or"
then the options are mutually exclusive, but with "and/or" they're not.
For example, in:
<p class="commentary">The <a href="5-po.html#SP1" class="internal">id_options_data</a> for an imperative definition, which is part of its
type data, says what options it allows:
</p>
<blockquote>
<p>To decide which object is best route from (R1 - object) to (R2 - object), using doors or using even locked doors: ...</p>
</blockquote>
<p class="commentary">the following parses this list:
</p>
<blockquote>
<p>using doors or using even locked doors</p>
</blockquote>
<p class="commentary">and creates two options with &lt;phrase-option-declaration-setting-entry&gt;.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;phrase-option-declaration-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 2 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FALSE, - }</span>
<span class="Preform-function-syntax">&lt;phrase-option-declaration-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\and/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\and/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-declaration-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
<span class="Preform-function-syntax">&lt;phrase-option-declaration-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-po.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Add a phrase option</span><span class="named-paragraph-number">6.1</span></a></span><span class="Preform-constant-syntax">;</span>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_OPTIONS_PER_PHRASE</span><span class="plain-syntax"> </span><span class="constant-syntax">16</span><span class="plain-syntax"> </span><span class="comment-syntax"> because held in a 16-bit Z-machine bitmap</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1" class="paragraph-anchor"></a><b>&#167;6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add a phrase option</span><span class="named-paragraph-number">6.1</span></span><span class="Preform-comment-syntax"> =</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax"> *</span><span class="identifier-syntax">options_permitted</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_OPTIONS_PER_PHRASE</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_options_permitted</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">options_declaration</span><span class="plain-syntax">; </span><span class="comment-syntax"> the text declaring the whole set of options</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiple_options_permitted</span><span class="plain-syntax">; </span><span class="comment-syntax"> can be combined, or mutually exclusive?</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of name</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure id_options_data is private to this section.</li><li>The structure phrase_option is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 5/tpf, 6/tc, 6/tbl, 6/eqt and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Creation. </b>By default, a phrase has no options.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="3-po.html#SP7" class="function-link"><span class="function-syntax">Phrases::Options::phod_add_phrase_option</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, - };</span>
<span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::new</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">PhraseOptions::new</span></span>:<br/>Phrase Type Data - <a href="5-ptd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">multiple_options_permitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">.</span><span class="element-syntax">options_declaration</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::allows_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-po.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">too_many_POs_error</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::phod_add_phrase_option</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Phrases::Options::phod_add_phrase_option</span></span>:<br/><a href="3-po.html#SP6_1">&#167;6.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">PM_TooManyPhraseOptions_issued</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::phod_add_phrase_option</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">PhraseOptions::phod_add_phrase_option</span></span>:<br/><a href="5-po.html#SP7_1">&#167;7.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PHRASE_CREATIONS</span><span class="plain-syntax">, </span><span class="string-syntax">"Adding phrase option &lt;%W&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_OPTIONS_PER_PHRASE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">too_many_POs_error</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_TooManyPhraseOptions</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PM_TooManyPhraseOptions_issued</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_TooManyPhraseOptions</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a phrase is only allowed to have 16 different options"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so either some of these will need to go, or you may want to "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"consider breaking up the phrase into simpler ones whose usage "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"is easier to describe."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">too_many_POs_error</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so either some of these will need to go, or you may want to consider "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"breaking up the phrase into simpler ones whose usage is easier to describe."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PM_TooManyPhraseOptions_issued</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">too_many_POs_error</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> so that the problem can recur on later phrases</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PM_TooManyPhraseOptions_issued</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> so the problem can recur on later phrases</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax"> *</span><span class="identifier-syntax">po</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">phrase_option</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">po</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_permitted</span><span class="plain-syntax">[</span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">po</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Parsing. </b>This isn't very efficient, but doesn't need to be, since phrase options are parsed
only in a condition context, not in a value context, and these are relatively
rare in Inform source text.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::parse_phod</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">PhraseOptions::parse_phod</span></span>:<br/><a href="5-po.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_permitted</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (1 &lt;&lt; </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::parse</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-po.html#SP4" class="function-link"><span class="function-syntax">PhraseOptions::parse_phod</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Which we wrap up thus:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;phrase-option&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">int</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">bitmap</span><span class="Preform-plain-syntax"> = </span><a href="5-po.html#SP4" class="function-link"><span class="Preform-function-syntax">PhraseOptions::parse_phod</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">phod_being_parsed</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">bitmap</span><span class="Preform-plain-syntax"> == -1) { ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> }; }</span>
<span class="Preform-plain-syntax"> ==&gt; { </span><span class="Preform-identifier-syntax">bitmap</span><span class="Preform-plain-syntax">, - };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Parsing phrase options in a declaration. </b>The following is called with <span class="extract"><span class="Preform-extract-syntax">W</span></span> set to just the part of a phrase prototype
containing its phrase options. In this example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">To</span><span class="plain-syntax"> </span><span class="identifier-syntax">decide</span><span class="plain-syntax"> </span><span class="identifier-syntax">which</span><span class="plain-syntax"> </span><span class="identifier-syntax">object</span><span class="plain-syntax"> </span><span class="identifier-syntax">is</span><span class="plain-syntax"> </span><span class="identifier-syntax">best</span><span class="plain-syntax"> </span><span class="identifier-syntax">route</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R1</span><span class="plain-syntax"> - </span><span class="identifier-syntax">object</span><span class="plain-syntax">) </span><span class="identifier-syntax">to</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R2</span><span class="plain-syntax"> - </span><span class="identifier-syntax">object</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">using</span><span class="plain-syntax"> </span><span class="identifier-syntax">doors</span><span class="plain-syntax"> </span><span class="identifier-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">using</span><span class="plain-syntax"> </span><span class="identifier-syntax">even</span><span class="plain-syntax"> </span><span class="identifier-syntax">locked</span><span class="plain-syntax"> </span><span class="identifier-syntax">doors</span><span class="plain-syntax">:</span>
</pre>
<p class="commentary"><span class="extract"><span class="extract-syntax">W</span></span> would be "using doors or using even locked doors".
</p>
<p class="commentary">The syntax is just a list of names, but with the wrinkle that if the list is divided
with "or" then the options are mutually exclusive, but with "and/or" they're not.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::parse_declared_options</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">PhraseOptions::parse_declared_options</span></span>:<br/>Parsing Type Data - <a href="5-ptd2.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phod</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_declaration</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phod</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;phrase-option-decl-list&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">) </span><span class="identifier-syntax">phod</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">multiple_options_permitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Note the following Preform grammar passes the return value <span class="extract"><span class="extract-syntax">TRUE</span></span> up from
the final element of the list when the connective used for it was "and/or".
Note also the rare use of the Preform literal marker in <span class="extract"><span class="extract-syntax">\and/or</span></span> to show
that the slash between "and" and "or" is part of the word.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;phrase-option-decl-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 2 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { FALSE, - }</span>
<span class="Preform-function-syntax">&lt;phrase-option-decl-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\and/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">\and/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-decl-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, - }</span>
<span class="Preform-function-syntax">&lt;phrase-option-decl-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-po.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Add a phrase option</span><span class="named-paragraph-number">7.1</span></a></span><span class="Preform-constant-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add a phrase option</span><span class="named-paragraph-number">7.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="5-po.html#SP3" class="function-link"><span class="function-syntax">PhraseOptions::phod_add_phrase_option</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, - };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-po.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Parsing phrase options in an invocation. </b>At this point, we're looking at the text after the first comma in something
like:
</p>
@ -264,18 +272,18 @@ produce.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed_silently</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> context for the grammar below</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Options::parse_invoked_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">silently</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="6-inv.html#SP19" class="function-link"><span class="function-syntax">Invocations::get_phrase_options</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PhraseOptions::parse_invoked_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">silently</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Invocations::get_phrase_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">idb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">.</span><span class="element-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bitmap</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">problem_count</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-po.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Parse the supplied list of options into a bitmap</span><span class="named-paragraph-number">8.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-po.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Parse the supplied list of options into a bitmap</span><span class="named-paragraph-number">8.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="6-inv.html#SP20" class="function-link"><span class="function-syntax">Invocations::set_phrase_options_bitmap</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">bitmap</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Invocations::set_phrase_options_bitmap</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="identifier-syntax">bitmap</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">pc</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -291,11 +299,11 @@ produce.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">problem_count</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pc</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">multiple_options_permitted</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-po.html#SP8_1_1" class="named-paragraph-link"><span class="named-paragraph">Reject this if multiple options are set</span><span class="named-paragraph-number">8.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-po.html#SP8_1_1" class="named-paragraph-link"><span class="named-paragraph">Reject this if multiple options are set</span><span class="named-paragraph-number">8.1.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-po.html#SP8">&#167;8</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="5-po.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_1_1" class="paragraph-anchor"></a><b>&#167;8.1.1. </b>Ah, bit-twiddling: fun for all the family. There's no point computing the
Hamming distance of the bitmap, that is, the number of bits set: we only need
population count of the bitmap, that is, the number of bits set: we only need
to know if it's a power of 2 or not. Note that subtracting 1, in binary,
clears the least significant set bit, leaves the higher bits as they are,
and changes the lower bits (which were previously all 0s) to 1s. So taking
@ -314,7 +322,8 @@ this residue is zero.
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_phrase</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_declaration</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_PhraseOptionsExclusive</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_PhraseOptionsExclusive</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, supplying the options '%2' to the phrase '%3', but "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the options listed for this phrase ('%4') are mutually exclusive."</span><span class="plain-syntax">);</span>
@ -323,24 +332,24 @@ this residue is zero.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-po.html#SP8_1">&#167;8.1</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="5-po.html#SP8_1">&#167;8.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>When setting options, in an actual use of a phrase, the list is divided
by "and":
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;phrase-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { R[1] | R[2], - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-function-syntax">&lt;phrase-option-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_and</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/and</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_and</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/and</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-function-syntax">&lt;phrase-option-setting-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-po.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_NotAPhraseOption or C22NotTheOnlyPhraseOption problem</span><span class="named-paragraph-number">9.1</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;phrase-option&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { pass 1 }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-po.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_NotAPhraseOption or C22NotTheOnlyPhraseOption problem</span><span class="named-paragraph-number">9.1</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>&#167;9.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_NotAPhraseOption or C22NotTheOnlyPhraseOption problem</span><span class="named-paragraph-number">9.1</span></span><span class="Preform-comment-syntax"> =</span>
@ -353,13 +362,15 @@ by "and":
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_phrase</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_declaration</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_options_permitted</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NotAPhraseOption</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NotAPhraseOption</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but '%2' is not one of the options allowed on "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the end of the phrase '%3'. (The options allowed are: '%4'.)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NotTheOnlyPhraseOption</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_NotTheOnlyPhraseOption</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but the only option allowed on the end of the "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"phrase '%3' is '%4', so '%2' is not something I know how to "</span>
@ -368,21 +379,9 @@ by "and":
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-po.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>The following matches any single phrase option for the phrase being used.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;phrase-option&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">int</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">bitmap</span><span class="Preform-plain-syntax"> = </span><a href="3-po.html#SP4" class="function-link"><span class="Preform-function-syntax">Phrases::Options::parse</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">phod_being_parsed</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">bitmap</span><span class="Preform-plain-syntax"> == -1) { ==&gt; { </span><span class="Preform-identifier-syntax">fail</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">nonterminal</span><span class="Preform-plain-syntax"> }; }</span>
<span class="Preform-plain-syntax"> ==&gt; { </span><span class="Preform-identifier-syntax">bitmap</span><span class="Preform-plain-syntax">, - };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="5-po.html#SP9">&#167;9</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-prcd.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-itp.html">itp</a></li><li class="progresssection"><a href="3-prcd.html">prcd</a></li><li class="progresscurrent">po</li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="4-lv.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-ptd2.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresscurrent">po</li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-rf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -121,13 +121,15 @@ parts in brackets.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">manner_of_return</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_MOR</span></span><span class="comment-syntax"> values</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">return_kind</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> except in the </span><span class="extract"><span class="extract-syntax">DECIDES_VALUE_MOR</span></span><span class="comment-syntax"> case</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">id_options_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">options_data</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">say_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_say</span><span class="plain-syntax">; </span><span class="comment-syntax"> used only for "say" phrases, that is, text substitutions</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inline_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_inline</span><span class="plain-syntax">; </span><span class="comment-syntax"> side effects for phrases like C keywords</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">now_deprecated</span><span class="plain-syntax">; </span><span class="comment-syntax"> is this a phrase likely to be withdrawn in future?</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">id_type_data</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure id_type_data is accessed in 5/ptd2 and here.</li></ul>
<ul class="endnotetexts"><li>The structure id_type_data is accessed in 5/ptd2, 5/po and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">
@ -141,6 +143,7 @@ parts in brackets.
<span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">.</span><span class="element-syntax">as_say</span><span class="plain-syntax"> = </span><a href="5-ptd.html#SP19" class="function-link"><span class="function-syntax">IDTypeData::new_say_details</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">.</span><span class="element-syntax">as_inline</span><span class="plain-syntax"> = </span><a href="5-ptd.html#SP20" class="function-link"><span class="function-syntax">IDTypeData::new_inline_details</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">.</span><span class="element-syntax">now_deprecated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">.</span><span class="element-syntax">options_data</span><span class="plain-syntax"> = </span><a href="5-po.html#SP2" class="function-link"><span class="function-syntax">PhraseOptions::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -1102,7 +1105,7 @@ match is shown.
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-tpf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresscurrent">ptd</li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-ptd2.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-tpf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresscurrent">ptd</li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-ptd2.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -94,7 +94,7 @@ adjusted for an inline definition (if that's the kind of definition this is).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParsingIDTypeData::parse</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">ParsingIDTypeData::parse</span></span>:<br/>To Phrase Family - <a href="5-tpf.html#SP7">&#167;7</a>, <a href="5-tpf.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OW</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParsingIDTypeData::parse</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">ParsingIDTypeData::parse</span></span>:<br/>To Phrase Family - <a href="5-tpf.html#SP7">&#167;7</a>, <a href="5-tpf.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">id_type_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">say_flag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> is this going to be a "say" phrase?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">XW</span><span class="plain-syntax">))</span>
@ -104,6 +104,7 @@ adjusted for an inline definition (if that's the kind of definition this is).
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">XW</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><a href="5-ptd2.html#SP6" class="function-link"><span class="function-syntax">ParsingIDTypeData::phtd_parse_doodads</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">say_flag</span><span class="plain-syntax">); </span><span class="comment-syntax"> and doodads from the back</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">; </span><span class="comment-syntax"> the options wording</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cw</span><span class="plain-syntax"> = -1; </span><span class="comment-syntax"> word number of first comma</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ptd2.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Find the first comma outside of parentheses, if any exists</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cw</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
@ -111,12 +112,13 @@ adjusted for an inline definition (if that's the kind of definition this is).
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-ptd2.html#SP1_2" class="named-paragraph-link"><span class="named-paragraph">Does this comma presage phrase options?</span><span class="named-paragraph-number">1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">comma_presages_options</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">say_flag</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-ptd2.html#SP1_3" class="named-paragraph-link"><span class="named-paragraph">Issue a problem: say phrases aren't allowed options</span><span class="named-paragraph-number">1.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::from</span><span class="plain-syntax">(</span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">cw</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::from</span><span class="plain-syntax">(</span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">cw</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::up_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="identifier-syntax">cw</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">); </span><span class="comment-syntax"> trim the preamble range to to the text before the comma</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">registration_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">XW</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-ptd2.html#SP9" class="function-link"><span class="function-syntax">ParsingIDTypeData::phtd_main_prototype</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-po.html#SP6" class="function-link"><span class="function-syntax">PhraseOptions::parse_declared_options</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP1_1" class="paragraph-anchor"></a><b>&#167;1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Find the first comma outside of parentheses, if any exists</span><span class="named-paragraph-number">1.1</span></span><span class="comment-syntax"> =</span>
@ -895,7 +897,7 @@ the hyphen, and this is sorely needed with complicated functional kinds.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-ptd.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresscurrent">ptd2</li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-rf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-ptd.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresscurrent">ptd2</li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-po.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1023,7 +1023,7 @@ any order would have done just as well.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-ptd2.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresscurrent">rf</li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="6-tc.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-po.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresssection"><a href="5-tpf.html">tpf</a></li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresscurrent">rf</li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="6-tc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -73,7 +73,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">assertions</a></li><li><a href="index.html#5">Chapter 5: Imperative Code</a></li><li><b>To Phrase Family</b></li></ul></div>
<p class="purpose">Imperative definitions of "To..." phrases.</p>
<ul class="toc"><li><a href="5-tpf.html#SP1">&#167;1. Introduction</a></li><li><a href="5-tpf.html#SP3">&#167;3. Identification</a></li><li><a href="5-tpf.html#SP5">&#167;5. Assessment</a></li><li><a href="5-tpf.html#SP10">&#167;10. Compilation</a></li><li><a href="5-tpf.html#SP11">&#167;11. Access functions</a></li><li><a href="5-tpf.html#SP17">&#167;17. To begin</a></li><li><a href="5-tpf.html#SP18">&#167;18. Phrase option parsing</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="5-tpf.html#SP1">&#167;1. Introduction</a></li><li><a href="5-tpf.html#SP3">&#167;3. Identification</a></li><li><a href="5-tpf.html#SP5">&#167;5. Assessment</a></li><li><a href="5-tpf.html#SP10">&#167;10. Compilation</a></li><li><a href="5-tpf.html#SP11">&#167;11. Access functions</a></li><li><a href="5-tpf.html#SP17">&#167;17. To begin</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>This family handles definitions of "To..." phrases: Inform's equivalent of
function definitions. For example:
@ -291,10 +291,8 @@ within rulebooks. That's a similar issue, but addressed differently elsewhere.
<span class="plain-syntax"> </span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::prepare_for_requests</span><span class="plain-syntax">(</span><span class="identifier-syntax">body</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::get_prototype_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-ptd2.html#SP1" class="function-link"><span class="function-syntax">ParsingIDTypeData::parse</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::Options::parse_declared_options</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-ptd2.html#SP1" class="function-link"><span class="function-syntax">ParsingIDTypeData::parse</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">id</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">body_of_defn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><a href="5-tpf.html#SP11" class="function-link"><span class="function-syntax">ToPhraseFamily::get_prototype_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">previous_id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">imperative_defn</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first_in_logical_order</span><span class="plain-syntax">;</span>
@ -581,7 +579,7 @@ own right, a functional-programming sort of device. For example:
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">constant_phrase</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure constant_phrase is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 6/tc, 6/tbl, 6/eqt and here.</li></ul>
<ul class="endnotetexts"><li>The structure constant_phrase is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 5/po, 6/tc, 6/tbl, 6/eqt and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>Here we create a new named phrase ("doubling", say):
</p>
@ -624,9 +622,8 @@ the following takes a patch-it-later approach.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cphr</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">global_pass_state</span><span class="plain-syntax">.</span><span class="element-syntax">pass</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Kinds::binary_con</span><span class="plain-syntax">(</span><span class="identifier-syntax">CON_phrase</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cphr_kind</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">OW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_type_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">idtd</span><span class="plain-syntax"> = </span><a href="5-ptd.html#SP2" class="function-link"><span class="function-syntax">IDTypeData::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="5-ptd2.html#SP1" class="function-link"><span class="function-syntax">ParsingIDTypeData::parse</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">associated_preamble_text</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-ptd2.html#SP1" class="function-link"><span class="function-syntax">ParsingIDTypeData::parse</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">associated_preamble_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cphr_kind</span><span class="plain-syntax"> = </span><a href="5-ptd.html#SP12" class="function-link"><span class="function-syntax">IDTypeData::kind</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">idtd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">cphr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cphr_kind</span><span class="plain-syntax">;</span>
@ -686,21 +683,8 @@ the following takes a patch-it-later approach.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">beginner</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Phrase option parsing. </b>These indirections are provided so that the implementation of phrase options
is confined to the current Chapter.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::allows_options</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::Options::allows_options</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ToPhraseFamily::parse_phrase_option_used</span><span class="plain-syntax">(</span><span class="reserved-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Phrases::Options::parse</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_data</span><span class="plain-syntax">), </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-adf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresscurrent">tpf</li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-ptd.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="5-adf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-bv.html">2</a></li><li class="progresschapter"><a href="3-dlr.html">3</a></li><li class="progresschapter"><a href="4-nr.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-id.html">id</a></li><li class="progresssection"><a href="5-idf.html">idf</a></li><li class="progresssection"><a href="5-adf.html">adf</a></li><li class="progresscurrent">tpf</li><li class="progresssection"><a href="5-ptd.html">ptd</a></li><li class="progresssection"><a href="5-ptd2.html">ptd2</a></li><li class="progresssection"><a href="5-po.html">po</a></li><li class="progresssection"><a href="5-rf.html">rf</a></li><li class="progresschapter"><a href="6-tc.html">6</a></li><li class="progresschapter"><a href="7-kpr.html">7</a></li><li class="progressnext"><a href="5-ptd.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -135,7 +135,7 @@ instance has its own <span class="extract"><span class="extract-syntax">equation
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">equation_symbol</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure equation_symbol is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/id, 5/adf, 5/tpf, 6/tc, 6/tbl, 7/tcp, 7/cu and here.</li></ul>
<ul class="endnotetexts"><li>The structure equation_symbol is accessed in 2/ptmn, 2/cs, 2/ps, 2/is, 3/dlr, 3/pr, 3/tr, 3/nuor, 3/uor, 3/tr2, 3/dbtr, 3/rpr, 3/nar, 3/nlpr, 3/nrr, 3/npr, 3/nvr, 3/nar2, 4/rpt, 4/tc, 4/ass, 4/npa, 4/rk, 4/ass2, 4/imp, 5/id, 5/adf, 5/tpf, 5/po, 6/tc, 6/tbl, 7/tcp, 7/cu and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>In addition, there are some standing symbols used by all equations: the
constant "pi", for example. They're stored in this linked list:
</p>

View file

@ -115,7 +115,7 @@ in both tables.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">table_column</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure table_column is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 5/tpf, 6/tbl, 6/eqt and here.</li></ul>
<ul class="endnotetexts"><li>The structure table_column is accessed in 3/nuor, 3/dbtr, 3/rpr, 4/ass, 5/tpf, 5/po, 6/tbl, 6/eqt and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The predicate calculus engine often finds conditions equivalent to "if A
is a C listed in T", and we implement this as a binary predicate &mdash; see
<a href="7-lr.html" class="internal">Listed-In Relations</a>. There is one such relation for each column, and

View file

@ -285,6 +285,11 @@
<spon class="sectiontitle">Parsing Type Data</span></a> -
<span class="sectionpurpose">To parse the prototype text of a To... phrase into its type data.</span></p>
</li>
<li>
<p class="sectionentry"><a href="5-po.html">
<spon class="sectiontitle">Phrase Options</span></a> -
<span class="sectionpurpose">To create and subsequently parse against the list of phrase options with which the user can choose to invoke a To phrase.</span></p>
</li>
<li>
<p class="sectionentry"><a href="5-rf.html">
<spon class="sectiontitle">Rule Family</span></a> -

View file

@ -118,8 +118,8 @@ description of an action which may have happened in the past: for example,
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">RULE_PLACEMENT_NOTIFY_PLUG</span><span class="plain-syntax">, </span><a href="4-act.html#SP6" class="function-link"><span class="function-syntax">Actions::rule_placement_notify</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRODUCTION_LINE_PLUG</span><span class="plain-syntax">, </span><a href="4-ap.html#SP1" class="function-link"><span class="function-syntax">ActionsPlugin::production_line</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPLETE_MODEL_PLUG</span><span class="plain-syntax">, </span><a href="4-ap.html#SP6" class="function-link"><span class="function-syntax">ActionsPlugin::complete_model</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPILE_TEST_HEAD_PLUG</span><span class="plain-syntax">, </span><span class="identifier-syntax">Phrases::Context::actions_compile_test_head</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPILE_TEST_TAIL_PLUG</span><span class="plain-syntax">, </span><span class="identifier-syntax">Phrases::Context::actions_compile_test_tail</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPILE_TEST_HEAD_PLUG</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTRules::actions_compile_test_head</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PluginManager::plug</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMPILE_TEST_TAIL_PLUG</span><span class="plain-syntax">, </span><span class="identifier-syntax">RTRules::actions_compile_test_tail</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Vocabulary::set_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">Vocabulary::entry_for_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="string-syntax">"doing"</span><span class="plain-syntax">), </span><span class="identifier-syntax">ACTION_PARTICIPLE_MC</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Vocabulary::set_flags</span><span class="plain-syntax">(</span><span class="identifier-syntax">Vocabulary::entry_for_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="string-syntax">"asking"</span><span class="plain-syntax">), </span><span class="identifier-syntax">ACTION_PARTICIPLE_MC</span><span class="plain-syntax">);</span>

View file

@ -92,7 +92,7 @@ and a shared set of variables, so this will not be a long section of code.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">activity</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure activity is accessed in 2/rls, 2/rlb, 2/fao, 3/prcd, 3/po, 4/sv, 6/cii, 6/cp, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure activity is accessed in 2/rls, 2/rlb, 2/fao, 3/prcd, 4/sv, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Whereas rulebooks can turn values into other values, activities are more like
void functions: they work on a value, but produce nothing.
</p>

View file

@ -170,7 +170,7 @@ structures <a href="2-fao.html#SP3" class="internal">rulebook_outcome</a> and <a
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">named_rulebook_outcome</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure named_rulebook_outcome is accessed in 2/rls, 2/act, 3/po, 4/sv, 6/cii, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure named_rulebook_outcome is accessed in 2/rls, 2/act, 4/sv, 6/cii, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>That awkward distinction between a <a href="2-fao.html#SP3" class="internal">rulebook_outcome</a> and a <a href="2-fao.html#SP4" class="internal">named_rulebook_outcome</a>
brings us edge cases if a rule has been written for use in one rulebook, but then
has been explicitly listed in another, or is more than one rulebook.

View file

@ -255,7 +255,7 @@ being analogous to a function \(X\to Y\).
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-fao.html#SP7" class="function-link"><span class="function-syntax">FocusAndOutcome::get_outcome_kind</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_outcomes</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_outcomes</span></span>:<br/>Focus and Outcome - <a href="2-fao.html#SP5">&#167;5</a>, <a href="2-fao.html#SP6">&#167;6</a><br/>Phrase Runtime Context Data - <a href="3-prcd.html#SP9_1">&#167;9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="function-syntax">Rulebooks::get_outcomes</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Rulebooks::get_outcomes</span></span>:<br/>Focus and Outcome - <a href="2-fao.html#SP5">&#167;5</a>, <a href="2-fao.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">B</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">my_outcomes</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -124,7 +124,7 @@ different dynamics altogether. In short, then: rules are not phrases.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">rule</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure rule is accessed in 2/rlb, 2/fao, 2/act, 3/prcd, 3/po, 4/sv, 6/cii, 6/cp, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure rule is accessed in 2/rlb, 2/fao, 2/act, 3/prcd, 4/sv, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>Rules are created before their definitions can be parsed or compiled. A
typical rule like so:
</p>

View file

@ -228,7 +228,7 @@ significant timing difficulties.
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-act.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">itp</li><li class="progresssection"><a href="3-prcd.html">prcd</a></li><li class="progresssection"><a href="3-po.html">po</a></li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="3-prcd.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-act.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">itp</li><li class="progresssection"><a href="3-prcd.html">prcd</a></li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="3-prcd.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -87,7 +87,7 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">imperative</a></li><li><a href="index.html#3">Chapter 3: Phrases</a></li><li><b>Phrase Runtime Context Data</b></li></ul></div>
<p class="purpose">To store the circumstances in which a rule phrase should fire.</p>
<ul class="toc"><li><a href="3-prcd.html#SP3">&#167;3. Access</a></li><li><a href="3-prcd.html#SP7">&#167;7. Specificity of phrase runtime contexts</a></li><li><a href="3-prcd.html#SP8">&#167;8. Activity list on demand</a></li><li><a href="3-prcd.html#SP9">&#167;9. Compiling the firing test</a></li><li><a href="3-prcd.html#SP9_2">&#167;9.2. Scene test</a></li><li><a href="3-prcd.html#SP9_4">&#167;9.4. Action test</a></li><li><a href="3-prcd.html#SP9_7">&#167;9.7. Actor-is-player test</a></li><li><a href="3-prcd.html#SP9_9">&#167;9.9. Activity-or-condition test</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="3-prcd.html#SP3">&#167;3. Access</a></li><li><a href="3-prcd.html#SP7">&#167;7. Specificity of phrase runtime contexts</a></li><li><a href="3-prcd.html#SP8">&#167;8. Activity list on demand</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>Runtime context data is the context in which a phrase is allowed to run,
though it's only used for rules. For example,
@ -393,8 +393,8 @@ all of them fail to decide, we return 0.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">AL1W</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">AL2W</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">AL1W</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">AL2W</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">AL1W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n1</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP10" class="function-link"><span class="function-syntax">Phrases::Context::count_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n2</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP10" class="function-link"><span class="function-syntax">Phrases::Context::count_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n1</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP9" class="function-link"><span class="function-syntax">Phrases::Context::count_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n2</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP9" class="function-link"><span class="function-syntax">Phrases::Context::count_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n1</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">n2</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n2</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">n1</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax"> }</span>
@ -452,262 +452,13 @@ process.
<span class="plain-syntax"> </span><a href="4-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::make_current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-sf.html#SP10" class="function-link"><span class="function-syntax">Frames::set_stvol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">variables_visible_in_definition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP14" class="function-link"><span class="function-syntax">Phrases::Context::parse_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_context</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax"> = </span><a href="3-prcd.html#SP13" class="function-link"><span class="function-syntax">Phrases::Context::parse_avl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_context</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_cs</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Compiling the firing test. </b>Each rule compiles to a routine, and this routine is called whenever the
opportunity might exist for the rule to fire. The structure of this is
similar to:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> [ </span><span class="identifier-syntax">Rule</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">some</span><span class="plain-syntax">-</span><span class="identifier-syntax">firing</span><span class="plain-syntax">-</span><span class="identifier-syntax">condition</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> ...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">some</span><span class="plain-syntax">-</span><span class="reserved-syntax">default</span><span class="plain-syntax">-</span><span class="identifier-syntax">outcome</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> ];</span>
</pre>
<p class="commentary">The "test head" is the "if" line here, and the "test tail" is the "}". The
return statement isn't necessarily reached, because even if the firing
condition holds, the "..." code may decide to return in some other way.
It provides only a default to cover rules which don't specify an outcome.
</p>
<p class="commentary">In general the test is more elaborate than a single "if", though not very
much.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::compile_test_head</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Phrases::Context::compile_test_head</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IDCompilation::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">RTRules::compile_constraint</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tests</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginCalls::compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">tests</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_4" class="named-paragraph-link"><span class="named-paragraph">Compile an action test head</span><span class="named-paragraph-number">9.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_context</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_9" class="named-paragraph-link"><span class="named-paragraph">Compile an activity or explicit condition test head</span><span class="named-paragraph-number">9.9</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">tests</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">compile_with_run_time_debugging</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">DEBUG_RULES_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">DB_RULE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::actions_compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tests</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">during_scene</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Compile a scene test head</span><span class="named-paragraph-number">9.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_5" class="named-paragraph-link"><span class="named-paragraph">Compile possibly testing actor action test head</span><span class="named-paragraph-number">9.5</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">always_test_actor</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_7" class="named-paragraph-link"><span class="named-paragraph">Compile an actor-is-player test head</span><span class="named-paragraph-number">9.7</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::actions_compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IDCompilation::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_6" class="named-paragraph-link"><span class="named-paragraph">Compile an action test tail</span><span class="named-paragraph-number">9.6</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">always_test_actor</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_8" class="named-paragraph-link"><span class="named-paragraph">Compile an actor-is-player test tail</span><span class="named-paragraph-number">9.8</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">during_scene</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_3" class="named-paragraph-link"><span class="named-paragraph">Compile a scene test tail</span><span class="named-paragraph-number">9.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>&#167;9.1. </b>This is almost the up-down reflection of the head, but note that it begins
with the default outcome return (see above).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::compile_test_tail</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Phrases::Context::compile_test_tail</span></span>:<br/>Compile Phrases - <a href="6-cp.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="reserved-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IDCompilation::iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) </span><span class="identifier-syntax">RTRules::compile_default_outcome</span><span class="plain-syntax">(</span><a href="2-rlb.html#SP2_2" class="function-link"><span class="function-syntax">Rulebooks::get_outcomes</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_context</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_1_1" class="named-paragraph-link"><span class="named-paragraph">Compile an activity or explicit condition test tail</span><span class="named-paragraph-number">9.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginCalls::compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_6" class="named-paragraph-link"><span class="named-paragraph">Compile an action test tail</span><span class="named-paragraph-number">9.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>&#167;9.2. Scene test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a scene test head</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTScenes::emit_during_clause</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">during_scene</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">tests</span><span class="plain-syntax">)++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_3" class="paragraph-anchor"></a><b>&#167;9.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a scene test tail</span><span class="named-paragraph-number">9.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">9.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_4" class="paragraph-anchor"></a><b>&#167;9.4. Action test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an action test head</span><span class="named-paragraph-number">9.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTActionPatterns::emit_pattern_match</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tests</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ActionPatterns::involves_actions</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SELF_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">NOUN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_5" class="paragraph-anchor"></a><b>&#167;9.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile possibly testing actor action test head</span><span class="named-paragraph-number">9.5</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">never_test_actor</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTActionPatterns::emit_pattern_match</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTActionPatterns::emit_pattern_match</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">tests</span><span class="plain-syntax">)++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ActionPatterns::involves_actions</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ap</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">SELF_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">NOUN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_6" class="paragraph-anchor"></a><b>&#167;9.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an action test tail</span><span class="named-paragraph-number">9.6</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">9.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>, <a href="3-prcd.html#SP9_1">&#167;9.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_7" class="paragraph-anchor"></a><b>&#167;9.7. Actor-is-player test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an actor-is-player test head</span><span class="named-paragraph-number">9.7</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">ACTOR_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">PLAYER_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">tests</span><span class="plain-syntax">)++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_8" class="paragraph-anchor"></a><b>&#167;9.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an actor-is-player test tail</span><span class="named-paragraph-number">9.8</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">3</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">9.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_9" class="paragraph-anchor"></a><b>&#167;9.9. Activity-or-condition test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an activity or explicit condition test head</span><span class="named-paragraph-number">9.9</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">avl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">avl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">avl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTActivities::emit_activity_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">avl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BadWhenWhile</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I don't understand the 'when/while' clause"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which should name activities or conditions."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IXActivities::annotate_list_for_cross_references</span><span class="plain-syntax">(</span><span class="identifier-syntax">avl</span><span class="plain-syntax">, </span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tests</span><span class="plain-syntax">++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_1_1" class="paragraph-anchor"></a><b>&#167;9.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an activity or explicit condition test tail</span><span class="named-paragraph-number">9.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP9_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">9.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9_1">&#167;9.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_3_1" class="paragraph-anchor"></a><b>&#167;9.3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a generic test fail</span><span class="named-paragraph-number">9.3.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">GT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">DEBUG_RULES_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">DB_RULE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP9_3">&#167;9.3</a>, <a href="3-prcd.html#SP9_6">&#167;9.6</a>, <a href="3-prcd.html#SP9_8">&#167;9.8</a>, <a href="3-prcd.html#SP9_1_1">&#167;9.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b></p>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> {</span>
@ -718,7 +469,7 @@ with the default outcome return (see above).
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax">; </span><span class="comment-syntax"> next in activity list</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::count_avl</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Phrases::Context::count_avl</span></span>:<br/><a href="3-prcd.html#SP7_4">&#167;7.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">avl</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Phrases::Context::count_avl</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Phrases::Context::count_avl</span></span>:<br/><a href="3-prcd.html#SP7_4">&#167;7.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">avl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">avl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> += </span><span class="constant-syntax">10</span><span class="plain-syntax">;</span>
@ -729,7 +480,7 @@ with the default outcome return (see above).
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure activity_list is accessed in 2/rlb, 2/act, 4/lv, 4/sv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>Run-time contexts are seen in the "while" clauses at the end of rules.
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Run-time contexts are seen in the "while" clauses at the end of rules.
For example:
</p>
@ -753,12 +504,12 @@ it mentions no activities.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;run-time-context&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">not</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-list-unnegated&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }; </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_2" class="named-paragraph-link"><span class="named-paragraph">Flip the activity list parities</span><span class="named-paragraph-number">11.2</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">not</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-list-unnegated&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }; </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Flip the activity list parities</span><span class="named-paragraph-number">10.2</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-list-unnegated&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }</span>
<span class="Preform-function-syntax">&lt;activity-list-unnegated&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { lookahead }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_3" class="named-paragraph-link"><span class="named-paragraph">Join the activity lists</span><span class="named-paragraph-number">11.3</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_3" class="named-paragraph-link"><span class="named-paragraph">Join the activity lists</span><span class="named-paragraph-number">10.3</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }</span>
<span class="Preform-function-syntax">&lt;activity-tail&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
@ -766,14 +517,14 @@ it mentions no activities.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/or</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;run-time-context&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }</span>
<span class="Preform-function-syntax">&lt;activity-list-entry&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_4" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL without operand</span><span class="named-paragraph-number">11.4</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">of/for</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-operand&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_5" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with operand</span><span class="named-paragraph-number">11.5</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-operand&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_5" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with operand</span><span class="named-paragraph-number">11.5</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">^&lt;if-parsing-al-conditions&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_6" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with unparsed text</span><span class="named-paragraph-number">11.6</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;if-parsing-al-conditions&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;s-condition&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_7" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with condition</span><span class="named-paragraph-number">11.7</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_4" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL without operand</span><span class="named-paragraph-number">10.4</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">of/for</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-operand&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_5" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with operand</span><span class="named-paragraph-number">10.5</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-name&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;activity-operand&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_5" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with operand</span><span class="named-paragraph-number">10.5</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">^&lt;if-parsing-al-conditions&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_6" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with unparsed text</span><span class="named-paragraph-number">10.6</span></a></span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;if-parsing-al-conditions&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;s-condition&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_7" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL with condition</span><span class="named-paragraph-number">10.7</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_1" class="paragraph-anchor"></a><b>&#167;11.1. </b>The optional operand handles "something" itself in productions (a) and (b)
<p class="commentary firstcommentary"><a id="SP10_1" class="paragraph-anchor"></a><b>&#167;10.1. </b>The optional operand handles "something" itself in productions (a) and (b)
in order to prevent it from being read as a description at production (c). This
prevents "something" from being read as "some thing", that is, it prevents
Inform from thinking that the operand value must have kind "thing".
@ -790,7 +541,7 @@ values, of the kind to which the activity applies.
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;s-type-expression-or-value&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { TRUE, RP[1] }</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_2" class="paragraph-anchor"></a><b>&#167;11.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Flip the activity list parities</span><span class="named-paragraph-number">11.2</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP10_2" class="paragraph-anchor"></a><b>&#167;10.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Flip the activity list parities</span><span class="named-paragraph-number">10.2</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -799,8 +550,8 @@ values, of the kind to which the activity applies.
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ACL_parity</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ACL_parity</span><span class="plain-syntax">)?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_3" class="paragraph-anchor"></a><b>&#167;11.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Join the activity lists</span><span class="named-paragraph-number">11.3</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_3" class="paragraph-anchor"></a><b>&#167;10.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Join the activity lists</span><span class="named-paragraph-number">10.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -808,17 +559,17 @@ values, of the kind to which the activity applies.
<span class="plain-syntax"> </span><span class="identifier-syntax">al1</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">al2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ==&gt; { -, </span><span class="identifier-syntax">al1</span><span class="plain-syntax"> };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_4" class="paragraph-anchor"></a><b>&#167;11.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL without operand</span><span class="named-paragraph-number">11.4</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_4" class="paragraph-anchor"></a><b>&#167;10.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL without operand</span><span class="named-paragraph-number">10.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">al</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">11.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">10.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RP</span><span class="plain-syntax">[1];</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_5" class="paragraph-anchor"></a><b>&#167;11.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL with operand</span><span class="named-paragraph-number">11.5</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_5" class="paragraph-anchor"></a><b>&#167;10.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL with operand</span><span class="named-paragraph-number">10.5</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -827,33 +578,33 @@ values, of the kind to which the activity applies.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">R</span><span class="plain-syntax">[2]) &amp;&amp; (</span><span class="identifier-syntax">Dash::validate_parameter</span><span class="plain-syntax">(</span><span class="identifier-syntax">RP</span><span class="plain-syntax">[2], </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity_on_what_kind</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">al</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">11.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">10.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">an</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">acting_on</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RP</span><span class="plain-syntax">[2];</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11">&#167;11</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP11_6" class="paragraph-anchor"></a><b>&#167;11.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL with unparsed text</span><span class="named-paragraph-number">11.6</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10">&#167;10</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP10_6" class="paragraph-anchor"></a><b>&#167;10.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL with unparsed text</span><span class="named-paragraph-number">10.6</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cond</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Specifications::new_UNKNOWN</span><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">al</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">11.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">10.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">only_when</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cond</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_7" class="paragraph-anchor"></a><b>&#167;11.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL with condition</span><span class="named-paragraph-number">11.7</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_7" class="paragraph-anchor"></a><b>&#167;10.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL with condition</span><span class="named-paragraph-number">10.7</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cond</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RP</span><span class="plain-syntax">[2];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Dash::validate_conditional_clause</span><span class="plain-syntax">(</span><span class="identifier-syntax">cond</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">al</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP11_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">11.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-prcd.html#SP10_4_1" class="named-paragraph-link"><span class="named-paragraph">Make one-entry AL</span><span class="named-paragraph-number">10.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">only_when</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cond</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_4_1" class="paragraph-anchor"></a><b>&#167;11.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL</span><span class="named-paragraph-number">11.4.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_4_1" class="paragraph-anchor"></a><b>&#167;10.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Make one-entry AL</span><span class="named-paragraph-number">10.4.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -865,13 +616,13 @@ values, of the kind to which the activity applies.
<span class="plain-syntax"> </span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">activity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ==&gt; { -, </span><span class="identifier-syntax">al</span><span class="plain-syntax"> };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP11_4">&#167;11.4</a>, <a href="3-prcd.html#SP11_5">&#167;11.5</a>, <a href="3-prcd.html#SP11_6">&#167;11.6</a>, <a href="3-prcd.html#SP11_7">&#167;11.7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b></p>
<ul class="endnotetexts"><li>This code is used in <a href="3-prcd.html#SP10_4">&#167;10.4</a>, <a href="3-prcd.html#SP10_5">&#167;10.5</a>, <a href="3-prcd.html#SP10_6">&#167;10.6</a>, <a href="3-prcd.html#SP10_7">&#167;10.7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">parsing_al_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>It's convenient not to look too closely at the condition sometimes.
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. </b>It's convenient not to look too closely at the condition sometimes.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -881,11 +632,11 @@ values, of the kind to which the activity applies.
<span class="Preform-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. </b>All of which sets up the context for:
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b>All of which sets up the context for:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Context::parse_avl</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Phrases::Context::parse_avl</span></span>:<br/><a href="3-prcd.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Phrases::Context::parse_avl</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Phrases::Context::parse_avl</span></span>:<br/><a href="3-prcd.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">save_pac</span><span class="plain-syntax"> = </span><span class="identifier-syntax">parsing_al_conditions</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parsing_al_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;run-time-context&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
@ -895,7 +646,7 @@ values, of the kind to which the activity applies.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-itp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-itp.html">itp</a></li><li class="progresscurrent">prcd</li><li class="progresssection"><a href="3-po.html">po</a></li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="3-po.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-itp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-itp.html">itp</a></li><li class="progresscurrent">prcd</li><li class="progresschapter"><a href="4-lv.html">4</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="4-lv.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1368,7 +1368,7 @@ need in the compilation of any given routine:
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-po.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresschapter"><a href="3-itp.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">lv</li><li class="progresssection"><a href="4-sv.html">sv</a></li><li class="progresssection"><a href="4-pb.html">pb</a></li><li class="progresssection"><a href="4-sf.html">sf</a></li><li class="progresssection"><a href="4-chr.html">chr</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="4-sv.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-prcd.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-rls.html">2</a></li><li class="progresschapter"><a href="3-itp.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">lv</li><li class="progresssection"><a href="4-sv.html">sv</a></li><li class="progresssection"><a href="4-pb.html">pb</a></li><li class="progresssection"><a href="4-sf.html">sf</a></li><li class="progresssection"><a href="4-chr.html">chr</a></li><li class="progresschapter"><a href="5-cfs.html">5</a></li><li class="progresschapter"><a href="6-inv.html">6</a></li><li class="progressnext"><a href="4-sv.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -107,7 +107,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 3/po, 6/cii, 6/cste and here.</li><li>The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li><li>The structure stacked_variable_owner is private to this section.</li><li>The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<ul class="endnotetexts"><li>The structure stacked_variable is accessed in 2/rls, 2/fao, 2/act, 6/cii, 6/cste and here.</li><li>The structure stacked_variable_list is accessed in 2/rlb, 2/act, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li><li>The structure stacked_variable_owner is private to this section.</li><li>The structure stacked_variable_owner_list is accessed in 2/rlb, 2/act, 3/prcd, 4/lv, 4/sf, 5/dtd, 5/cdp, 6/inv, 6/pi, 6/cii, 6/cp, 6/cste and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">

View file

@ -364,7 +364,7 @@ charlatans" and what they "deserve". I'm a better person now.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">phod_being_parsed</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb_being_parsed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">idb</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;inline-substitution&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">BRW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_opts</span><span class="plain-syntax"> = </span><a href="6-inv.html#SP20" class="function-link"><span class="function-syntax">Invocations::get_phrase_options_bitmap</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>

View file

@ -159,14 +159,14 @@ should always be supplied for "To..." phrases, but left null for rules.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">code_at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-prcd.html#SP9" class="function-link"><span class="function-syntax">Phrases::Context::compile_test_head</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">RTRules::compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">code_at</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure_from</span><span class="plain-syntax">(</span><span class="identifier-syntax">code_at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-cp.html#SP4" class="function-link"><span class="function-syntax">Routines::Compile::code_block_outer</span></a><span class="plain-syntax">(1, </span><span class="identifier-syntax">code_at</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure_from</span><span class="plain-syntax">(</span><span class="identifier-syntax">code_at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">code_at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="3-prcd.html#SP9_1" class="function-link"><span class="function-syntax">Phrases::Context::compile_test_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RTRules::compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-cp.html#SP2_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a terminal return statement</span><span class="named-paragraph-number">2.3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>

View file

@ -493,7 +493,7 @@ variable-argument phrases like C's <span class="extract"><span class="extract-sy
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::get_phrase_options</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Invocations::get_phrase_options</span></span>:<br/><a href="6-inv.html#SP9">&#167;9</a><br/>Phrase Options - <a href="3-po.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::get_phrase_options</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Invocations::get_phrase_options</span></span>:<br/><a href="6-inv.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">invocation_options</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invo</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_options_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">invo</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">invo</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options_invoked_text</span><span class="plain-syntax">;</span>
@ -510,7 +510,7 @@ When no options are set, the bitmap is always 0.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">invo</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">options</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::set_phrase_options_bitmap</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Invocations::set_phrase_options_bitmap</span></span>:<br/>Phrase Options - <a href="3-po.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">further_bits</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::set_phrase_options_bitmap</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">further_bits</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">further_bits</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">invocation_options</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invo</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_phrase_options_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">invo</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
@ -526,7 +526,7 @@ When no options are set, the bitmap is always 0.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::implies_newline</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Invocations::implies_newline</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP3_2">&#167;3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::implies_newline</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Invocations::implies_newline</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP3_2">&#167;3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!(</span><span class="identifier-syntax">IDTypeData::is_a_say_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_phrase_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">)))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!(</span><span class="identifier-syntax">TEST_COMPILATION_MODE</span><span class="plain-syntax">(</span><span class="constant-syntax">IMPLY_NEWLINES_IN_SAY_CMODE</span><span class="plain-syntax">))) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
@ -548,7 +548,7 @@ When no options are set, the bitmap is always 0.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::length_of_list</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Invocations::length_of_list</span></span>:<br/><a href="6-inv.html#SP25">&#167;25</a>, <a href="6-inv.html#SP29">&#167;29</a>, <a href="6-inv.html#SP30">&#167;30</a><br/>Compile Invocations - <a href="6-ci.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invl</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::length_of_list</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Invocations::length_of_list</span></span>:<br/><a href="6-inv.html#SP25">&#167;25</a>, <a href="6-inv.html#SP29">&#167;29</a>, <a href="6-inv.html#SP30">&#167;30</a><br/>Compile Invocations - <a href="6-ci.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">invl</span><span class="plain-syntax">; </span><span class="identifier-syntax">p</span><span class="plain-syntax">; </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">;</span>
@ -558,7 +558,7 @@ When no options are set, the bitmap is always 0.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Invocations::first_in_list</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Invocations::first_in_list</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP2">&#167;2</a>, <a href="6-ci.html#SP2_1_1_1">&#167;2.1.1.1</a>, <a href="6-ci.html#SP2_2">&#167;2.2</a>, <a href="6-ci.html#SP2_2_3_1_1">&#167;2.2.3.1.1</a><br/>Compile Phrases - <a href="6-cp.html#SP4_2_1">&#167;4.2.1</a>, <a href="6-cp.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invl</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Invocations::first_in_list</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Invocations::first_in_list</span></span>:<br/>Compile Invocations - <a href="6-ci.html#SP2">&#167;2</a>, <a href="6-ci.html#SP2_1_1_1">&#167;2.1.1.1</a>, <a href="6-ci.html#SP2_2">&#167;2.2</a>, <a href="6-ci.html#SP2_2_3_1_1">&#167;2.2.3.1.1</a><br/>Compile Phrases - <a href="6-cp.html#SP4_2_1">&#167;4.2.1</a>, <a href="6-cp.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">invl</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -635,7 +635,7 @@ instability of the sorting algorithm does not produce any ambiguity in how
Inform prioritises phrases.
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::comparison</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">Invocations::comparison</span></span>:<br/><a href="6-inv.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i1</span><span class="plain-syntax">, </span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i2</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::comparison</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Invocations::comparison</span></span>:<br/><a href="6-inv.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i1</span><span class="plain-syntax">, </span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">invocation_sort_block</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv1</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">invocation_sort_block</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">i1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">invocation_sort_block</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv2</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">invocation_sort_block</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">i2</span><span class="plain-syntax">;</span>
@ -686,7 +686,7 @@ in a list:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::log_list</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">Invocations::log_list</span></span>:<br/>Imperative Module - <a href="1-im.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invl</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::log_list</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">Invocations::log_list</span></span>:<br/>Imperative Module - <a href="1-im.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">invl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Invocation list (%d):\n"</span><span class="plain-syntax">, </span><a href="6-inv.html#SP23" class="function-link"><span class="function-syntax">Invocations::length_of_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">invl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>

View file

@ -136,11 +136,6 @@
<spon class="sectiontitle">Phrase Runtime Context Data</span></a> -
<span class="sectionpurpose">To store the circumstances in which a rule phrase should fire.</span></p>
</li>
<li>
<p class="sectionentry"><a href="3-po.html">
<spon class="sectiontitle">Phrase Options</span></a> -
<span class="sectionpurpose">To create and subsequently parse against the list of phrase options with which the user can choose to invoke a To phrase.</span></p>
</li>
</ul>
</li>
<li>

View file

@ -377,7 +377,7 @@ This is the routine which prints those details.
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_OPEN</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-pi.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Present a paste button containing the text of the phrase</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pi.html#SP4" class="function-link"><span class="function-syntax">Phrases::Index::index_type_data</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">idtd</span><span class="plain-syntax">, </span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pi.html#SP6" class="function-link"><span class="function-syntax">Phrases::Index::index_phrase_options</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-pi.html#SP6" class="function-link"><span class="function-syntax">Phrases::Index::index_phrase_options</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-pi.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Quote from and reference to the documentation, where possible</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-pi.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">Present the equation form of the phrase, if it has one</span><span class="named-paragraph-number">5.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-pi.html#SP5_4" class="named-paragraph-link"><span class="named-paragraph">Present the name of the phrase regarded as a value, if it has one</span><span class="named-paragraph-number">5.4</span></a></span><span class="plain-syntax">;</span>

View file

@ -438,7 +438,7 @@ though it can be any type of phrase.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ToPhraseFamily::meaning_as_phrase</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_meaning</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ToPhraseFamily::allows_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PhraseOptions::allows_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">EXCERPT_PARSING</span><span class="plain-syntax">, </span><span class="string-syntax">"Looking for phrase options\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bl</span><span class="plain-syntax">=0, </span><span class="identifier-syntax">scan_pos</span><span class="plain-syntax">=</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)+1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">scan_pos</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">); </span><span class="identifier-syntax">scan_pos</span><span class="plain-syntax">++) {</span>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -12,6 +12,14 @@
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
@ -99,7 +107,7 @@
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">av_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTActivities::emit_activity_list</span><span class="plain-syntax">(</span><span class="identifier-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">al</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTActivities::emit_activity_list</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">RTActivities::emit_activity_list</span></span>:<br/>Rules - <a href="4-rls.html#SP15_9">&#167;15.9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">al</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">negate_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">downs</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">al</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ACL_parity</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">negate_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">negate_me</span><span class="plain-syntax">) { </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">NOT_BIP</span><span class="plain-syntax">); </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">()); </span><span class="identifier-syntax">downs</span><span class="plain-syntax">++; }</span>

View file

@ -133,9 +133,10 @@ code below.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">IDCompilation::prepare_stack_frame</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">body</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-icd.html#SP5" class="function-link"><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">stack_frame</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><a href="4-icd.html#SP5" class="function-link"><span class="function-syntax">IDCompilation::initialise_stack_frame_from_type_data</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">stack_frame</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IDTypeData::kind</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">type_data</span><span class="plain-syntax">)), </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Phrases::Options::allows_options</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">options_data</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PhraseOptions::allows_options</span><span class="plain-syntax">(</span><span class="identifier-syntax">body</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LocalVariables::options_parameter_is_needed</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">body</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">stack_frame</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
@ -242,7 +243,7 @@ variables "new entry" and "L" with those kinds.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">inter_back</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">IDCompilation::iname</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">IDCompilation::iname</span></span>:<br/>Adjectives by Phrase - <a href="3-abp.html#SP1">&#167;1</a><br/>Rules - <a href="4-rls.html#SP2">&#167;2</a><br/>Timed Rules - <a href="5-tr.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">IDCompilation::iname</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">IDCompilation::iname</span></span>:<br/>Adjectives by Phrase - <a href="3-abp.html#SP1">&#167;1</a><br/>Rules - <a href="4-rls.html#SP2">&#167;2</a>, <a href="4-rls.html#SP15">&#167;15</a>, <a href="4-rls.html#SP15_1">&#167;15.1</a><br/>Timed Rules - <a href="5-tr.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ph_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::package</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">owning_module</span><span class="plain-syntax">, </span><span class="constant-syntax">ADJECTIVE_PHRASES_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">ph_iname</span><span class="plain-syntax"> = </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::make_iname_in</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DEFINITION_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">PR</span><span class="plain-syntax">);</span>

View file

@ -73,7 +73,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">runtime</a></li><li><a href="index.html#4">Chapter 4: Compilation Utilities</a></li><li><b>Rules</b></li></ul></div>
<p class="purpose">To compile run-time support for rules.</p>
<ul class="toc"><li><a href="4-rls.html#SP3">&#167;3. Compilation</a></li><li><a href="4-rls.html#SP5">&#167;5. Printing rule names at run time</a></li><li><a href="4-rls.html#SP7">&#167;7. Compilation of I6-format rulebook</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-rls.html#SP3">&#167;3. Compilation</a></li><li><a href="4-rls.html#SP5">&#167;5. Printing rule names at run time</a></li><li><a href="4-rls.html#SP7">&#167;7. Compilation of I6-format rulebook</a></li><li><a href="4-rls.html#SP15">&#167;15. Compiling the firing test</a></li><li><a href="4-rls.html#SP15_2">&#167;15.2. Scene test</a></li><li><a href="4-rls.html#SP15_4">&#167;15.4. Action test</a></li><li><a href="4-rls.html#SP15_7">&#167;15.7. Actor-is-player test</a></li><li><a href="4-rls.html#SP15_9">&#167;15.9. Activity-or-condition test</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b></p>
@ -215,7 +215,7 @@ conditions have not been met.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::compile_constraint</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">RTRules::compile_constraint</span></span>:<br/><a href="4-rls.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::compile_constraint</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">RTRules::compile_constraint</span></span>:<br/><a href="4-rls.html#SP3_1">&#167;3.1</a>, <a href="4-rls.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">applicability_constraint</span><span class="plain-syntax"> *</span><span class="identifier-syntax">acl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">acl</span><span class="plain-syntax">, </span><span class="identifier-syntax">applicability_constraint</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">applicability_constraints</span><span class="plain-syntax">) {</span>
@ -965,7 +965,7 @@ code are the real outcome of the code in this section.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::compile_default_outcome</span><span class="plain-syntax">(</span><span class="identifier-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">outs</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::compile_default_outcome</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">RTRules::compile_default_outcome</span></span>:<br/><a href="4-rls.html#SP15_1">&#167;15.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">outcomes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">outs</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rtrue</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rulebook_outcome</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rbo</span><span class="plain-syntax"> = </span><span class="identifier-syntax">outs</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">default_named_outcome</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rbo</span><span class="plain-syntax">) {</span>
@ -1101,6 +1101,251 @@ code are the real outcome of the code in this section.
<span class="plain-syntax"> </span><a href="4-rtn.html#SP5" class="function-link"><span class="function-syntax">Routines::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Compiling the firing test. </b>Each rule compiles to a routine, and this routine is called whenever the
opportunity might exist for the rule to fire. The structure of this is
similar to:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> [ </span><span class="identifier-syntax">Rule</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">some</span><span class="plain-syntax">-</span><span class="identifier-syntax">firing</span><span class="plain-syntax">-</span><span class="identifier-syntax">condition</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> ...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">some</span><span class="plain-syntax">-</span><span class="reserved-syntax">default</span><span class="plain-syntax">-</span><span class="identifier-syntax">outcome</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> ];</span>
</pre>
<p class="commentary">The "test head" is the "if" line here, and the "test tail" is the "}". The
return statement isn't necessarily reached, because even if the firing
condition holds, the "..." code may decide to return in some other way.
It provides only a default to cover rules which don't specify an outcome.
</p>
<p class="commentary">In general the test is more elaborate than a single "if", though not very
much.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="4-icd.html#SP6" class="function-link"><span class="function-syntax">IDCompilation::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-rls.html#SP4" class="function-link"><span class="function-syntax">RTRules::compile_constraint</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tests</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginCalls::compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">tests</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_4" class="named-paragraph-link"><span class="named-paragraph">Compile an action test head</span><span class="named-paragraph-number">15.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_context</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_9" class="named-paragraph-link"><span class="named-paragraph">Compile an activity or explicit condition test head</span><span class="named-paragraph-number">15.9</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">tests</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">compile_with_run_time_debugging</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DEBUG_RULES_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DB_RULE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::actions_compile_test_head</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tests</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">during_scene</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_2" class="named-paragraph-link"><span class="named-paragraph">Compile a scene test head</span><span class="named-paragraph-number">15.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_5" class="named-paragraph-link"><span class="named-paragraph">Compile possibly testing actor action test head</span><span class="named-paragraph-number">15.5</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">always_test_actor</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_7" class="named-paragraph-link"><span class="named-paragraph">Compile an actor-is-player test head</span><span class="named-paragraph-number">15.7</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::actions_compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="4-icd.html#SP6" class="function-link"><span class="function-syntax">IDCompilation::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_6" class="named-paragraph-link"><span class="named-paragraph">Compile an action test tail</span><span class="named-paragraph-number">15.6</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">always_test_actor</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_8" class="named-paragraph-link"><span class="named-paragraph">Compile an actor-is-player test tail</span><span class="named-paragraph-number">15.8</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">during_scene</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_3" class="named-paragraph-link"><span class="named-paragraph">Compile a scene test tail</span><span class="named-paragraph-number">15.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15_1" class="paragraph-anchor"></a><b>&#167;15.1. </b>This is almost the up-down reflection of the head, but note that it begins
with the default outcome return (see above).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTRules::compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">id_body</span><span class="plain-syntax"> *</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">rule</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="4-icd.html#SP6" class="function-link"><span class="function-syntax">IDCompilation::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">id_runtime_context_data</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">runtime_context_data</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rulebook</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RuleFamily::get_rulebook</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">head_of_defn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">rb</span><span class="plain-syntax">) </span><a href="4-rls.html#SP14" class="function-link"><span class="function-syntax">RTRules::compile_default_outcome</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Rulebooks::get_outcomes</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">activity_context</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_1_1" class="named-paragraph-link"><span class="named-paragraph">Compile an activity or explicit condition test tail</span><span class="named-paragraph-number">15.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PluginCalls::compile_test_tail</span><span class="plain-syntax">(</span><span class="identifier-syntax">idb</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_6" class="named-paragraph-link"><span class="named-paragraph">Compile an action test tail</span><span class="named-paragraph-number">15.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15_2" class="paragraph-anchor"></a><b>&#167;15.2. Scene test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a scene test head</span><span class="named-paragraph-number">15.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="5-scn.html#SP7" class="function-link"><span class="function-syntax">RTScenes::emit_during_clause</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">during_scene</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">tests</span><span class="plain-syntax">)++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_3" class="paragraph-anchor"></a><b>&#167;15.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a scene test tail</span><span class="named-paragraph-number">15.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">15.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_4" class="paragraph-anchor"></a><b>&#167;15.4. Action test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an action test head</span><span class="named-paragraph-number">15.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="5-ap.html#SP5" class="function-link"><span class="function-syntax">RTActionPatterns::emit_pattern_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tests</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ActionPatterns::involves_actions</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SELF_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NOUN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_5" class="paragraph-anchor"></a><b>&#167;15.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile possibly testing actor action test head</span><span class="named-paragraph-number">15.5</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">never_test_actor</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-ap.html#SP5" class="function-link"><span class="function-syntax">RTActionPatterns::emit_pattern_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="5-ap.html#SP5" class="function-link"><span class="function-syntax">RTActionPatterns::emit_pattern_match</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">tests</span><span class="plain-syntax">)++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ActionPatterns::involves_actions</span><span class="plain-syntax">(</span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ap</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SELF_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">NOUN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_6" class="paragraph-anchor"></a><b>&#167;15.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an action test tail</span><span class="named-paragraph-number">15.6</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">15.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>, <a href="4-rls.html#SP15_1">&#167;15.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_7" class="paragraph-anchor"></a><b>&#167;15.7. Actor-is-player test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an actor-is-player test head</span><span class="named-paragraph-number">15.7</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ACTOR_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">PLAYER_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">tests</span><span class="plain-syntax">)++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_8" class="paragraph-anchor"></a><b>&#167;15.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an actor-is-player test tail</span><span class="named-paragraph-number">15.8</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">3</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">15.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_9" class="paragraph-anchor"></a><b>&#167;15.9. Activity-or-condition test. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an activity or explicit condition test head</span><span class="named-paragraph-number">15.9</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IFELSE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">activity_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">avl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phrcd</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">avl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">avl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-act.html#SP2" class="function-link"><span class="function-syntax">RTActivities::emit_activity_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">avl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_BadWhenWhile</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"I don't understand the 'when/while' clause"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which should name activities or conditions."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IXActivities::annotate_list_for_cross_references</span><span class="plain-syntax">(</span><span class="identifier-syntax">avl</span><span class="plain-syntax">, </span><span class="identifier-syntax">idb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tests</span><span class="plain-syntax">++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15">&#167;15</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_1_1" class="paragraph-anchor"></a><b>&#167;15.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile an activity or explicit condition test tail</span><span class="named-paragraph-number">15.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax"> = </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-rls.html#SP15_3_1" class="named-paragraph-link"><span class="named-paragraph">Compile a generic test fail</span><span class="named-paragraph-number">15.3.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15_1">&#167;15.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15_3_1" class="paragraph-anchor"></a><b>&#167;15.3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Compile a generic test fail</span><span class="named-paragraph-number">15.3.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">GT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DEBUG_RULES_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::code</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_call_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><a href="2-hrr.html#SP4" class="function-link"><span class="function-syntax">Hierarchy::find</span></a><span class="plain-syntax">(</span><span class="constant-syntax">DB_RULE_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">idb</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="identifier-syntax">failure_code</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">());</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-rls.html#SP15_3">&#167;15.3</a>, <a href="4-rls.html#SP15_6">&#167;15.6</a>, <a href="4-rls.html#SP15_8">&#167;15.8</a>, <a href="4-rls.html#SP15_1_1">&#167;15.1.1</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-rtn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-rm.html">1</a></li><li class="progresschapter"><a href="2-hrr.html">2</a></li><li class="progresschapter"><a href="3-ad.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-fc.html">fc</a></li><li class="progresssection"><a href="4-i6i.html">i6i</a></li><li class="progresssection"><a href="4-lt.html">lt</a></li><li class="progresssection"><a href="4-jl.html">jl</a></li><li class="progresssection"><a href="4-tl.html">tl</a></li><li class="progresssection"><a href="4-ts.html">ts</a></li><li class="progresssection"><a href="4-rsp.html">rsp</a></li><li class="progresssection"><a href="4-ct.html">ct</a></li><li class="progresssection"><a href="4-cl.html">cl</a></li><li class="progresssection"><a href="4-rtn.html">rtn</a></li><li class="progresscurrent">rls</li><li class="progresssection"><a href="4-act.html">act</a></li><li class="progresssection"><a href="4-es.html">es</a></li><li class="progresssection"><a href="4-iti.html">iti</a></li><li class="progresssection"><a href="4-ts2.html">ts2</a></li><li class="progresssection"><a href="4-itc.html">itc</a></li><li class="progresssection"><a href="4-uoart.html">uoart</a></li><li class="progresssection"><a href="4-tv.html">tv</a></li><li class="progresssection"><a href="4-vrb.html">vrb</a></li><li class="progresssection"><a href="4-prp.html">prp</a></li><li class="progresssection"><a href="4-msr.html">msr</a></li><li class="progresssection"><a href="4-epv.html">epv</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-ic.html">ic</a></li><li class="progresssection"><a href="4-adj.html">adj</a></li><li class="progresssection"><a href="4-rsfk.html">rsfk</a></li><li class="progresssection"><a href="4-efart.html">efart</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-vart.html">vart</a></li><li class="progresssection"><a href="4-rart.html">rart</a></li><li class="progresssection"><a href="4-lpart.html">lpart</a></li><li class="progresssection"><a href="4-rsft.html">rsft</a></li><li class="progresssection"><a href="4-icd.html">icd</a></li><li class="progresssection"><a href="4-pr.html">pr</a></li><li class="progresssection"><a href="4-cls.html">cls</a></li><li class="progresschapter"><a href="5-nmn.html">5</a></li><li class="progressnext"><a href="4-act.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -380,7 +380,7 @@ and in this case we therefore ignore <span class="extract"><span class="extract-
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax">) </span><a href="2-emt.html#SP4" class="function-link"><span class="function-syntax">Emit::holster</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTActionPatterns::emit_pattern_match</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">RTActionPatterns::emit_pattern_match</span></span>:<br/>Named Action Patterns - <a href="5-nap.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">naming_mode</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTActionPatterns::emit_pattern_match</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">RTActionPatterns::emit_pattern_match</span></span>:<br/>Rules - <a href="4-rls.html#SP15_4">&#167;15.4</a>, <a href="4-rls.html#SP15_5">&#167;15.5</a><br/>Named Action Patterns - <a href="5-nap.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">action_pattern</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">naming_mode</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">value_holster</span><span class="plain-syntax"> </span><span class="identifier-syntax">VH</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Holsters::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_VAL_VHMODE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-ap.html#SP6" class="function-link"><span class="function-syntax">RTActionPatterns::compile_pattern_match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">naming_mode</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -739,7 +739,7 @@ actually running:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTScenes::emit_during_clause</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTScenes::emit_during_clause</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">RTScenes::emit_during_clause</span></span>:<br/>Rules - <a href="4-rls.html#SP15_2">&#167;15.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">stuck</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K_scene</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">Produce::val</span><span class="plain-syntax">(</span><a href="2-emt.html#SP2" class="function-link"><span class="function-syntax">Emit::tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">K_truth_state</span><span class="plain-syntax">, </span><span class="identifier-syntax">LITERAL_IVAL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Rvalues::is_rvalue</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</span><span class="plain-syntax">)) {</span>

View file

@ -2129,7 +2129,7 @@ options are properly used.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_DASH</span><span class="plain-syntax">(</span><span class="string-syntax">"(4I.f)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">outcome</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NEVER_MATCH</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Node::get_phrase_options_invoked</span><span class="plain-syntax">(</span><span class="identifier-syntax">inv</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cso</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Phrases::Options::parse_invoked_options</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cso</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PhraseOptions::parse_invoked_options</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inv</span><span class="plain-syntax">, (</span><span class="identifier-syntax">TEST_DASH_MODE</span><span class="plain-syntax">(</span><span class="constant-syntax">ISSUE_PROBLEMS_DMODE</span><span class="plain-syntax">))?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cso</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">outcome</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEVER_MATCH</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>

View file

@ -249,7 +249,7 @@ being compiled; all others are out of scope.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;s-phrase-option-in-use&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">id_body_being_compiled</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">int</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">i</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">ToPhraseFamily::parse_phrase_option_used</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">id_body_being_compiled</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">int</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">i</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">PhraseOptions::parse</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">id_body_being_compiled</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">i</span><span class="Preform-plain-syntax"> &gt;= </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> ==&gt; { -, </span><a href="2-cnd.html#SP9" class="function-link"><span class="Preform-function-syntax">Conditions::new_TEST_PHRASE_OPTION</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">i</span><span class="Preform-plain-syntax">) };</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>

File diff suppressed because it is too large Load diff

View file

@ -3,9 +3,9 @@
(@1)<cardinal-number>=1
(hits 171/171) (matched: '100') constraint CS = {r0} extremes [1, 1]
(@1)minus (@2)<cardinal-number>=1
(hits 0/1916) constraint DS = {12} extremes [2, 2]
(hits 0/1925) constraint DS = {12} extremes [2, 2]
(@1)<quoted-text>=1 (@2)( (@3)<response-letter>=2 (@4))
(hits 273/783) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4]
(hits 273/839) (matched: '"[current item from the multiple object list]: [run paragraph on]" ( a )') constraint DS = {12} extremes [4, 4]
(@1)<quoted-text>=1
(hits 1564/5543) (matched: 'Represents geographical locations, both indoor
and outdoor, which are not necessarily areas in a building. A player in one
@ -14,12 +14,12 @@
<s-literal-real-number>=1
(hits 11/9911) (matched: 'plus infinity') constraint (none) extremes [1, infinity)
(@1)<s-literal-truth-state>=1
(hits 78/819) (matched: 'false') constraint CS = {6} extremes [1, 1]
(hits 78/818) (matched: 'false') constraint CS = {6} extremes [1, 1]
<s-literal-list>=1
(hits 0/1989) constraint DS = {8} extremes [2, infinity)
(hits 0/3237) constraint DS = {8} extremes [2, infinity)
(@1)unicode <s-unicode-character>=1
(hits 0/4219) constraint DS = {12} extremes [2, infinity)
(hits 0/4282) constraint DS = {12} extremes [2, infinity)
<s-literal-time>=1
(hits 0/3785) constraint DW = {9, 10, 11} extremes [2, 5]
(hits 0/3836) constraint DW = {9, 10, 11} extremes [2, 5]
<s-literal-unit-notation>=1
(hits 0/9822) constraint (none) extremes [1, infinity)

View file

@ -1,26 +1,28 @@
100.0% in inform7 run
66.3% in compilation to Inter
25.4% in //ImperativeDefinitions::compile_first_block//
8.9% in //PhraseRequests::compile_as_needed//
6.7% in //Strings::compile_responses//
6.0% in //InferenceSubjects::emit_all//
4.2% in //MajorNodes::pre_pass//
3.2% in //MajorNodes::pass_1//
2.0% in //RTRules::RulePrintingRule_routine//
1.8% in //RTRules::rulebooks_array_array//
1.6% in //ImperativeDefinitions::assess_all//
0.9% in //RTVerbs::ConjugateVerb//
67.0% in compilation to Inter
25.3% in //ImperativeDefinitions::compile_first_block//
8.5% in //PhraseRequests::compile_as_needed//
7.1% in //Strings::compile_responses//
6.1% in //InferenceSubjects::emit_all//
4.3% in //MajorNodes::pre_pass//
3.5% in //MajorNodes::pass_1//
2.1% in //RTRules::RulePrintingRule_routine//
1.9% in //RTRules::rulebooks_array_array//
1.5% in //ImperativeDefinitions::assess_all//
1.0% in //RTVerbs::ConjugateVerb//
0.5% in //RTRules::compile_rulebooks//
0.5% in //World::stage_V//
0.3% in //MajorNodes::pass_2//
0.3% in //RTRelations::compile_defined_relations//
0.3% in //RTRules::compile_rulebooks//
0.1% in //RTCommandGrammars::compile_all//
0.1% in //RTKinds::compile_data_type_support_routines//
0.1% in //Task::make_built_in_kind_constructors//
3.3% not specifically accounted for
31.2% in running Inter pipeline
9.8% in step preparation
9.6% in inter step 2/12: link
7.3% in inter step 12/12: generate inform6 -> auto.inf
0.1% in //World::stages_II_and_III//
2.8% not specifically accounted for
30.8% in running Inter pipeline
10.1% in step preparation
9.8% in inter step 2/12: link
7.1% in inter step 12/12: generate inform6 -> auto.inf
0.3% in inter step 9/12: make-identifiers-unique
0.1% in inter step 10/12: reconcile-verbs
0.1% in inter step 11/12: eliminate-redundant-labels
@ -29,6 +31,6 @@
0.1% in inter step 6/12: assimilate
0.1% in inter step 7/12: resolve-external-symbols
0.1% in inter step 8/12: inspect-plugs
2.7% not specifically accounted for
2.0% in supervisor
0.4% not specifically accounted for
2.1% not specifically accounted for
1.9% in supervisor
0.2% not specifically accounted for

View file

@ -167,7 +167,6 @@ Inform 7 source text written underneath the heading.
typedef struct id_body {
struct imperative_defn *head_of_defn;
struct id_type_data type_data;
struct id_options_data options_data;
struct id_runtime_context_data runtime_context_data;
struct id_compilation_data compilation_data;
CLASS_DEFINITION
@ -177,7 +176,6 @@ id_body *ImperativeDefinitions::new_body(imperative_defn *id) {
LOGIF(PHRASE_CREATIONS, "Creating body: <%W>\n", id->log_text);
id_body *body = CREATE(id_body);
body->head_of_defn = id;
body->options_data = Phrases::Options::new(EMPTY_WORDING);
body->runtime_context_data = Phrases::Context::new();
body->type_data = IDTypeData::new();
body->compilation_data = IDCompilation::new_data(id->at);

View file

@ -19,7 +19,7 @@ back. The IDTD we write to is factory-fresh except that it has already been
adjusted for an inline definition (if that's the kind of definition this is).
=
void ParsingIDTypeData::parse(id_type_data *idtd, wording XW, wording *OW) {
void ParsingIDTypeData::parse(id_type_data *idtd, wording XW) {
int say_flag = FALSE; /* is this going to be a "say" phrase? */
if (Wordings::nonempty(XW))
@ -29,6 +29,7 @@ void ParsingIDTypeData::parse(id_type_data *idtd, wording XW, wording *OW) {
if (Wordings::nonempty(XW))
XW = ParsingIDTypeData::phtd_parse_doodads(idtd, XW, &say_flag); /* and doodads from the back */
wording OW = EMPTY_WORDING; /* the options wording */
int cw = -1; /* word number of first comma */
@<Find the first comma outside of parentheses, if any exists@>;
if (cw >= 0) {
@ -36,12 +37,13 @@ void ParsingIDTypeData::parse(id_type_data *idtd, wording XW, wording *OW) {
@<Does this comma presage phrase options?@>;
if (comma_presages_options) {
if (say_flag) @<Issue a problem: say phrases aren't allowed options@>;
*OW = Wordings::from(XW, cw + 1);
OW = Wordings::from(XW, cw + 1);
XW = Wordings::up_to(XW, cw - 1); /* trim the preamble range to to the text before the comma */
}
}
idtd->registration_text = XW;
ParsingIDTypeData::phtd_main_prototype(idtd);
PhraseOptions::parse_declared_options(&(idtd->options_data), OW);
}
@<Find the first comma outside of parentheses, if any exists@> =

View file

@ -1,83 +1,18 @@
[Phrases::Options::] Phrase Options.
[PhraseOptions::] Phrase Options.
To create and subsequently parse against the list of phrase options
with which the user can choose to invoke a To phrase.
@ A "phrase option" is a sort of modifier tacked on to the instruction to
do something, changing how it works but not enough to merit an entirely new
phrase. It's like an argument passed to a routine which specifies optional
behaviour, and indeed that will be how it is compiled.
@h Introduction.
A "phrase option" is a sort of modifier tacked on to an invocation of a
phrase; the only modifiers allowed are those declared in that phrase's
preamble. Phrase pptions are an early feature of Inform 7 going back to a
time when its priority was to enable the paraphrasing of Inform 6 library
features (such as the bitmap passed as a parameter to the list-printer).
Like the token names, phrase option names have local scope (which is why
they are here and not in the excerpts database). Unlike them, they are not
valid as values, since a condition is not also a value in Inform 7.
The packet of these associated with a phrase is stored in the PHOD structure.
@d MAX_OPTIONS_PER_PHRASE 16 /* because held in a 16-bit Z-machine bitmap */
=
typedef struct id_options_data {
struct phrase_option *options_permitted[MAX_OPTIONS_PER_PHRASE]; /* see below */
int no_options_permitted;
struct wording options_declaration; /* the text declaring the whole set of options */
int multiple_options_permitted; /* can be combined, or mutually exclusive? */
} id_options_data;
@ There's nothing to a phrase option, really:
=
typedef struct phrase_option {
struct wording name; /* text of name */
} phrase_option;
@h Creation.
By default, a phrase has no options.
=
id_options_data Phrases::Options::new(wording W) {
id_options_data phod;
phod.no_options_permitted = 0;
phod.multiple_options_permitted = FALSE;
phod.options_declaration = W;
return phod;
}
int Phrases::Options::allows_options(id_options_data *phod) {
if (phod->no_options_permitted > 0) return TRUE;
return FALSE;
}
@h Parsing.
This isn't very efficient, but doesn't need to be, since phrase options
are parsed only in a condition context, not in a value context, and
these are relatively rare in Inform source text.
=
int Phrases::Options::parse(id_options_data *phod, wording W) {
for (int i = 0; i < phod->no_options_permitted; i++)
if (Wordings::match(W, phod->options_permitted[i]->name))
return (1 << i);
return -1;
}
@h Parsing phrase options in a declaration.
=
id_options_data *phod_being_parsed = NULL;
id_body *idb_being_parsed = NULL;
void Phrases::Options::parse_declared_options(id_options_data *phod, wording W) {
if (Wordings::nonempty(W)) {
phod->options_declaration = W;
phod_being_parsed = phod;
<phrase-option-declaration-list>(W);
if (<<r>>) phod->multiple_options_permitted = TRUE;
}
}
@ I have to say that I regret the syntax for phrase options, which makes
us write commas like the one here:
I now sligjtly regret the existence of phrase options, but above all the
comma-based syntax used for them, as here. Brackets would have been better;
it makes phrase options impossible to use for text substitutions.
>> let R be the best route from X to Y, using doors;
@ -86,60 +21,138 @@ admitted that they are a clean way to interface to low-level Inform 6 code.
But it's mostly the comma which annoys me (making text substitutions unable
to support phrase options); I should have gone for brackets.
The syntax for declaring phrase options is uncontroversial -- it's just
a list of names -- but there are wrinkles: if the list is divided with "or"
then the options are mutually exclusive, but with "and/or" they're not.
For example, in:
The //id_options_data// for an imperative definition, which is part of its
type data, says what options it allows:
>> To decide which object is best route from (R1 - object) to (R2 - object), using doors or using even locked doors: ...
the following parses this list:
>> using doors or using even locked doors
and creates two options with <phrase-option-declaration-setting-entry>.
@d MAX_OPTIONS_PER_PHRASE 16 /* because held in a 16-bit Z-machine bitmap */
=
<phrase-option-declaration-list> ::=
... | ==> { lookahead }
<phrase-option-declaration-setting-entry> <phrase-option-declaration-tail> | ==> { pass 2 }
<phrase-option-declaration-setting-entry> ==> { FALSE, - }
typedef struct id_options_data {
struct phrase_option *options_permitted[MAX_OPTIONS_PER_PHRASE];
int no_options_permitted;
struct wording options_declaration; /* the text declaring the whole set of options */
int multiple_options_permitted; /* can be combined, or mutually exclusive? */
} id_options_data;
<phrase-option-declaration-tail> ::=
, _or <phrase-option-declaration-list> | ==> { pass 1 }
, \and/or <phrase-option-declaration-list> | ==> { TRUE, - }
_,/or <phrase-option-declaration-list> | ==> { pass 1 }
\and/or <phrase-option-declaration-list> ==> { TRUE, - }
typedef struct phrase_option {
struct wording name; /* text of name */
} phrase_option;
<phrase-option-declaration-setting-entry> ::=
... | ==> { lookahead }
... ==> @<Add a phrase option@>;
@<Add a phrase option@> =
Phrases::Options::phod_add_phrase_option(phod_being_parsed, W);
==> { FALSE, - };
@h Creation.
By default, a phrase has no options.
=
id_options_data PhraseOptions::new(wording W) {
id_options_data phod;
phod.no_options_permitted = 0;
phod.multiple_options_permitted = FALSE;
phod.options_declaration = W;
return phod;
}
int PhraseOptions::allows_options(id_body *idb) {
id_options_data *phod = &(idb->type_data.options_data);
if (phod->no_options_permitted > 0) return TRUE;
return FALSE;
}
@ =
int too_many_POs_error = FALSE;
void Phrases::Options::phod_add_phrase_option(id_options_data *phod, wording W) {
int PM_TooManyPhraseOptions_issued = FALSE;
void PhraseOptions::phod_add_phrase_option(id_options_data *phod, wording W) {
LOGIF(PHRASE_CREATIONS, "Adding phrase option <%W>\n", W);
if (phod->no_options_permitted >= MAX_OPTIONS_PER_PHRASE) {
if (too_many_POs_error == FALSE)
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_TooManyPhraseOptions),
if (PM_TooManyPhraseOptions_issued == FALSE)
StandardProblems::sentence_problem(Task::syntax_tree(),
_p_(PM_TooManyPhraseOptions),
"a phrase is only allowed to have 16 different options",
"so either some of these will need to go, or you may want to "
"consider breaking up the phrase into simpler ones whose usage "
"is easier to describe.");
too_many_POs_error = TRUE;
"so either some of these will need to go, or you may want to consider "
"breaking up the phrase into simpler ones whose usage is easier to describe.");
PM_TooManyPhraseOptions_issued = TRUE;
return;
}
too_many_POs_error = FALSE; /* so that the problem can recur on later phrases */
PM_TooManyPhraseOptions_issued = FALSE; /* so the problem can recur on later phrases */
phrase_option *po = CREATE(phrase_option);
po->name = W;
phod->options_permitted[phod->no_options_permitted++] = po;
}
@h Parsing.
This isn't very efficient, but doesn't need to be, since phrase options are parsed
only in a condition context, not in a value context, and these are relatively
rare in Inform source text.
=
id_options_data *phod_being_parsed = NULL;
id_body *idb_being_parsed = NULL;
int PhraseOptions::parse_phod(id_options_data *phod, wording W) {
for (int i = 0; i < phod->no_options_permitted; i++)
if (Wordings::match(W, phod->options_permitted[i]->name))
return (1 << i);
return -1;
}
int PhraseOptions::parse(id_body *idb, wording W) {
return PhraseOptions::parse_phod(&(idb->type_data.options_data), W);
}
@ Which we wrap up thus:
=
<phrase-option> internal {
int bitmap = PhraseOptions::parse_phod(phod_being_parsed, W);
if (bitmap == -1) { ==> { fail nonterminal }; }
==> { bitmap, - };
return TRUE;
}
@h Parsing phrase options in a declaration.
The following is called with |W| set to just the part of a phrase prototype
containing its phrase options. In this example:
= (text as Inform 7)
To decide which object is best route from (R1 - object) to (R2 - object),
using doors or using even locked doors:
=
|W| would be "using doors or using even locked doors".
The syntax is just a list of names, but with the wrinkle that if the list is divided
with "or" then the options are mutually exclusive, but with "and/or" they're not.
=
void PhraseOptions::parse_declared_options(id_options_data *phod, wording W) {
if (Wordings::nonempty(W)) {
phod->options_declaration = W;
phod_being_parsed = phod;
<phrase-option-decl-list>(W);
if (<<r>>) phod->multiple_options_permitted = TRUE;
}
}
@ Note the following Preform grammar passes the return value |TRUE| up from
the final element of the list when the connective used for it was "and/or".
Note also the rare use of the Preform literal marker in |\and/or| to show
that the slash between "and" and "or" is part of the word.
=
<phrase-option-decl-list> ::=
... | ==> { lookahead }
<phrase-option-decl-setting-entry> <phrase-option-decl-tail> | ==> { pass 2 }
<phrase-option-decl-setting-entry> ==> { FALSE, - }
<phrase-option-decl-tail> ::=
, _or <phrase-option-decl-list> | ==> { pass 1 }
, \and/or <phrase-option-decl-list> | ==> { TRUE, - }
_,/or <phrase-option-decl-list> | ==> { pass 1 }
\and/or <phrase-option-decl-list> ==> { TRUE, - }
<phrase-option-decl-setting-entry> ::=
... | ==> { lookahead }
... ==> @<Add a phrase option@>;
@<Add a phrase option@> =
PhraseOptions::phod_add_phrase_option(phod_being_parsed, W);
==> { FALSE, - };
@h Parsing phrase options in an invocation.
At this point, we're looking at the text after the first comma in something
like:
@ -161,12 +174,12 @@ produce.
=
int phod_being_parsed_silently = FALSE; /* context for the grammar below */
int Phrases::Options::parse_invoked_options(parse_node *inv, int silently) {
int PhraseOptions::parse_invoked_options(parse_node *inv, int silently) {
id_body *idb = Node::get_phrase_invoked(inv);
wording W = Invocations::get_phrase_options(inv);
idb_being_parsed = idb;
phod_being_parsed = &(idb_being_parsed->options_data);
phod_being_parsed = &(idb_being_parsed->type_data.options_data);
int bitmap = 0;
int pc = problem_count;
@ -188,7 +201,7 @@ int Phrases::Options::parse_invoked_options(parse_node *inv, int silently) {
@<Reject this if multiple options are set@>;
@ Ah, bit-twiddling: fun for all the family. There's no point computing the
Hamming distance of the bitmap, that is, the number of bits set: we only need
population count of the bitmap, that is, the number of bits set: we only need
to know if it's a power of 2 or not. Note that subtracting 1, in binary,
clears the least significant set bit, leaves the higher bits as they are,
and changes the lower bits (which were previously all 0s) to 1s. So taking
@ -203,7 +216,8 @@ this residue is zero.
Problems::quote_wording(2, W);
Problems::quote_phrase(3, idb);
Problems::quote_wording(4, phod_being_parsed->options_declaration);
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_PhraseOptionsExclusive));
StandardProblems::handmade_problem(Task::syntax_tree(),
_p_(PM_PhraseOptionsExclusive));
Problems::issue_problem_segment(
"You wrote %1, supplying the options '%2' to the phrase '%3', but "
"the options listed for this phrase ('%4') are mutually exclusive.");
@ -217,17 +231,17 @@ by "and":
=
<phrase-option-list> ::=
... | ==> { lookahead }
... | ==> { lookahead }
<phrase-option-setting-entry> <phrase-option-tail> | ==> { R[1] | R[2], - }
<phrase-option-setting-entry> ==> { pass 1 }
<phrase-option-setting-entry> ==> { pass 1 }
<phrase-option-tail> ::=
, _and <phrase-option-list> | ==> { pass 1 }
_,/and <phrase-option-list> ==> { pass 1 }
, _and <phrase-option-list> | ==> { pass 1 }
_,/and <phrase-option-list> ==> { pass 1 }
<phrase-option-setting-entry> ::=
<phrase-option> | ==> { pass 1 }
... ==> @<Issue PM_NotAPhraseOption or C22NotTheOnlyPhraseOption problem@>
<phrase-option> | ==> { pass 1 }
... ==> @<Issue PM_NotAPhraseOption or C22NotTheOnlyPhraseOption problem@>
@<Issue PM_NotAPhraseOption or C22NotTheOnlyPhraseOption problem@> =
if ((!preform_lookahead_mode) && (!phod_being_parsed_silently)) {
@ -236,13 +250,15 @@ by "and":
Problems::quote_phrase(3, idb_being_parsed);
Problems::quote_wording(4, phod_being_parsed->options_declaration);
if (phod_being_parsed->no_options_permitted > 1) {
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotAPhraseOption));
StandardProblems::handmade_problem(Task::syntax_tree(),
_p_(PM_NotAPhraseOption));
Problems::issue_problem_segment(
"You wrote %1, but '%2' is not one of the options allowed on "
"the end of the phrase '%3'. (The options allowed are: '%4'.)");
Problems::issue_problem_end();
} else {
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_NotTheOnlyPhraseOption));
StandardProblems::handmade_problem(Task::syntax_tree(),
_p_(PM_NotTheOnlyPhraseOption));
Problems::issue_problem_segment(
"You wrote %1, but the only option allowed on the end of the "
"phrase '%3' is '%4', so '%2' is not something I know how to "
@ -250,13 +266,3 @@ by "and":
Problems::issue_problem_end();
}
}
@ The following matches any single phrase option for the phrase being used.
=
<phrase-option> internal {
int bitmap = Phrases::Options::parse(phod_being_parsed, W);
if (bitmap == -1) { ==> { fail nonterminal }; }
==> { bitmap, - };
return TRUE;
}

View file

@ -42,6 +42,8 @@ typedef struct id_type_data {
int manner_of_return; /* one of the |*_MOR| values */
struct kind *return_kind; /* |NULL| except in the |DECIDES_VALUE_MOR| case */
struct id_options_data options_data;
struct say_details as_say; /* used only for "say" phrases, that is, text substitutions */
struct inline_details as_inline; /* side effects for phrases like C keywords */
@ -59,6 +61,7 @@ id_type_data IDTypeData::new(void) {
idtd.as_say = IDTypeData::new_say_details();
idtd.as_inline = IDTypeData::new_inline_details();
idtd.now_deprecated = FALSE;
idtd.options_data = PhraseOptions::new(EMPTY_WORDING);
return idtd;
}

View file

@ -193,10 +193,8 @@ void ToPhraseFamily::given_body(imperative_defn_family *self, imperative_defn *i
id_body *body = id->body_of_defn;
Routines::prepare_for_requests(body);
wording XW = ToPhraseFamily::get_prototype_text(id);
wording OW = EMPTY_WORDING;
ParsingIDTypeData::parse(&(id->body_of_defn->type_data), XW, &OW);
Phrases::Options::parse_declared_options(&(id->body_of_defn->options_data), OW);
ParsingIDTypeData::parse(&(id->body_of_defn->type_data),
ToPhraseFamily::get_prototype_text(id));
imperative_defn *previous_id = NULL;
imperative_defn *current_id = first_in_logical_order;
@ -504,9 +502,8 @@ kind *ToPhraseFamily::kind(constant_phrase *cphr) {
if (cphr == NULL) return NULL;
if (global_pass_state.pass < 2) return Kinds::binary_con(CON_phrase, K_value, K_value);
if (cphr->cphr_kind == NULL) {
wording OW = EMPTY_WORDING;
id_type_data idtd = IDTypeData::new();
ParsingIDTypeData::parse(&idtd, cphr->associated_preamble_text, &OW);
ParsingIDTypeData::parse(&idtd, cphr->associated_preamble_text);
cphr->cphr_kind = IDTypeData::kind(&idtd);
}
return cphr->cphr_kind;
@ -564,16 +561,3 @@ imperative_defn *ToPhraseFamily::to_begin(void) {
"these, specifying where execution should begin.");
return beginner;
}
@h Phrase option parsing.
These indirections are provided so that the implementation of phrase options
is confined to the current Chapter.
=
int ToPhraseFamily::allows_options(id_body *idb) {
return Phrases::Options::allows_options(&(idb->options_data));
}
int ToPhraseFamily::parse_phrase_option_used(id_body *idb, wording W) {
return Phrases::Options::parse(&(idb->options_data), W);
}

View file

@ -56,6 +56,7 @@ Chapter 5: Imperative Code
To Phrase Family
Phrase Type Data
Parsing Type Data
Phrase Options
Rule Family
Chapter 6: Other Gadgets

View file

@ -45,8 +45,8 @@ void ActionsPlugin::start(void) {
PluginManager::plug(RULE_PLACEMENT_NOTIFY_PLUG, Actions::rule_placement_notify);
PluginManager::plug(PRODUCTION_LINE_PLUG, ActionsPlugin::production_line);
PluginManager::plug(COMPLETE_MODEL_PLUG, ActionsPlugin::complete_model);
PluginManager::plug(COMPILE_TEST_HEAD_PLUG, Phrases::Context::actions_compile_test_head);
PluginManager::plug(COMPILE_TEST_TAIL_PLUG, Phrases::Context::actions_compile_test_tail);
PluginManager::plug(COMPILE_TEST_HEAD_PLUG, RTRules::actions_compile_test_head);
PluginManager::plug(COMPILE_TEST_TAIL_PLUG, RTRules::actions_compile_test_tail);
Vocabulary::set_flags(Vocabulary::entry_for_text(L"doing"), ACTION_PARTICIPLE_MC);
Vocabulary::set_flags(Vocabulary::entry_for_text(L"asking"), ACTION_PARTICIPLE_MC);

View file

@ -329,219 +329,6 @@ void Phrases::Context::ensure_avl(rule *R) {
}
}
@h Compiling the firing test.
Each rule compiles to a routine, and this routine is called whenever the
opportunity might exist for the rule to fire. The structure of this is
similar to:
= (text as Inform 6)
[ Rule;
if (some-firing-condition) {
...
return some-default-outcome;
}
];
=
The "test head" is the "if" line here, and the "test tail" is the "}". The
return statement isn't necessarily reached, because even if the firing
condition holds, the "..." code may decide to return in some other way.
It provides only a default to cover rules which don't specify an outcome.
In general the test is more elaborate than a single "if", though not very
much.
=
int Phrases::Context::compile_test_head(id_body *idb, rule *R) {
inter_name *identifier = IDCompilation::iname(idb);
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
if (RTRules::compile_constraint(R) == TRUE) return TRUE;
int tests = 0;
if (PluginCalls::compile_test_head(idb, R, &tests) == FALSE) {
if (phrcd->ap) @<Compile an action test head@>;
}
if (Wordings::nonempty(phrcd->activity_context))
@<Compile an activity or explicit condition test head@>;
if ((tests > 0) || (idb->compilation_data.compile_with_run_time_debugging)) {
Produce::inv_primitive(Emit::tree(), IF_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_number, Hierarchy::find(DEBUG_RULES_HL));
Produce::code(Emit::tree());
Produce::down(Emit::tree());
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(DB_RULE_HL));
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_value, identifier);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, (inter_ti) idb->allocation_id);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 0);
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
}
return FALSE;
}
int Phrases::Context::actions_compile_test_head(id_body *idb, rule *R, int *tests) {
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
#ifdef IF_MODULE
if (phrcd->during_scene) @<Compile a scene test head@>;
if (phrcd->ap) @<Compile possibly testing actor action test head@>
else if (phrcd->always_test_actor == TRUE) @<Compile an actor-is-player test head@>;
#endif
return TRUE;
}
int Phrases::Context::actions_compile_test_tail(id_body *idb, rule *R) {
inter_name *identifier = IDCompilation::iname(idb);
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
#ifdef IF_MODULE
if (phrcd->ap) @<Compile an action test tail@>
else if (phrcd->always_test_actor == TRUE) @<Compile an actor-is-player test tail@>;
if (phrcd->during_scene) @<Compile a scene test tail@>;
#endif
return TRUE;
}
@ This is almost the up-down reflection of the head, but note that it begins
with the default outcome return (see above).
=
void Phrases::Context::compile_test_tail(id_body *idb, rule *R) {
inter_name *identifier = IDCompilation::iname(idb);
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
rulebook *rb = RuleFamily::get_rulebook(idb->head_of_defn);
if (rb) RTRules::compile_default_outcome(Rulebooks::get_outcomes(rb));
if (Wordings::nonempty(phrcd->activity_context))
@<Compile an activity or explicit condition test tail@>;
if (PluginCalls::compile_test_tail(idb, R) == FALSE) {
if (phrcd->ap) @<Compile an action test tail@>;
}
}
@h Scene test.
@<Compile a scene test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
RTScenes::emit_during_clause(phrcd->during_scene);
Produce::code(Emit::tree());
Produce::down(Emit::tree());
(*tests)++;
@<Compile a scene test tail@> =
inter_ti failure_code = 1;
@<Compile a generic test fail@>;
@h Action test.
@<Compile an action test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
RTActionPatterns::emit_pattern_match(phrcd->ap, TRUE);
Produce::code(Emit::tree());
Produce::down(Emit::tree());
tests++;
if (ActionPatterns::involves_actions(phrcd->ap)) {
Produce::inv_primitive(Emit::tree(), STORE_BIP);
Produce::down(Emit::tree());
Produce::ref_iname(Emit::tree(), K_object, Hierarchy::find(SELF_HL));
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(NOUN_HL));
Produce::up(Emit::tree());
}
@<Compile possibly testing actor action test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
if (phrcd->never_test_actor)
RTActionPatterns::emit_pattern_match(phrcd->ap, TRUE);
else
RTActionPatterns::emit_pattern_match(phrcd->ap, FALSE);
Produce::code(Emit::tree());
Produce::down(Emit::tree());
(*tests)++;
if (ActionPatterns::involves_actions(phrcd->ap)) {
Produce::inv_primitive(Emit::tree(), STORE_BIP);
Produce::down(Emit::tree());
Produce::ref_iname(Emit::tree(), K_object, Hierarchy::find(SELF_HL));
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(NOUN_HL));
Produce::up(Emit::tree());
}
@<Compile an action test tail@> =
inter_ti failure_code = 2;
@<Compile a generic test fail@>;
@h Actor-is-player test.
@<Compile an actor-is-player test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), EQ_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(ACTOR_HL));
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(PLAYER_HL));
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
(*tests)++;
@<Compile an actor-is-player test tail@> =
inter_ti failure_code = 3;
@<Compile a generic test fail@>;
@h Activity-or-condition test.
@<Compile an activity or explicit condition test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
activity_list *avl = phrcd->avl;
if (avl) {
RTActivities::emit_activity_list(avl);
} else {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhenWhile),
"I don't understand the 'when/while' clause",
"which should name activities or conditions.");
Produce::val(Emit::tree(), K_truth_state, LITERAL_IVAL, 0);
}
Produce::code(Emit::tree());
Produce::down(Emit::tree());
IXActivities::annotate_list_for_cross_references(avl, idb);
tests++;
@<Compile an activity or explicit condition test tail@> =
inter_ti failure_code = 4;
@<Compile a generic test fail@>;
@<Compile a generic test fail@> =
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), IF_BIP);
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), GT_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_number, Hierarchy::find(DEBUG_RULES_HL));
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 1);
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(DB_RULE_HL));
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_value, identifier);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, (inter_ti) idb->allocation_id);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, failure_code);
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
@
=

View file

@ -231,7 +231,7 @@ charlatans" and what they "deserve". I'm a better person now.
@ Acting on that:
@<Expand a bracing containing natural language text@> =
phod_being_parsed = &(idb->options_data);
phod_being_parsed = &(idb->type_data.options_data);
idb_being_parsed = idb;
<inline-substitution>(BRW);
int current_opts = Invocations::get_phrase_options_bitmap(inv);

View file

@ -72,14 +72,14 @@ void Routines::Compile::routine(id_body *idb,
@<Compile the body of the routine@> =
current_sentence = code_at;
if (Phrases::Context::compile_test_head(idb, R) == FALSE) {
if (RTRules::compile_test_head(idb, R) == FALSE) {
if (code_at) {
VerifyTree::verify_structure_from(code_at);
Routines::Compile::code_block_outer(1, code_at->down);
VerifyTree::verify_structure_from(code_at);
}
current_sentence = code_at;
Phrases::Context::compile_test_tail(idb, R);
RTRules::compile_test_tail(idb, R);
@<Compile a terminal return statement@>;
}

View file

@ -27,7 +27,6 @@ premisses worked out, and are then collected together into rulebooks, before
being compiled as a great mass of Inform 6 routines and arrays."
Introduction to Phrases
Phrase Runtime Context Data
Phrase Options
Chapter 4: Compilation Context
"Preparing a context at run-time in which code can be executed."

View file

@ -250,7 +250,7 @@ void Phrases::Index::write_reveal_box(OUTPUT_STREAM, id_type_data *idtd, id_body
HTML_OPEN("p");
@<Present a paste button containing the text of the phrase@>;
Phrases::Index::index_type_data(OUT, idtd, idb);
Phrases::Index::index_phrase_options(OUT, &(idb->options_data));
Phrases::Index::index_phrase_options(OUT, &(idb->type_data.options_data));
@<Quote from and reference to the documentation, where possible@>;
@<Present the equation form of the phrase, if it has one@>;
@<Present the name of the phrase regarded as a value, if it has one@>;

View file

@ -57,9 +57,10 @@ void IDCompilation::make_inline(id_body *idb, int inline_wn, int mor) {
=
void IDCompilation::prepare_stack_frame(id_body *body) {
IDCompilation::initialise_stack_frame_from_type_data(&(body->compilation_data.stack_frame), &(body->type_data),
IDCompilation::initialise_stack_frame_from_type_data(
&(body->compilation_data.stack_frame), &(body->type_data),
IDTypeData::kind(&(body->type_data)), TRUE);
if (Phrases::Options::allows_options(&(body->options_data)))
if (PhraseOptions::allows_options(body))
LocalVariables::options_parameter_is_needed(&(body->compilation_data.stack_frame));
}

View file

@ -955,3 +955,212 @@ void RTRules::RulebookOutcomePrintingRule(void) {
Produce::up(Emit::tree());
Routines::end(save);
}
@h Compiling the firing test.
Each rule compiles to a routine, and this routine is called whenever the
opportunity might exist for the rule to fire. The structure of this is
similar to:
= (text as Inform 6)
[ Rule;
if (some-firing-condition) {
...
return some-default-outcome;
}
];
=
The "test head" is the "if" line here, and the "test tail" is the "}". The
return statement isn't necessarily reached, because even if the firing
condition holds, the "..." code may decide to return in some other way.
It provides only a default to cover rules which don't specify an outcome.
In general the test is more elaborate than a single "if", though not very
much.
=
int RTRules::compile_test_head(id_body *idb, rule *R) {
inter_name *identifier = IDCompilation::iname(idb);
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
if (RTRules::compile_constraint(R) == TRUE) return TRUE;
int tests = 0;
if (PluginCalls::compile_test_head(idb, R, &tests) == FALSE) {
if (phrcd->ap) @<Compile an action test head@>;
}
if (Wordings::nonempty(phrcd->activity_context))
@<Compile an activity or explicit condition test head@>;
if ((tests > 0) || (idb->compilation_data.compile_with_run_time_debugging)) {
Produce::inv_primitive(Emit::tree(), IF_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_number, Hierarchy::find(DEBUG_RULES_HL));
Produce::code(Emit::tree());
Produce::down(Emit::tree());
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(DB_RULE_HL));
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_value, identifier);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, (inter_ti) idb->allocation_id);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 0);
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
}
return FALSE;
}
int RTRules::actions_compile_test_head(id_body *idb, rule *R, int *tests) {
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
if (phrcd->during_scene) @<Compile a scene test head@>;
if (phrcd->ap) @<Compile possibly testing actor action test head@>
else if (phrcd->always_test_actor == TRUE) @<Compile an actor-is-player test head@>;
return TRUE;
}
int RTRules::actions_compile_test_tail(id_body *idb, rule *R) {
inter_name *identifier = IDCompilation::iname(idb);
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
if (phrcd->ap) @<Compile an action test tail@>
else if (phrcd->always_test_actor == TRUE) @<Compile an actor-is-player test tail@>;
if (phrcd->during_scene) @<Compile a scene test tail@>;
return TRUE;
}
@ This is almost the up-down reflection of the head, but note that it begins
with the default outcome return (see above).
=
void RTRules::compile_test_tail(id_body *idb, rule *R) {
inter_name *identifier = IDCompilation::iname(idb);
id_runtime_context_data *phrcd = &(idb->runtime_context_data);
rulebook *rb = RuleFamily::get_rulebook(idb->head_of_defn);
if (rb) RTRules::compile_default_outcome(Rulebooks::get_outcomes(rb));
if (Wordings::nonempty(phrcd->activity_context))
@<Compile an activity or explicit condition test tail@>;
if (PluginCalls::compile_test_tail(idb, R) == FALSE) {
if (phrcd->ap) @<Compile an action test tail@>;
}
}
@h Scene test.
@<Compile a scene test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
RTScenes::emit_during_clause(phrcd->during_scene);
Produce::code(Emit::tree());
Produce::down(Emit::tree());
(*tests)++;
@<Compile a scene test tail@> =
inter_ti failure_code = 1;
@<Compile a generic test fail@>;
@h Action test.
@<Compile an action test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
RTActionPatterns::emit_pattern_match(phrcd->ap, TRUE);
Produce::code(Emit::tree());
Produce::down(Emit::tree());
tests++;
if (ActionPatterns::involves_actions(phrcd->ap)) {
Produce::inv_primitive(Emit::tree(), STORE_BIP);
Produce::down(Emit::tree());
Produce::ref_iname(Emit::tree(), K_object, Hierarchy::find(SELF_HL));
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(NOUN_HL));
Produce::up(Emit::tree());
}
@<Compile possibly testing actor action test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
if (phrcd->never_test_actor)
RTActionPatterns::emit_pattern_match(phrcd->ap, TRUE);
else
RTActionPatterns::emit_pattern_match(phrcd->ap, FALSE);
Produce::code(Emit::tree());
Produce::down(Emit::tree());
(*tests)++;
if (ActionPatterns::involves_actions(phrcd->ap)) {
Produce::inv_primitive(Emit::tree(), STORE_BIP);
Produce::down(Emit::tree());
Produce::ref_iname(Emit::tree(), K_object, Hierarchy::find(SELF_HL));
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(NOUN_HL));
Produce::up(Emit::tree());
}
@<Compile an action test tail@> =
inter_ti failure_code = 2;
@<Compile a generic test fail@>;
@h Actor-is-player test.
@<Compile an actor-is-player test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), EQ_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(ACTOR_HL));
Produce::val_iname(Emit::tree(), K_object, Hierarchy::find(PLAYER_HL));
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
(*tests)++;
@<Compile an actor-is-player test tail@> =
inter_ti failure_code = 3;
@<Compile a generic test fail@>;
@h Activity-or-condition test.
@<Compile an activity or explicit condition test head@> =
Produce::inv_primitive(Emit::tree(), IFELSE_BIP);
Produce::down(Emit::tree());
activity_list *avl = phrcd->avl;
if (avl) {
RTActivities::emit_activity_list(avl);
} else {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_BadWhenWhile),
"I don't understand the 'when/while' clause",
"which should name activities or conditions.");
Produce::val(Emit::tree(), K_truth_state, LITERAL_IVAL, 0);
}
Produce::code(Emit::tree());
Produce::down(Emit::tree());
IXActivities::annotate_list_for_cross_references(avl, idb);
tests++;
@<Compile an activity or explicit condition test tail@> =
inter_ti failure_code = 4;
@<Compile a generic test fail@>;
@<Compile a generic test fail@> =
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), IF_BIP);
Produce::down(Emit::tree());
Produce::inv_primitive(Emit::tree(), GT_BIP);
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_number, Hierarchy::find(DEBUG_RULES_HL));
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, 1);
Produce::up(Emit::tree());
Produce::code(Emit::tree());
Produce::down(Emit::tree());
Produce::inv_call_iname(Emit::tree(), Hierarchy::find(DB_RULE_HL));
Produce::down(Emit::tree());
Produce::val_iname(Emit::tree(), K_value, identifier);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, (inter_ti) idb->allocation_id);
Produce::val(Emit::tree(), K_number, LITERAL_IVAL, failure_code);
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());
Produce::up(Emit::tree());

View file

@ -1663,7 +1663,7 @@ options are properly used.
@<Step (4I.f) Check any phrase options@> =
LOG_DASH("(4I.f)");
if ((outcome != NEVER_MATCH) && (Node::get_phrase_options_invoked(inv))) {
int cso = Phrases::Options::parse_invoked_options(
int cso = PhraseOptions::parse_invoked_options(
inv, (TEST_DASH_MODE(ISSUE_PROBLEMS_DMODE))?FALSE:TRUE);
if (cso == FALSE) outcome = NEVER_MATCH;
}

View file

@ -147,7 +147,7 @@ being compiled; all others are out of scope.
=
<s-phrase-option-in-use> internal {
if (id_body_being_compiled) {
int i = ToPhraseFamily::parse_phrase_option_used(id_body_being_compiled, W);
int i = PhraseOptions::parse(id_body_being_compiled, W);
if (i >= 0) {
==> { -, Conditions::new_TEST_PHRASE_OPTION(i) };
return TRUE;

View file

@ -317,7 +317,7 @@ though it can be any type of phrase.
@<Look through to see if there are phrase options at the end@> =
#ifdef CORE_MODULE
id_body *idb = ToPhraseFamily::meaning_as_phrase(Node::get_meaning(p));
if (ToPhraseFamily::allows_options(idb)) {
if (PhraseOptions::allows_options(idb)) {
LOGIF(EXCERPT_PARSING, "Looking for phrase options\n");
for (bl=0, scan_pos=Wordings::first_wn(W)+1;
scan_pos<Wordings::last_wn(W); scan_pos++) {