1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Completed revision of syntax module

This commit is contained in:
Graham Nelson 2020-05-11 19:14:00 +01:00
parent b87ace2f32
commit 98c3419e84
61 changed files with 1368 additions and 728 deletions

File diff suppressed because one or more lines are too long

View file

@ -330,7 +330,7 @@ context.
<span class="plain-syntax"> </span><span class="identifier-syntax">preform_lookahead_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">plm</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="10-aots.html#SP13_2" class="named-paragraph-link"><span class="named-paragraph">Write the newly discovered specification to the cache for future use</span><span class="named-paragraph-number">13.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><span class="identifier-syntax">spec</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">spec</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">spec</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -424,7 +424,7 @@ object.
<span class="plain-syntax"> </span><span class="identifier-syntax">one</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_poss</span><span class="plain-syntax"> = </span><a href="10-varc.html#SP13" class="function-link"><span class="function-syntax">ExParser::Subtrees::to_specification</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SV_not_SN</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">one</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">if</span><span class="plain-syntax"> (!(</span><span class="identifier-syntax">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">new_poss</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">amb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::add_possible_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">amb</span><span class="plain-syntax">, </span><span class="identifier-syntax">new_poss</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">amb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SyntaxTree::add_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">amb</span><span class="plain-syntax">, </span><span class="identifier-syntax">new_poss</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</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">amb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">amb</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP8" class="function-link"><span class="function-syntax">Specifications::new_UNKNOWN</span></a><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">amb</span><span class="plain-syntax">;</span>
@ -437,7 +437,7 @@ object.
<span class="plain-syntax"> </span><span class="identifier-syntax">hmm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_poss</span><span class="plain-syntax"> = </span><a href="10-varc.html#SP13" class="function-link"><span class="function-syntax">ExParser::Subtrees::to_specification</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SV_not_SN</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">hmm</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">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">new_poss</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">amb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::add_possible_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">amb</span><span class="plain-syntax">, </span><span class="identifier-syntax">new_poss</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">amb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SyntaxTree::add_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">amb</span><span class="plain-syntax">, </span><span class="identifier-syntax">new_poss</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</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">amb</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">amb</span><span class="plain-syntax"> = </span><a href="14-sp.html#SP8" class="function-link"><span class="function-syntax">Specifications::new_UNKNOWN</span></a><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">amb</span><span class="plain-syntax">;</span>

View file

@ -270,7 +270,7 @@ created condition:
<span class="plain-syntax"> </span><span class="identifier-syntax">reading</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</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">reading</span><span class="plain-syntax"> = </span><a href="14-cn.html#SP11" class="function-link"><span class="function-syntax">Conditions::attach_historic_requirement</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="identifier-syntax">tp</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">Node::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NT</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">amb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::add_possible_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">amb</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">amb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SyntaxTree::add_reading</span><span class="plain-syntax">(</span><span class="identifier-syntax">amb</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">cond</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">amb</span><span class="plain-syntax">;</span>

View file

@ -4331,6 +4331,36 @@ at run time.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP29"></a><b>&#167;29. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">AMBIGUITY_JOIN_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="14-ds2.html#SP29" class="function-link"><span class="function-syntax">Dash::ambiguity_join</span></a>
</pre>
<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">Dash::ambiguity_join</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reading</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="7-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::is_phrasal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">) == </span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><a href="14-ds2.html#SP29" class="function-link"><span class="function-syntax">Dash::add_pr_inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="identifier-syntax">reading</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">existing</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">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">Dash::add_pr_inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reading</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">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, *</span><span class="identifier-syntax">next_N</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">N</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">next_N</span><span class="plain-syntax">, </span><span class="identifier-syntax">next_N</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">N</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="14-ds2.html#SP29" class="function-link"><span class="function-syntax">Dash::add_single_pr_inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</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">Dash::add_single_pr_inv</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="25-in.html#SP28" class="function-link"><span class="function-syntax">Invocations::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</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">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">E</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="25-in.html#SP28" class="function-link"><span class="function-syntax">Invocations::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</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">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">N</span><span class="plain-syntax">; </span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</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="14-cfs.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-nl.html">3</a></li><li class="progresschapter"><a href="4-its.html">4</a></li><li class="progresschapter"><a href="5-lp.html">5</a></li><li class="progresschapter"><a href="6-bp.html">6</a></li><li class="progresschapter"><a href="7-ptu.html">7</a></li><li class="progresschapter"><a href="8-ef.html">8</a></li><li class="progresschapter"><a href="9-ita.html">9</a></li><li class="progresschapter"><a href="10-aots.html">10</a></li><li class="progresschapter"><a href="11-itpc.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresscurrentchapter">14</li><li class="progresssection"><a href="14-sp.html">sp</a></li><li class="progresssection"><a href="14-rv.html">rv</a></li><li class="progresssection"><a href="14-lv.html">lv</a></li><li class="progresssection"><a href="14-cn.html">cn</a></li><li class="progresssection"><a href="14-ds.html">ds</a></li><li class="progresssection"><a href="14-cfs.html">cfs</a></li><li class="progresscurrent">ds2</li><li class="progresschapter"><a href="15-pr.html">15</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresschapter"><a href="24-lv.html">24</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="15-pr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -160,9 +160,9 @@ should always be supplied for "To..." phrases, but left null for rules.
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="22-prcd.html#SP10" class="function-link"><span class="function-syntax">Phrases::Context::compile_test_head</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">acl</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="25-cp.html#SP5" class="function-link"><span class="function-syntax">Routines::Compile::code_block_outer</span></a><span class="plain-syntax">(1, </span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</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">ph</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">declaration_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="22-prcd.html#SP10_1" class="function-link"><span class="function-syntax">Phrases::Context::compile_test_tail</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ph</span><span class="plain-syntax">, </span><span class="identifier-syntax">acl</span><span class="plain-syntax">);</span>

View file

@ -649,7 +649,7 @@ Inform prioritises phrases.
</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::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv2</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Invocations::eq</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">Invocations::eq</span></span>:<br/>Dash - <a href="14-ds2.html#SP29">&#167;29</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv1</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">inv2</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">inv1</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">inv2</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">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">inv1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">inv2</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">inv1</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">TRUE</span><span class="plain-syntax">;</span>
@ -682,7 +682,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('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">Invocations::log_list</span></span>:<br/>Core Module - <a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</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('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">Invocations::log_list</span></span>:<br/>Core Module - <a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</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="25-in.html#SP24" 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

@ -1408,6 +1408,16 @@ usages to the debugging log.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP26"></a><b>&#167;26. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">TRACING_LINGUISTICS_CALLBACK</span><span class="plain-syntax"> </span><a href="6-nv.html#SP26" class="function-link"><span class="function-syntax">NewVerbs::trace_parsing</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NewVerbs::trace_parsing</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><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>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="6-tur.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-nl.html">3</a></li><li class="progresschapter"><a href="4-its.html">4</a></li><li class="progresschapter"><a href="5-lp.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresssection"><a href="6-bp.html">bp</a></li><li class="progresssection"><a href="6-rlt.html">rlt</a></li><li class="progresssection"><a href="6-er.html">er</a></li><li class="progresssection"><a href="6-tur.html">tur</a></li><li class="progresscurrent">nv</li><li class="progresschapter"><a href="7-ptu.html">7</a></li><li class="progresschapter"><a href="8-ef.html">8</a></li><li class="progresschapter"><a href="9-ita.html">9</a></li><li class="progresschapter"><a href="10-aots.html">10</a></li><li class="progresschapter"><a href="11-itpc.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresschapter"><a href="14-sp.html">14</a></li><li class="progresschapter"><a href="15-pr.html">15</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresschapter"><a href="24-lv.html">24</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="7-ptu.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -176,8 +176,8 @@ in quick succession, the second run-through does nothing.)
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::VPs::visit</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="identifier-syntax">TRACE_NT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax"> - </span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Diagramming"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::toggle_trace</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Diagramming"</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">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="identifier-syntax">SENTENCE_NT</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">sentence_unparsed_ANNOT</span><span class="plain-syntax">))) {</span>
@ -443,7 +443,7 @@ action declarations continue with usually extensive further text:
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">VP_PN</span><span class="plain-syntax">, </span><span class="constant-syntax">verb_id_ANNOT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_VB</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::graft</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">VP_PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">nss_tree_head</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">trace_sentences</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">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><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">"$T\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">nss_tree_head</span><span class="plain-syntax">); </span><span class="identifier-syntax">STREAM_FLUSH</span><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>

View file

@ -131,7 +131,7 @@ not be treated as a possessive, and expunge them.
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::Rearrangement::tidy_up_ofs_and_froms</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">Sentences::Rearrangement::tidy_up_ofs_and_froms</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_integrity</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">()-&gt;</span><span class="identifier-syntax">root_node</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">VerifyTree::verify_integrity</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::traverse_wfirst</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><a href="7-oaf.html#SP5" class="function-link"><span class="function-syntax">Sentences::Rearrangement::traverse_for_property_names</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::traverse</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><a href="7-oaf.html#SP10" class="function-link"><span class="function-syntax">Sentences::Rearrangement::traverse_for_nonbreaking_ofs</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -212,28 +212,28 @@ also makes it easier for us to manipulate the results.
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTreeUsage::write_parentage_permissions</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">L3_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">L3_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">L4_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">L4_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">UNKNOWN_NCAT</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">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">LVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">RVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">COND_NCAT</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">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="identifier-syntax">L4_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">UNKNOWN_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">UNKNOWN_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">][</span><span class="identifier-syntax">UNKNOWN_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">LVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">LVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">LVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">RVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">RVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">RVALUE_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">COND_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">COND_NCAT</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">COND_NCAT</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">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NodeType::allow_parentage_for_categories</span><span class="plain-syntax">(</span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b></p>
@ -406,7 +406,7 @@ also makes it easier for us to manipulate the results.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">IMMUTABLE_NODE</span><span class="plain-syntax"> </span><a href="7-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::immutable</span></a>
<span class="definition-keyword">define</span> <span class="constant-syntax">SENTENCE_NODE_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="7-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::second_level</span></a>
<span class="definition-keyword">define</span> <span class="constant-syntax">IS_SENTENCE_NODE_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="7-ptu.html#SP12" class="function-link"><span class="function-syntax">ParseTreeUsage::second_level</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTreeUsage::second_level</span><span class="plain-syntax">(</span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
@ -456,7 +456,7 @@ also makes it easier for us to manipulate the results.
<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">ParseTreeUsage::is_phrasal</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">ParseTreeUsage::is_phrasal</span></span>:<br/>Terms - <a href="11-tr.html#SP10">&#167;10</a><br/>Binding and Substitution - <a href="11-bas.html#SP19">&#167;19</a><br/>Cinders and Deferrals - <a href="12-cad.html#SP6">&#167;6</a><br/>Local Variables - <a href="24-lv.html#SP34">&#167;34</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTreeUsage::is_phrasal</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">ParseTreeUsage::is_phrasal</span></span>:<br/>Terms - <a href="11-tr.html#SP10">&#167;10</a><br/>Binding and Substitution - <a href="11-bas.html#SP19">&#167;19</a><br/>Cinders and Deferrals - <a href="12-cad.html#SP6">&#167;6</a><br/>Dash - <a href="14-ds2.html#SP29">&#167;29</a><br/>Local Variables - <a href="24-lv.html#SP34">&#167;34</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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">NodeType::has_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">), </span><span class="constant-syntax">PHRASAL_NFLAG</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>
@ -470,7 +470,7 @@ be such that their head nodes each pass this test:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTreeUsage::allow_in_assertions</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">ParseTreeUsage::allow_in_assertions</span></span>:<br/>Make Assertions - <a href="9-ma.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">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</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">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">NodeType::has_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">), </span><span class="identifier-syntax">ASSERT_NFLAG</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>
@ -565,7 +565,8 @@ be such that their head nodes each pass this test:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTreeUsage::verify</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">ParseTreeUsage::verify</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_3">&#167;2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_node</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_integrity</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. </b></p>

View file

@ -289,7 +289,7 @@ the massive <span class="extract"><span class="extract-syntax">Assertions::Maker
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="9-tc.html#SP1" class="function-link"><span class="function-syntax">Assertions::Creator::consult_the_creator</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">px</span><span class="plain-syntax">, </span><span class="identifier-syntax">py</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="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$T"</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sentence</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">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">())) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$T"</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_sentence</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;s-existential-np&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">px</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">traverse</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><a href="9-tbath.html#SP7" class="function-link"><span class="function-syntax">Assertions::Copular::make_existential_assertion</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">py</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">px</span><span class="plain-syntax"> = </span><span class="identifier-syntax">py</span><span class="plain-syntax">;</span>

View file

@ -188,7 +188,7 @@ we don't bother to print details of the closing <span class="extract"><span clas
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::traverse</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pass</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="9-tfa.html#SP13" class="function-link"><span class="function-syntax">Assertions::Traverse::new_discussion</span></a><span class="plain-syntax">(); </span><span class="comment-syntax"> clear memory of what the subject and object of discussion are</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">traverse</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pass</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">trace_sentences</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">SyntaxTree::clear_trace</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_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">sentence_handlers_initialised</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Initialise sentence handlers</span><span class="named-paragraph-number">7.3</span></a></span><span class="plain-syntax">;</span>
@ -308,7 +308,7 @@ handlers until right at the end of the program. The routine which does so,
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) != </span><span class="identifier-syntax">TRACE_NT</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">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">())) &amp;&amp; (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) != </span><span class="identifier-syntax">TRACE_NT</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">"\n[%W]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_2_2_1" class="named-paragraph-link"><span class="named-paragraph">If this sentence can be handled, then do so and continue</span><span class="named-paragraph-number">7.2.2.1</span></a></span><span class="plain-syntax">;</span>
@ -362,9 +362,9 @@ for the telemetry file.
<span class="plain-syntax"> </span><span class="string-syntax">"so I'll note it down in the Telemetry file (if you're keeping one.)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">telemetry_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tr</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">trace_sentences</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax"> - </span><span class="identifier-syntax">trace_sentences</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">traverse</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pass 1"</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">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pass 2"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::toggle_trace</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_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">traverse</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pass 1"</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">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pass 2"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -194,9 +194,9 @@ verbs were added to the grammar. Still, it was a pity.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;sentence&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">trace_sentences</span><span class="Preform-plain-syntax">) { </span><span class="Preform-identifier-syntax">LOG</span><span class="Preform-plain-syntax">(</span><span class="Preform-string-syntax">"Parsing the sentence: %W\n"</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">); </span><span class="Preform-identifier-syntax">LOG_INDENT</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><a href="5-vp.html#SP10" class="function-link"><span class="Preform-function-syntax">VerbPhrases::tracing</span></a><span class="Preform-plain-syntax">()) { </span><span class="Preform-identifier-syntax">LOG</span><span class="Preform-plain-syntax">(</span><span class="Preform-string-syntax">"Parsing the sentence: %W\n"</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">); </span><span class="Preform-identifier-syntax">LOG_INDENT</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">rv</span><span class="Preform-plain-syntax"> = </span><a href="5-vp.html#SP7" class="function-link"><span class="Preform-function-syntax">VerbPhrases::seek</span></a><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">X</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">XP</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">0</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">trace_sentences</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><a href="5-vp.html#SP10" class="function-link"><span class="Preform-function-syntax">VerbPhrases::tracing</span></a><span class="Preform-plain-syntax">()) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOG_OUTDENT</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">rv</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOG</span><span class="Preform-plain-syntax">(</span><span class="Preform-string-syntax">"Passed\n"</span><span class="Preform-plain-syntax">); </span><span class="Preform-identifier-syntax">LOG_INDENT</span><span class="Preform-plain-syntax">;</span>
@ -234,7 +234,7 @@ which word positions might be the beginning of verb phrases.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">VerbPhrases::seek</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">VerbPhrases::seek</span></span>:<br/><a href="5-vp.html#SP6">&#167;6</a>, <a href="5-vp.html#SP7_3_1_2">&#167;7.3.1.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="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> **</span><span class="identifier-syntax">XP</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">existential_OP_edge</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">viable</span><span class="plain-syntax">[</span><span class="constant-syntax">VIABILITY_MAP_SIZE</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-vp.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Calculate the viability map</span><span class="named-paragraph-number">7.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">trace_sentences</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="5-vp.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Log the viability map</span><span class="named-paragraph-number">7.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><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><span class="plain-syntax">()) </span><span class="named-paragraph-container code-font"><a href="5-vp.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Log the viability map</span><span class="named-paragraph-number">7.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-vp.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Seek verb usages</span><span class="named-paragraph-number">7.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">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -478,7 +478,7 @@ certainty are removed from these.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">certainty</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pre_certainty</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">certainty</span><span class="plain-syntax"> == </span><span class="constant-syntax">UNKNOWN_CE</span><span class="plain-syntax">) </span><span class="identifier-syntax">certainty</span><span class="plain-syntax"> = </span><span class="identifier-syntax">post_certainty</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">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Found usage, pass %d tier %d: (%W) $w (%W)\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><span class="plain-syntax">()) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Found usage, pass %d tier %d: (%W) $w (%W)\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pass</span><span class="plain-syntax">, </span><span class="identifier-syntax">tier</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">priority</span><span class="plain-syntax">, </span><span class="identifier-syntax">ISW</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">IOW</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-vp.html#SP7_3_1">&#167;7.3.1</a>.</li></ul>
@ -506,7 +506,8 @@ who is in the Dining Room" (note the additional "is"), it would.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">existential_OP_edge</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) { </span><span class="comment-syntax"> i.e., if we are looking for "(S which) verbs (O)"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;pre-verb-rc-marker&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">SW</span><span class="plain-syntax">)) { </span><span class="comment-syntax"> there is indeed a "which" at the end of </span><span class="extract"><span class="extract-syntax">SW</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;pre-verb-rc-marker&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); </span><span class="comment-syntax"> so trim it off</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Trimmed to: (%W) $w (%W)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><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">"Trimmed to: (%W) $w (%W)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">OW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -555,7 +556,7 @@ who is in the Dining Room" (note the additional "is"), it would.
<span class="plain-syntax"> </span><span class="identifier-syntax">usage_succeeds</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">usage_succeeds</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">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$w + $p + $p : failed for lack of $p\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><span class="plain-syntax">()) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$w + $p + $p : failed for lack of $p\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -578,7 +579,7 @@ who is in the Dining Room" (note the additional "is"), it would.
<span class="plain-syntax"> </span><span class="identifier-syntax">usage_succeeds</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">usage_succeeds</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">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$w + $p + $p : failed for lack of $p\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><span class="plain-syntax">()) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$w + $p + $p : failed for lack of $p\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -614,10 +615,12 @@ representing the verb.
<span class="plain-syntax"> </span><span class="identifier-syntax">VP_PN</span><span class="plain-syntax"> = </span><a href="5-vp.html#SP8" class="function-link"><span class="function-syntax">VerbPhrases::accept</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">vf</span><span class="plain-syntax">, </span><span class="identifier-syntax">VP_PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">SW</span><span class="plain-syntax">, </span><span class="identifier-syntax">OW</span><span class="plain-syntax">, </span><span class="identifier-syntax">O2W</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">VP_PN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">XP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VP_PN</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">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Accepted as $w + $p + $p\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><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">"Accepted as $w + $p + $p\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</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">else</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">trace_sentences</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Rejected as $w + $p + $p\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-vp.html#SP10" class="function-link"><span class="function-syntax">VerbPhrases::tracing</span></a><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">"Rejected as $w + $p + $p\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">second_prep</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-vp.html#SP7_3_1_2">&#167;7.3.1.2</a>.</li></ul>
@ -724,6 +727,18 @@ the exactly equivalent idea of the hat being worn by Darcy.
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-vp.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b></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">VerbPhrases::tracing</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">VerbPhrases::tracing</span></span>:<br/><a href="5-vp.html#SP6">&#167;6</a>, <a href="5-vp.html#SP7">&#167;7</a>, <a href="5-vp.html#SP7_3_1_1">&#167;7.3.1.1</a>, <a href="5-vp.html#SP7_3_1_2">&#167;7.3.1.2</a>, <a href="5-vp.html#SP7_3_1_2_1">&#167;7.3.1.2.1</a>, <a href="5-vp.html#SP7_3_1_2_2">&#167;7.3.1.2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">TRACING_LINGUISTICS_CALLBACK</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRACING_LINGUISTICS_CALLBACK</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRACING_LINGUISTICS_CALLBACK</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="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-np.html">&#10094;</a></li><li class="progresschapter"><a href="1-lm.html">1</a></li><li class="progresschapter"><a href="2-em.html">2</a></li><li class="progresschapter"><a href="3-aap.html">3</a></li><li class="progresschapter"><a href="4-vrb.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-dgr.html">dgr</a></li><li class="progresssection"><a href="5-vm.html">vm</a></li><li class="progresssection"><a href="5-np.html">np</a></li><li class="progresscurrent">vp</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->

View file

@ -60,8 +60,6 @@
<span class="plain-syntax"> </span><a href="../syntax-module/1-sm.html#SP3" class="function-link"><span class="function-syntax">SyntaxModule::start</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="../linguistics-module/1-lm.html#SP3" class="function-link"><span class="function-syntax">LinguisticsModule::start</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="1-ut.html#SP5" class="function-link"><span class="function-syntax">Unit::start_diagrams</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/3-cla.html#SP14" class="function-link"><span class="function-syntax">CommandLine::declare_heading</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="string-syntax">"linguistics-test: a tool for testing the linguistics module\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/3-cla.html#SP5" class="function-link"><span class="function-syntax">CommandLine::declare_switch</span></a><span class="plain-syntax">(</span><span class="constant-syntax">TEST_DIAGRAMS_CLSW</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"test-diagrams"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">,</span>
@ -79,7 +77,7 @@
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Main::respond</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><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">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEST_DIAGRAMS_CLSW:</span><span class="plain-syntax"> </span><a href="1-pc.html#SP1" class="function-link"><span class="function-syntax">Main::load</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Syntax.preform"</span><span class="plain-syntax">); </span><a href="1-ut.html#SP5" class="function-link"><span class="function-syntax">Unit::test_diagrams</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">arg</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEST_DIAGRAMS_CLSW:</span><span class="plain-syntax"> </span><a href="1-pc.html#SP1" class="function-link"><span class="function-syntax">Main::load</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Syntax.preform"</span><span class="plain-syntax">); </span><a href="1-ut.html#SP6" class="function-link"><span class="function-syntax">Unit::test_diagrams</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">arg</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>

View file

@ -52,7 +52,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../units.html">Unit Test Tools</a></li><li><a href="index.html">linguistics-test</a></li><li><a href="index.html#1">Chapter 1: Scaffolding</a></li><li><b>Unit Tests</b></li></ul></div>
<p class="purpose">How we shall test it.</p>
<ul class="toc"><li><a href="1-ut.html#SP2">&#167;2. What verb usages we allow</a></li><li><a href="1-ut.html#SP3">&#167;3. </a></li><li><a href="1-ut.html#SP5">&#167;5. Syntax tree</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-ut.html#SP2">&#167;2. What verb usages we allow</a></li><li><a href="1-ut.html#SP3">&#167;3. Minimal Preform grammar</a></li><li><a href="1-ut.html#SP6">&#167;6. Syntax tree</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b></p>
@ -75,24 +75,33 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b></p>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. Minimal Preform grammar. </b>Only <span class="extract"><span class="extract-syntax">&lt;dividing-sentence&gt;</span></span> can ever match, since the others are wired to match
any text but then fail.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;dividing-sentence&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">chapter</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"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">section</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"> 2</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">chapter</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"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">section</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"> 2</span>
<span class="Preform-function-syntax">&lt;structural-sentence&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"> TRUE; return FAIL_NONTERMINAL;</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; return FAIL_NONTERMINAL;</span>
<span class="Preform-function-syntax">&lt;language-modifying-sentence&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"> TRUE; return FAIL_NONTERMINAL;</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; return FAIL_NONTERMINAL;</span>
<span class="Preform-function-syntax">&lt;unexceptional-sentence&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;sentence&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="1-ut.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Report any error</span><span class="named-paragraph-number">3.1</span></a></span>
<span class="Preform-function-syntax">&lt;comma-divisible-sentence&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"> TRUE; return FAIL_NONTERMINAL;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>&#167;3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Report any error</span><span class="named-paragraph-number">3.1</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;unexceptional-sentence&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;sentence&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="1-ut.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Report any error</span><span class="named-paragraph-number">4.1</span></a></span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>&#167;4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Report any error</span><span class="named-paragraph-number">4.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -101,25 +110,21 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::nowhere</span></a><span class="plain-syntax">(</span><span class="string-syntax">"two certainties"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">XP</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VP_PN</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-ut.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b></p>
<ul class="endnotetexts"><li>This code is used in <a href="1-ut.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;stock&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">verb</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&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]; *XP = Conjugation::conjugate(WordAssemblages::from_wording(FW[1]), English_language);</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. Syntax tree. </b></p>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. Syntax tree. </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">my_first_verb</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Unit::start_diagrams</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">Unit::start_diagrams</span></span>:<br/>Program Control - <a href="1-pc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">syntax_tree</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">Unit::test_diagrams</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">Unit::test_diagrams</span></span>:<br/>Program Control - <a href="1-pc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Unit::test_diagrams</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">Unit::test_diagrams</span></span>:<br/>Program Control - <a href="1-pc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/2-str.html#SP20" class="function-link"><span class="function-syntax">Streams::enable_debugging</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><a href="../../../inweb/docs/foundation-module/3-fln.html#SP3" class="function-link"><span class="function-syntax">Filenames::from_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">arg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="constant-syntax">feed_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">FD</span><span class="plain-syntax"> = </span><a href="../words-module/3-fds.html#SP3" class="function-link"><span class="function-syntax">Feeds::begin</span></a><span class="plain-syntax">();</span>
@ -133,14 +138,15 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/2-str.html#SP20" class="function-link"><span class="function-syntax">Streams::enable_debugging</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-st.html#SP11" class="function-link"><span class="function-syntax">SyntaxTree::traverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">, </span><a href="1-ut.html#SP5" class="function-link"><span class="function-syntax">Unit::diagram</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-st.html#SP23" class="function-link"><span class="function-syntax">SyntaxTree::clear_trace</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-st.html#SP11" class="function-link"><span class="function-syntax">SyntaxTree::traverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">, </span><a href="1-ut.html#SP6" class="function-link"><span class="function-syntax">Unit::diagram</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-pn.html#SP15" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_DL</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">Unit::diagram</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</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><a href="../syntax-module/2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="../syntax-module/2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><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><a href="../syntax-module/2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="../syntax-module/2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><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="function-syntax">&lt;stock&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">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vc</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;rp&gt;&gt;</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">cop</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -73,7 +73,7 @@
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Main::respond</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><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">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEST_PROBLEMS_CLSW:</span><span class="plain-syntax"> </span><a href="1-pc.html#SP1" class="function-link"><span class="function-syntax">Main::load</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Syntax.preform"</span><span class="plain-syntax">); </span><a href="1-ut.html#SP2" class="function-link"><span class="function-syntax">Unit::test_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">arg</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TEST_PROBLEMS_CLSW:</span><span class="plain-syntax"> </span><a href="1-pc.html#SP1" class="function-link"><span class="function-syntax">Main::load</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Syntax.preform"</span><span class="plain-syntax">); </span><a href="1-ut.html#SP4" class="function-link"><span class="function-syntax">Unit::test_problems</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">arg</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>

View file

@ -52,28 +52,40 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../units.html">Unit Test Tools</a></li><li><a href="index.html">problems-test</a></li><li><a href="index.html#1">Chapter 1: Scaffolding</a></li><li><b>Unit Tests</b></li></ul></div>
<p class="purpose">How we shall test it.</p>
<ul class="toc"><li><a href="1-ut.html#SP1">&#167;1. </a></li><li><a href="1-ut.html#SP2">&#167;2. Syntax tree</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-ut.html#SP1">&#167;1. </a></li><li><a href="1-ut.html#SP2">&#167;2. Minimal Preform grammar</a></li><li><a href="1-ut.html#SP4">&#167;4. Syntax tree</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b></p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-reserved-syntax">parse_node_tree</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">syntax_tree</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">;</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Minimal Preform grammar. </b>Only <span class="extract"><span class="extract-syntax">&lt;dividing-sentence&gt;</span></span> can ever match, since the others are wired to match
any text but then fail.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;dividing-sentence&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">chapter</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"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">section</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"> 2</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">chapter</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"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">section</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"> 2</span>
<span class="Preform-function-syntax">&lt;structural-sentence&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"> TRUE; return FAIL_NONTERMINAL;</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; return FAIL_NONTERMINAL;</span>
<span class="Preform-function-syntax">&lt;language-modifying-sentence&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"> TRUE; return FAIL_NONTERMINAL;</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; return FAIL_NONTERMINAL;</span>
<span class="Preform-function-syntax">&lt;scan-individual-phrase&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-constant-syntax">banana</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="1-ut.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_UnexpectedFruit problem</span><span class="named-paragraph-number">1.1</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-function-syntax">&lt;comma-divisible-sentence&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"> TRUE; return FAIL_NONTERMINAL;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>&#167;1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_UnexpectedFruit problem</span><span class="named-paragraph-number">1.1</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;scan-individual-phrase&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-constant-syntax">banana</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="1-ut.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Issue PM_UnexpectedFruit problem</span><span class="named-paragraph-number">3.1</span></a></span><span class="Preform-constant-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>&#167;3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue PM_UnexpectedFruit problem</span><span class="named-paragraph-number">3.1</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -84,8 +96,8 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="string-syntax">"will be ruined."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../problems-module/2-pl2.html#SP9" class="function-link"><span class="function-syntax">Problems::issue_problem_end</span></a><span class="plain-syntax">();</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-ut.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Syntax tree. </b></p>
<ul class="endnotetexts"><li>This code is used in <a href="1-ut.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. Syntax tree. </b></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">Unit::test_problems</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">Unit::test_problems</span></span>:<br/>Program Control - <a href="1-pc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">) {</span>
@ -98,12 +110,12 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"Read %d words\n"</span><span class="plain-syntax">, </span><a href="../words-module/3-wrd.html#SP8" class="function-link"><span class="function-syntax">Wordings::length</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="../syntax-module/3-snt.html#SP5" class="function-link"><span class="function-syntax">Sentences::break</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-st.html#SP11" class="function-link"><span class="function-syntax">SyntaxTree::traverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">, </span><a href="1-ut.html#SP2" class="function-link"><span class="function-syntax">Unit::scan_tree</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-st.html#SP11" class="function-link"><span class="function-syntax">SyntaxTree::traverse</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">, </span><a href="1-ut.html#SP4" class="function-link"><span class="function-syntax">Unit::scan_tree</span></a><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">Unit::scan_tree</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</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><a href="../syntax-module/2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="../syntax-module/2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><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><a href="../syntax-module/2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="../syntax-module/2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;scan-individual-phrase&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="plain-syntax">}</span>

View file

@ -111,7 +111,7 @@ fields are blank.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="function-syntax">CopyErrors::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">CopyErrors::new</span></span>:<br/>Source Text - <a href="6-st.html#SP13">&#167;13</a><br/>Headings - <a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP21_1">&#167;21.1</a>, <a href="6-hdn.html#SP22_2">&#167;22.2</a>, <a href="6-hdn.html#SP21_3">&#167;21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">&#167;2.1</a>, <a href="6-inc.html#SP5_1_2">&#167;5.1.2</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP8_1">&#167;8.1</a>, <a href="6-inc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">subcat</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="function-syntax">CopyErrors::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">CopyErrors::new</span></span>:<br/>Source Text - <a href="6-st.html#SP14">&#167;14</a><br/>Headings - <a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP21_1">&#167;21.1</a>, <a href="6-hdn.html#SP22_2">&#167;22.2</a>, <a href="6-hdn.html#SP21_3">&#167;21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">&#167;2.1</a>, <a href="6-inc.html#SP5_1_2">&#167;5.1.2</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP8_1">&#167;8.1</a>, <a href="6-inc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">subcat</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">copy_error</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">copy</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">CE</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">error_category</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cat</span><span class="plain-syntax">;</span>
@ -171,7 +171,7 @@ we also offer these functions to tack extra details on:
<span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">details_work2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">w2</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">CopyErrors::supply_node</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">CopyErrors::supply_node</span></span>:<br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP13">&#167;13</a><br/>Headings - <a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP21_1">&#167;21.1</a>, <a href="6-hdn.html#SP21_2">&#167;21.2</a>, <a href="6-hdn.html#SP21_3">&#167;21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">&#167;2.1</a>, <a href="6-inc.html#SP5_1_1">&#167;5.1.1</a>, <a href="6-inc.html#SP5_1_2">&#167;5.1.2</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP8_1">&#167;8.1</a>, <a href="6-inc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">n</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CopyErrors::supply_node</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">CopyErrors::supply_node</span></span>:<br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP14">&#167;14</a><br/>Headings - <a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP21_1">&#167;21.1</a>, <a href="6-hdn.html#SP21_2">&#167;21.2</a>, <a href="6-hdn.html#SP21_3">&#167;21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">&#167;2.1</a>, <a href="6-inc.html#SP5_1_1">&#167;5.1.1</a>, <a href="6-inc.html#SP5_1_2">&#167;5.1.2</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP8_1">&#167;8.1</a>, <a href="6-inc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">n</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">details_node</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -144,7 +144,7 @@ for later reporting. These are stored 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">Copies::attach_error</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">Copies::attach_error</span></span>:<br/>Extension Services - <a href="5-es.html#SP2_2">&#167;2.2</a>, <a href="5-es.html#SP2_2_3">&#167;2.2.3</a>, <a href="5-es.html#SP2_2_3_2">&#167;2.2.3.2</a>, <a href="5-es.html#SP2_3">&#167;2.3</a><br/>Kit Services - <a href="5-ks.html#SP5">&#167;5</a>, <a href="5-ks.html#SP5_1">&#167;5.1</a>, <a href="5-ks.html#SP5_3">&#167;5.3</a><br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP3">&#167;3</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP13">&#167;13</a><br/>Headings - <a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP21_1">&#167;21.1</a>, <a href="6-hdn.html#SP22_2">&#167;22.2</a>, <a href="6-hdn.html#SP21_2">&#167;21.2</a>, <a href="6-hdn.html#SP21_3">&#167;21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">&#167;2.1</a>, <a href="6-inc.html#SP5_1_1">&#167;5.1.1</a>, <a href="6-inc.html#SP5_1_2">&#167;5.1.2</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP8_1">&#167;8.1</a>, <a href="6-inc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Copies::attach_error</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">Copies::attach_error</span></span>:<br/>Extension Services - <a href="5-es.html#SP2_2">&#167;2.2</a>, <a href="5-es.html#SP2_2_3">&#167;2.2.3</a>, <a href="5-es.html#SP2_2_3_2">&#167;2.2.3.2</a>, <a href="5-es.html#SP2_3">&#167;2.3</a><br/>Kit Services - <a href="5-ks.html#SP5">&#167;5</a>, <a href="5-ks.html#SP5_1">&#167;5.1</a>, <a href="5-ks.html#SP5_3">&#167;5.3</a><br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP3">&#167;3</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP14">&#167;14</a><br/>Headings - <a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP21_1">&#167;21.1</a>, <a href="6-hdn.html#SP22_2">&#167;22.2</a>, <a href="6-hdn.html#SP21_2">&#167;21.2</a>, <a href="6-hdn.html#SP21_3">&#167;21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">&#167;2.1</a>, <a href="6-inc.html#SP5_1_1">&#167;5.1.1</a>, <a href="6-inc.html#SP5_1_2">&#167;5.1.2</a>, <a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP8_1">&#167;8.1</a>, <a href="6-inc.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</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">C</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no copy to attach to"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ce.html#SP4" class="function-link"><span class="function-syntax">CopyErrors::supply_attached_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">errors_reading_source_text</span><span class="plain-syntax">);</span>

View file

@ -113,7 +113,7 @@ which stores data about extensions used by the Inform compiler.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="function-syntax">ExtensionManager::from_copy</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">ExtensionManager::from_copy</span></span>:<br/><a href="4-em.html#SP8">&#167;8</a>, <a href="4-em.html#SP9">&#167;9</a><br/>Extension Services - <a href="5-es.html#SP8">&#167;8</a><br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP12">&#167;12</a><br/>Inclusions - <a href="6-inc.html#SP5_1">&#167;5.1</a><br/>Dictionary - <a href="7-dct.html#SP9">&#167;9</a><br/>Census - <a href="7-cns.html#SP5">&#167;5</a>, <a href="7-cns.html#SP6">&#167;6</a><br/>Index Pages - <a href="7-ip.html#SP1_1_2_1_6_4_4">&#167;1.1.2.1.6.4.4</a><br/>Individual Pages - <a href="7-ip2.html#SP2_1">&#167;2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="function-syntax">ExtensionManager::from_copy</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">ExtensionManager::from_copy</span></span>:<br/><a href="4-em.html#SP8">&#167;8</a>, <a href="4-em.html#SP9">&#167;9</a><br/>Extension Services - <a href="5-es.html#SP8">&#167;8</a><br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP13">&#167;13</a><br/>Inclusions - <a href="6-inc.html#SP5_1">&#167;5.1</a><br/>Dictionary - <a href="7-dct.html#SP9">&#167;9</a><br/>Census - <a href="7-cns.html#SP5">&#167;5</a>, <a href="7-cns.html#SP6">&#167;6</a><br/>Index Pages - <a href="7-ip.html#SP1_1_2_1_6_4_4">&#167;1.1.2.1.6.4.4</a><br/>Individual Pages - <a href="7-ip2.html#SP2_1">&#167;2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</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">C</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">C</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">edition</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">genre</span><span class="plain-syntax"> == </span><span class="identifier-syntax">extension_genre</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">RETRIEVE_POINTER_inform_extension</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">metadata</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>

View file

@ -415,7 +415,7 @@ use an extension which is marked as not working on the current VM.
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b></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">Inclusions::check_begins_here</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">Inclusions::check_begins_here</span></span>:<br/>Source Text - <a href="6-st.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Inclusions::check_begins_here</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">Inclusions::check_begins_here</span></span>:<br/>Source Text - <a href="6-st.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">inclusions_errors_to</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inclusions_errors_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;begins-here-sentence-subject&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">));</span>
@ -431,7 +431,7 @@ the "begins here".
<span class="Preform-function-syntax">&lt;the-prefix-for-extensions&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">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span>
<span class="Preform-reserved-syntax">void</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">Inclusions::check_ends_here</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="Preform-comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="Preform-function-syntax">Inclusions::check_ends_here</span></span>:<br/>Source Text - <a href="6-st.html#SP12">&#167;12</a></span></button><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">PN</span><span class="Preform-plain-syntax">, </span><span class="Preform-reserved-syntax">inform_extension</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">E</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-reserved-syntax">void</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">Inclusions::check_ends_here</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="Preform-comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="Preform-function-syntax">Inclusions::check_ends_here</span></span>:<br/>Source Text - <a href="6-st.html#SP13">&#167;13</a></span></button><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">PN</span><span class="Preform-plain-syntax">, </span><span class="Preform-reserved-syntax">inform_extension</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">E</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">inbuild_copy</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">S</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">inclusions_errors_to</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">inclusions_errors_to</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">E</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-element-syntax">as_copy</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">wording</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Node::get_text</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">PN</span><span class="Preform-plain-syntax">);</span>

View file

@ -219,7 +219,7 @@ finished loading the bulk in, it calls:
not for <a href="../inbuild/index.html" class="internal">inbuild</a>, which isn't in the inventions business.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SENTENCE_ANNOTATION_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="6-st.html#SP7" class="function-link"><span class="function-syntax">SourceText::annotate_new_sentence</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="6-st.html#SP7" class="function-link"><span class="function-syntax">SourceText::annotate_new_sentence</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::annotate_new_sentence</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</span><span class="plain-syntax">) {</span>
@ -360,7 +360,27 @@ never accidentally match in the main source text.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">include</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-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"> 0; sfsm-&gt;nt = INFORM6CODE_NT;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>Properly speaking, despite the definition above, language modifying sentences
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>Rules are ordinarily detected by their colon, which divides the header from the
rest: colons are not otherwise legal in Inform. But there's an exception. If the
sentence consists of text matching the following grammar, followed by comma,
followed by more text, then the comma is read as if it's a colon and the
sentence becomes a rule. For example:
</p>
<blockquote>
<p>Instead of going north, try entering the cage</p>
</blockquote>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;comma-divisible-sentence&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">instead</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">of</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-constant-syntax">every</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">turn</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">before</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-constant-syntax">after</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-constant-syntax">when</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>Properly speaking, despite the definition above, language modifying sentences
are nonstructural. So what are they doing here? The answer is that we need to
read them early on, because they affect the way that they parse all other
sentences. Whereas other nonstructural sentences can wait, these can't.
@ -372,12 +392,12 @@ sentences. Whereas other nonstructural sentences can wait, these can't.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">use</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">language</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">element/elements</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> -1</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>The following callback function is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it breaks a
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>The following callback function is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it breaks a
sentence of type <span class="extract"><span class="Preform-extract-syntax">BEGINHERE_NT</span></span> or <span class="extract"><span class="Preform-extract-syntax">ENDHERE_NT</span></span> &mdash; i.e., the beginning or end
of an extension.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="Preform-constant-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span><span class="Preform-plain-syntax"> </span><a href="6-st.html#SP12" class="function-link"><span class="Preform-function-syntax">SourceText::new_beginend</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="Preform-constant-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span><span class="Preform-plain-syntax"> </span><a href="6-st.html#SP13" class="function-link"><span class="Preform-function-syntax">SourceText::new_beginend</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::new_beginend</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">) {</span>
@ -386,7 +406,7 @@ of an extension.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ENDHERE_NT</span><span class="plain-syntax">) </span><a href="6-inc.html#SP10" class="function-link"><span class="function-syntax">Inclusions::check_ends_here</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">E</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>Lastly, this callback is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it hits a sentence like:
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>Lastly, this callback is called by <a href="../syntax-module/index.html" class="internal">syntax</a> when it hits a sentence like:
</p>
<blockquote>
@ -397,7 +417,7 @@ of an extension.
stack into the new world of kits), so we issue a syntax error.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LANGUAGE_ELEMENT_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="6-st.html#SP13" class="function-link"><span class="function-syntax">SourceText::new_language</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LANGUAGE_ELEMENT_SYNTAX_CALLBACK</span><span class="plain-syntax"> </span><a href="6-st.html#SP14" class="function-link"><span class="function-syntax">SourceText::new_language</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::new_language</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>

View file

@ -84,19 +84,19 @@ all we need do is set up some debugging log facilities.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxModule::start</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP4" class="function-link"><span class="function-syntax">NodeType::make_parentage_allowed_table</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::metadata_setup</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP12" class="function-link"><span class="function-syntax">NodeType::metadata_setup</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP12" class="function-link"><span class="function-syntax">Annotations::make_annotation_allowed_table</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger</span><span class="plain-syntax">(</span><span class="character-syntax">'m'</span><span class="plain-syntax">, </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">m</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">syntax</span><span class="plain-syntax"> </span><span class="identifier-syntax">tree</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger_I</span><span class="plain-syntax">(</span><span class="character-syntax">'N'</span><span class="plain-syntax">, </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::log</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">N</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">individual</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> </span><span class="identifier-syntax">type</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger</span><span class="plain-syntax">(</span><span class="character-syntax">'P'</span><span class="plain-syntax">, </span><a href="2-pn.html#SP18" class="function-link"><span class="function-syntax">Node::log_node</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">P</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">individual</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger</span><span class="plain-syntax">(</span><span class="character-syntax">'T'</span><span class="plain-syntax">, </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_subtree</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">T</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">tree</span><span class="plain-syntax"> </span><span class="identifier-syntax">under</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger</span><span class="plain-syntax">(</span><span class="character-syntax">'m'</span><span class="plain-syntax">, </span><a href="2-pn.html#SP15" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">m</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">syntax</span><span class="plain-syntax"> </span><span class="identifier-syntax">tree</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger_I</span><span class="plain-syntax">(</span><span class="character-syntax">'N'</span><span class="plain-syntax">, </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::log</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">N</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">individual</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> </span><span class="identifier-syntax">type</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger</span><span class="plain-syntax">(</span><span class="character-syntax">'P'</span><span class="plain-syntax">, </span><a href="2-pn.html#SP17" class="function-link"><span class="function-syntax">Node::log_node</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">P</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">individual</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Writers::register_logger</span><span class="plain-syntax">(</span><span class="character-syntax">'T'</span><span class="plain-syntax">, </span><a href="2-pn.html#SP15" class="function-link"><span class="function-syntax">Node::log_subtree</span></a><span class="plain-syntax">); /* |$</span><span class="identifier-syntax">T</span><span class="plain-syntax">| = </span><span class="identifier-syntax">log</span><span class="plain-syntax"> </span><span class="identifier-syntax">tree</span><span class="plain-syntax"> </span><span class="identifier-syntax">under</span><span class="plain-syntax"> </span><span class="identifier-syntax">node</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">SyntaxModule::end</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</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="P-wtmd.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresscurrentchapter">1</li><li class="progresscurrent">sm</li><li class="progresschapter"><a href="2-st.html">2</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="2-st.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="P-htitm.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresscurrentchapter">1</li><li class="progresscurrent">sm</li><li class="progresschapter"><a href="2-st.html">2</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="2-st.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -104,7 +104,7 @@ is unannotated.
</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">Annotations::clear</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">Annotations::clear</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP3">&#167;3</a>, <a href="2-pn.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::clear</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">Annotations::clear</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP2">&#167;2</a>, <a href="2-pn.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -128,7 +128,7 @@ other for reading pointers to objects.
</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">Annotations::read_int</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">Annotations::read_int</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP4_1">&#167;4.1</a>, <a href="2-st.html#SP17">&#167;17</a><br/>Parse Nodes - <a href="2-pn.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::read_int</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">Annotations::read_int</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP4_1">&#167;4.1</a>, <a href="2-st.html#SP17">&#167;17</a><br/>Parse Nodes - <a href="2-pn.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><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">parse_node_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pna</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">PN</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">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">pna</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_annotation</span><span class="plain-syntax">)</span>
@ -154,7 +154,7 @@ one (on the same node) overwrites it, but this is not an error.
</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">Annotations::write_int</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">Annotations::write_int</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9">&#167;6.9</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a>, <a href="3-snt.html#SP6_9_5">&#167;6.9.5</a>, <a href="3-snt.html#SP6_9_8">&#167;6.9.8</a>, <a href="3-snt.html#SP6_9_9">&#167;6.9.9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::write_int</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">Annotations::write_int</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9">&#167;6.9</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a>, <a href="3-snt.html#SP6_9_7">&#167;6.9.7</a>, <a href="3-snt.html#SP6_9_8">&#167;6.9.8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">v</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">newpna</span><span class="plain-syntax">, *</span><span class="identifier-syntax">pna</span><span class="plain-syntax">, *</span><span class="identifier-syntax">final</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">PN</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"annotated null PN"</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">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">pna</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_annotation</span><span class="plain-syntax">) {</span>
@ -224,7 +224,7 @@ wants to.
</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">Annotations::copy</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Annotations::copy</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::copy</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Annotations::copy</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</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">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">parse_node_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pna</span><span class="plain-syntax"> = </span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">, *</span><span class="identifier-syntax">latest</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">pna</span><span class="plain-syntax">; </span><span class="identifier-syntax">pna</span><span class="plain-syntax">=</span><span class="identifier-syntax">pna</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_annotation</span><span class="plain-syntax">) {</span>
@ -284,7 +284,7 @@ expected also to call the following:
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::allow_for_category</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">Annotations::allow_for_category</span></span>:<br/><a href="2-na.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">annot</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_ENUMERATED_NTS</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::category</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">) == </span><span class="identifier-syntax">cat</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::category</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">) == </span><span class="identifier-syntax">cat</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP13" class="function-link"><span class="function-syntax">Annotations::allow</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">annot</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -306,8 +306,8 @@ is rarely used by Inform, but is needed when a node changes its type.
</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">Annotations::clear_invalid</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">Annotations::clear_invalid</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Annotations::clear_invalid</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">Annotations::clear_invalid</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (!(</span><a href="2-na.html#SP14" class="function-link"><span class="function-syntax">Annotations::is_allowed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotation_id</span><span class="plain-syntax">))))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">annotations</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_annotation</span><span class="plain-syntax">;</span>

View file

@ -1,7 +1,7 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Node Tyoes</title>
<title>Node Types</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@ -61,12 +61,12 @@ function togglePopup(material_id) {
</ul>
</nav>
<main role="main">
<!--Weave of 'Node Tyoes' generated by Inweb-->
<!--Weave of 'Node Types' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">syntax</a></li><li><a href="index.html#2">Chapter 2: The Parse Tree</a></li><li><b>Node Tyoes</b></li></ul></div>
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">syntax</a></li><li><a href="index.html#2">Chapter 2: The Parse Tree</a></li><li><b>Node Types</b></li></ul></div>
<p class="purpose">Each node in a syntax tree has a type, which informs whether it can have child nodes, and what in general terms it means.</p>
<ul class="toc"><li><a href="2-nt.html#SP1">&#167;1. Node types</a></li><li><a href="2-nt.html#SP3">&#167;3. Metadata on node types</a></li><li><a href="2-nt.html#SP7">&#167;7. Logging</a></li><li><a href="2-nt.html#SP8">&#167;8. Creation</a></li><li><a href="2-nt.html#SP9">&#167;9. Basic properties</a></li><li><a href="2-nt.html#SP11">&#167;11. Node types used by the syntax module</a></li><li><a href="2-nt.html#SP12">&#167;12. Parentage rules</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-nt.html#SP1">&#167;1. Node types</a></li><li><a href="2-nt.html#SP3">&#167;3. Metadata on node types</a></li><li><a href="2-nt.html#SP8">&#167;8. Logging</a></li><li><a href="2-nt.html#SP9">&#167;9. Creation</a></li><li><a href="2-nt.html#SP10">&#167;10. Basic properties</a></li><li><a href="2-nt.html#SP12">&#167;12. Node types used by the syntax module</a></li><li><a href="2-nt.html#SP13">&#167;13. Parentage rules</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Node types. </b>Each node has a "node type". Some of those are defined here with <span class="extract"><span class="extract-syntax">*_NT</span></span>
names &mdash; these are the "enumerated" node types. But every <span class="extract"><span class="extract-syntax">*_MC</span></span> code,
@ -88,7 +88,7 @@ enumerated codes all have bit 32 set, and therefore no <span class="extract"><sp
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">=</span><span class="constant-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">; </span><span class="identifier-syntax">t</span><span class="plain-syntax">&lt;</span><span class="constant-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">+</span><span class="identifier-syntax">NO_DEFINED_NT_VALUES</span><span class="plain-syntax">; </span><span class="identifier-syntax">t</span><span class="plain-syntax">++)</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::is_enumerated</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">NodeType::is_enumerated</span></span>:<br/><a href="2-nt.html#SP6">&#167;6</a>, <a href="2-nt.html#SP8">&#167;8</a><br/>Node Annotations - <a href="2-na.html#SP14">&#167;14</a><br/>Tree Verification - <a href="2-tv.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::is_enumerated</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">NodeType::is_enumerated</span></span>:<br/><a href="2-nt.html#SP7">&#167;7</a>, <a href="2-nt.html#SP9">&#167;9</a><br/>Node Annotations - <a href="2-na.html#SP14">&#167;14</a><br/>Tree Verification - <a href="2-tv.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</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">t</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">+</span><span class="identifier-syntax">NO_DEFINED_NT_VALUES</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>
@ -132,19 +132,34 @@ to be children of which others, thus enforcing this hierarchy.
<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">NO_DEFINED_NCAT_VALUES</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">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">NO_DEFINED_NCAT_VALUES</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">][</span><span class="identifier-syntax">j</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">parentage_allowed</span><span class="plain-syntax">[</span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">][</span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">] = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP5" class="function-link"><span class="function-syntax">NodeType::allow_parentage_for_categories</span></a><span class="plain-syntax">(</span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</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">PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">EVEN_MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">EVEN_MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>The bitmap of node flags currently contains only two:
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>The callback function <span class="extract"><span class="extract-syntax">PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span></span> should
call this as needed to fill in more permissions:
</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">NodeType::allow_parentage_for_categories</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">NodeType::allow_parentage_for_categories</span></span>:<br/><a href="2-nt.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parentage_allowed</span><span class="plain-syntax">[</span><span class="identifier-syntax">A</span><span class="plain-syntax">][</span><span class="identifier-syntax">B</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="SP6"></a><b>&#167;6. </b>The bitmap of node flags currently contains only two:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000001</span><span class="plain-syntax"> </span><span class="comment-syntax"> not visited in traverses</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">TABBED_NFLAG</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000002</span><span class="plain-syntax"> </span><span class="comment-syntax"> contains tab-delimited lists</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>And the metadata is stored in this table, whose indexes are offset by
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>And the metadata is stored in this table, whose indexes are offset by
<span class="extract"><span class="extract-syntax">ENUMERATED_NT_BASE</span></span>. We can therefore only retrieve metadata on
enumerated node types, not on meaning codes such as <span class="extract"><span class="extract-syntax">RULE_MC</span></span>, for which
the following function will return <span class="extract"><span class="extract-syntax">NULL</span></span>.
@ -153,7 +168,7 @@ the following function will return <span class="extract"><span class="extract-sy
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> </span><span class="identifier-syntax">node_type_metadatas</span><span class="plain-syntax">[</span><span class="identifier-syntax">NO_DEFINED_NT_VALUES</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="function-syntax">NodeType::get_metadata</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">NodeType::get_metadata</span></span>:<br/><a href="2-nt.html#SP7">&#167;7</a>, <a href="2-nt.html#SP9">&#167;9</a>, <a href="2-nt.html#SP12">&#167;12</a><br/>Tree Verification - <a href="2-tv.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="function-syntax">NodeType::get_metadata</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">NodeType::get_metadata</span></span>:<br/><a href="2-nt.html#SP8">&#167;8</a>, <a href="2-nt.html#SP10">&#167;10</a>, <a href="2-nt.html#SP13">&#167;13</a><br/>Tree Verification - <a href="2-tv.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP2" class="function-link"><span class="function-syntax">NodeType::is_enumerated</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">node_type_metadatas</span><span class="plain-syntax">[</span><span class="identifier-syntax">t</span><span class="plain-syntax"> - </span><span class="constant-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">]);</span>
@ -166,14 +181,14 @@ the following function will return <span class="extract"><span class="extract-sy
<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>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. Logging. </b>In the event that metadata isn't available, because the node is not
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. Logging. </b>In the event that metadata isn't available, because the node is not
enumerated, we allow a callback function (if provided) to do the job for us.
</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">NodeType::log</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">NodeType::log</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a><br/>Parse Nodes - <a href="2-pn.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">it</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::log</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">NodeType::log</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a><br/>Parse Nodes - <a href="2-pn.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">it</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = (</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax">) </span><span class="identifier-syntax">it</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">metadata</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">metadata</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type_name</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG_UNENUMERATED_NODE_TYPES_SYNTAX_CALLBACK</span>
@ -185,10 +200,10 @@ enumerated, we allow a callback function (if provided) to do the job for us.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. Creation. </b></p>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. Creation. </b></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">NodeType::new</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">NodeType::new</span></span>:<br/><a href="2-nt.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">identity</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">node_type_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">min_children</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::new</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">NodeType::new</span></span>:<br/><a href="2-nt.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">identity</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">node_type_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">min_children</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">max_children</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">category</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">node_flags</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP2" class="function-link"><span class="function-syntax">NodeType::is_enumerated</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">identity</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"set bad metadata"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ptnt</span><span class="plain-syntax"> =</span>
@ -201,46 +216,46 @@ enumerated, we allow a callback function (if provided) to do the job for us.
<span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">node_flags</span><span class="plain-syntax"> = </span><span class="identifier-syntax">node_flags</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. Basic properties. </b></p>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. Basic properties. </b></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">NodeType::category</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">NodeType::category</span></span>:<br/>Node Annotations - <a href="2-na.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::category</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">NodeType::category</span></span>:<br/>Node Annotations - <a href="2-na.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">metadata</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">metadata</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">category</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">INVALID_NCAT</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">NodeType::is_top_level</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">NodeType::is_top_level</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP11">&#167;11</a>, <a href="2-st.html#SP13">&#167;13</a>, <a href="2-st.html#SP14">&#167;14</a>, <a href="2-st.html#SP15">&#167;15</a>, <a href="2-st.html#SP16">&#167;16</a>, <a href="2-st.html#SP17">&#167;17</a>, <a href="2-st.html#SP18">&#167;18</a>, <a href="2-st.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::category</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">) == </span><span class="constant-syntax">L1_NCAT</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::is_top_level</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">NodeType::is_top_level</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP11">&#167;11</a>, <a href="2-st.html#SP13">&#167;13</a>, <a href="2-st.html#SP14">&#167;14</a>, <a href="2-st.html#SP15">&#167;15</a>, <a href="2-st.html#SP16">&#167;16</a>, <a href="2-st.html#SP17">&#167;17</a>, <a href="2-st.html#SP18">&#167;18</a>, <a href="2-st.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::category</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">) == </span><span class="constant-syntax">L1_NCAT</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>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::has_flag</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">NodeType::has_flag</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP12">&#167;12</a><br/>Sentences - <a href="3-snt.html#SP5_1">&#167;5.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">f</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::has_flag</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">NodeType::has_flag</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP12">&#167;12</a><br/>Sentences - <a href="3-snt.html#SP5_1">&#167;5.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">f</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">metadata</span><span class="plain-syntax">) &amp;&amp; ((</span><span class="identifier-syntax">metadata</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_flags</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">f</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>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">NodeType::get_name</span><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">metadata</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">I</span><span class="string-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">metadata</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>This provides a way for users of the module to indicate what's a sentence:
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>This provides a way for users of the module to indicate what's a sentence:
</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">NodeType::is_sentence</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">NodeType::is_sentence</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP11">&#167;11</a>, <a href="2-st.html#SP13">&#167;13</a>, <a href="2-st.html#SP14">&#167;14</a>, <a href="2-st.html#SP15">&#167;15</a>, <a href="2-st.html#SP16">&#167;16</a>, <a href="2-st.html#SP17">&#167;17</a>, <a href="2-st.html#SP19">&#167;19</a>, <a href="2-st.html#SP20">&#167;20</a>, <a href="2-st.html#SP21">&#167;21</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</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">SENTENCE_NODE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">SENTENCE_NODE_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::is_sentence</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">NodeType::is_sentence</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP11">&#167;11</a>, <a href="2-st.html#SP13">&#167;13</a>, <a href="2-st.html#SP14">&#167;14</a>, <a href="2-st.html#SP15">&#167;15</a>, <a href="2-st.html#SP16">&#167;16</a>, <a href="2-st.html#SP17">&#167;17</a>, <a href="2-st.html#SP19">&#167;19</a>, <a href="2-st.html#SP20">&#167;20</a>, <a href="2-st.html#SP21">&#167;21</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</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">IS_SENTENCE_NODE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">IS_SENTENCE_NODE_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">SENTENCE_NODE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IS_SENTENCE_NODE_SYNTAX_CALLBACK</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="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. Node types used by the syntax module. </b>The <a href="index.html" class="internal">syntax</a> module uses only the following node types, but our client modules
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Node types used by the syntax module. </b>The <a href="index.html" class="internal">syntax</a> module uses only the following node types, but our client modules
add substantially more. The three callback functions provide opportunities to
do this. All a bit clumsy, but it works.
</p>
@ -256,18 +271,18 @@ do this. All a bit clumsy, but it works.
<span class="definition-keyword">enum</span> <span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "arfle barfle gloop"</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::metadata_setup</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">NodeType::metadata_setup</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"(INVALID_NT)"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">INVALID_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::metadata_setup</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">NodeType::metadata_setup</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"(INVALID_NT)"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">INVALID_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ROOT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUSION_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUSION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"HEADING_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUDE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUDE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"BEGINHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ENDHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"SENTENCE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"AMBIGUITY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"UNKNOWN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">UNKNOWN_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ROOT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUSION_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUSION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"HEADING_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUDE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INCLUDE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"BEGINHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"ENDHERE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"SENTENCE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"AMBIGUITY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L1_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"UNKNOWN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">UNKNOWN_NCAT</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">NODE_METADATA_SETUP_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NODE_METADATA_SETUP_SYNTAX_CALLBACK</span><span class="plain-syntax">();</span>
@ -280,15 +295,15 @@ do this. All a bit clumsy, but it works.
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Parentage rules. </b>It's mostly the case that node category determines whether one node can be
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. Parentage rules. </b>It's mostly the case that node category determines whether one node can be
parent to another, but there are exceptions.
</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">NodeType::parentage_allowed</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">NodeType::parentage_allowed</span></span>:<br/>Tree Verification - <a href="2-tv.html#SP4_3">&#167;4.3</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">, </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t_child</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata_parent</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">NodeType::parentage_allowed</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">NodeType::parentage_allowed</span></span>:<br/>Tree Verification - <a href="2-tv.html#SP4_3">&#167;4.3</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">, </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t_child</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata_parent</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t_parent</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">metadata_parent</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">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata_child</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t_child</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata_child</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t_child</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">metadata_child</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">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="identifier-syntax">cat_child</span><span class="plain-syntax"> = </span><span class="identifier-syntax">metadata_child</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">category</span><span class="plain-syntax">;</span>

View file

@ -78,9 +78,9 @@ MathJax = {
<!--Weave of 'Parse Nodes' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">syntax</a></li><li><a href="index.html#2">Chapter 2: The Parse Tree</a></li><li><b>Parse Nodes</b></li></ul></div>
<p class="purpose">To represent atomic pieces of meaning; or, less pretentiously, to provide the nodes of which syntax trees are made up.</p>
<p class="purpose">Syntax trees are made of single nodes, each representing one way to understand a given piece of text.</p>
<ul class="toc"><li><a href="2-pn.html#SP1">&#167;1. Nodes themselves</a></li><li><a href="2-pn.html#SP3">&#167;3. Creation</a></li><li><a href="2-pn.html#SP6">&#167;6. Annotations</a></li><li><a href="2-pn.html#SP9">&#167;9. Copying parse nodes</a></li><li><a href="2-pn.html#SP12">&#167;12. Child count</a></li><li><a href="2-pn.html#SP13">&#167;13. Detection of subnodes</a></li><li><a href="2-pn.html#SP14">&#167;14. The word range beneath a given node</a></li><li><a href="2-pn.html#SP16">&#167;16. Logging the parse tree</a></li><li><a href="2-pn.html#SP20">&#167;20. Ambiguity subtrees</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-pn.html#SP1">&#167;1. Nodes themselves</a></li><li><a href="2-pn.html#SP2">&#167;2. Creation</a></li><li><a href="2-pn.html#SP5">&#167;5. Annotations</a></li><li><a href="2-pn.html#SP8">&#167;8. Copying parse nodes</a></li><li><a href="2-pn.html#SP11">&#167;11. Child count</a></li><li><a href="2-pn.html#SP12">&#167;12. Detection of subnodes</a></li><li><a href="2-pn.html#SP13">&#167;13. The word range beneath a given node</a></li><li><a href="2-pn.html#SP15">&#167;15. Logging the parse tree</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Nodes themselves. </b>Each node is an instance of this:
</p>
@ -88,87 +88,78 @@ MathJax = {
<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">parse_node</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">text_parsed</span><span class="plain-syntax">; </span><span class="comment-syntax"> the text being interpreted by this node</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">node_type</span><span class="plain-syntax">; </span><span class="comment-syntax"> what the node basically represents</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">parse_node_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">annotations</span><span class="plain-syntax">; </span><span class="comment-syntax"> see </span><a href="2-na.html" class="internal">Node Annotations</a>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">down</span><span class="plain-syntax">; </span><span class="comment-syntax"> pointers within the current interpretation</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</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">score</span><span class="plain-syntax">; </span><span class="comment-syntax"> used to choose most likely interpretation</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">; </span><span class="comment-syntax"> fork to alternative interpretation</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">log_time</span><span class="plain-syntax">; </span><span class="comment-syntax"> used purely as a defensive measure when writing debugging log</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">score</span><span class="plain-syntax">; </span><span class="comment-syntax"> scratch storage for choosing between interpretations</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">last_seen_on_traverse</span><span class="plain-syntax">; </span><span class="comment-syntax"> scratch storage for detecting accidental loops</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure parse_node is accessed in 2/st, 2/na, 2/tv and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>Various modules conventionally use this global setting to toggle debugging
log output:
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Creation. </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">trace_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. Creation. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::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">Node::new</span></span>:<br/><a href="2-pn.html#SP4">&#167;4</a>, <a href="2-pn.html#SP9">&#167;9</a>, <a href="2-pn.html#SP11">&#167;11</a><br/>Syntax Trees - <a href="2-st.html#SP2">&#167;2</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::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">Node::new</span></span>:<br/><a href="2-pn.html#SP3">&#167;3</a>, <a href="2-pn.html#SP8">&#167;8</a>, <a href="2-pn.html#SP10">&#167;10</a><br/>Syntax Trees - <a href="2-st.html#SP2">&#167;2</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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="2-na.html#SP3" class="function-link"><span class="function-syntax">Annotations::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">log_time</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP8" class="function-link"><span class="function-syntax">Node::set_score</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_seen_on_traverse</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_score</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>The following constructor routines fill out the fields in useful ways.
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>The following constructor routines fill out the fields in useful ways.
Here's one if a word range is to be attached:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::new_with_words</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">Node::new_with_words</span></span>:<br/><a href="2-pn.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">code_number</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">code_number</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::new_with_words</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">Node::new_with_words</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP24">&#167;24</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">code_number</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">code_number</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>The attached text.
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>The attached text.
</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">Node::get_text</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">Node::get_text</span></span>:<br/><a href="2-pn.html#SP14">&#167;14</a>, <a href="2-pn.html#SP15">&#167;15</a>, <a href="2-pn.html#SP17">&#167;17</a>, <a href="2-pn.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Node::get_text</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">Node::get_text</span></span>:<br/><a href="2-pn.html#SP13">&#167;13</a>, <a href="2-pn.html#SP14">&#167;14</a>, <a href="2-pn.html#SP16">&#167;16</a>, <a href="2-pn.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_parsed</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">Node::set_text</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">Node::set_text</span></span>:<br/><a href="2-pn.html#SP3">&#167;3</a>, <a href="2-pn.html#SP4">&#167;4</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a>, <a href="3-snt.html#SP6_9_7">&#167;6.9.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::set_text</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">Node::set_text</span></span>:<br/><a href="2-pn.html#SP2">&#167;2</a>, <a href="2-pn.html#SP3">&#167;3</a><br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>, <a href="3-snt.html#SP6_9_6">&#167;6.9.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to set words for null node"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_parsed</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="SP6"></a><b>&#167;6. Annotations. </b>It's easily overlooked that the single most useful piece of information
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. Annotations. </b>It's easily overlooked that the single most useful piece of information
at each node is its node type, accessed as follows:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="function-syntax">Node::get_type</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">Node::get_type</span></span>:<br/><a href="2-pn.html#SP20">&#167;20</a><br/>Syntax Trees - <a href="2-st.html#SP4">&#167;4</a>, <a href="2-st.html#SP4_1">&#167;4.1</a><br/>Node Annotations - <a href="2-na.html#SP15">&#167;15</a><br/>Tree Verification - <a href="2-tv.html#SP2">&#167;2</a>, <a href="2-tv.html#SP4">&#167;4</a>, <a href="2-tv.html#SP4_3">&#167;4.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
<span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="function-syntax">Node::get_type</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">Node::get_type</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP4">&#167;4</a>, <a href="2-st.html#SP4_1">&#167;4.1</a><br/>Node Annotations - <a href="2-na.html#SP15">&#167;15</a><br/>Tree Verification - <a href="2-tv.html#SP2">&#167;2</a>, <a href="2-tv.html#SP4">&#167;4</a>, <a href="2-tv.html#SP4_3">&#167;4.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</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">pn</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="constant-syntax">INVALID_NT</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</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">Node::is</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">Node::is</span></span>:<br/><a href="2-pn.html#SP20">&#167;20</a><br/>Syntax Trees - <a href="2-st.html#SP17">&#167;17</a><br/>Tree Verification - <a href="2-tv.html#SP4_1_1">&#167;4.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Node::is</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">Node::is</span></span>:<br/>Syntax Trees - <a href="2-st.html#SP17">&#167;17</a>, <a href="2-st.html#SP24">&#167;24</a><br/>Tree Verification - <a href="2-tv.html#SP4_1_1">&#167;4.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</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">pn</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax"> == </span><span class="identifier-syntax">t</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="SP7"></a><b>&#167;7. </b>When setting, we have to preserve the invariant, so we clear away any
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>When setting, we have to preserve the invariant, so we clear away any
annotations no longer relevant to the node's new identity.
</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">Node::set_type</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Node::set_type</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_9">&#167;6.9</a>, <a href="3-snt.html#SP6_9_5">&#167;6.9.5</a>, <a href="3-snt.html#SP6_9_6">&#167;6.9.6</a>, <a href="3-snt.html#SP6_9_7">&#167;6.9.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::set_type</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Node::set_type</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_9">&#167;6.9</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a>, <a href="3-snt.html#SP6_9_5">&#167;6.9.5</a>, <a href="3-snt.html#SP6_9_6">&#167;6.9.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</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">IMMUTABLE_NODE</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</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">IMMUTABLE_NODE</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">)) {</span>
@ -185,14 +176,14 @@ annotations no longer relevant to the node's new identity.
<span class="plain-syntax"> </span><a href="2-na.html#SP3" class="function-link"><span class="function-syntax">Annotations::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>The integer score, used in choosing best matches:
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>The integer score, used in choosing best matches:
</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">Node::get_score</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Node::get_score</span></span>:<br/><a href="2-pn.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) { </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">score</span><span class="plain-syntax">; }</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::set_score</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Node::set_score</span></span>:<br/><a href="2-pn.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">s</span><span class="plain-syntax">) { </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">score</span><span class="plain-syntax"> = </span><span class="identifier-syntax">s</span><span class="plain-syntax">; }</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Node::get_score</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Node::get_score</span></span>:<br/><a href="2-pn.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) { </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">score</span><span class="plain-syntax">; }</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::set_score</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Node::set_score</span></span>:<br/><a href="2-pn.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">s</span><span class="plain-syntax">) { </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">score</span><span class="plain-syntax"> = </span><span class="identifier-syntax">s</span><span class="plain-syntax">; }</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. Copying parse nodes. </b>If we want to duplicate a parse node, we cannot do so with a shallow bit copy:
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. Copying parse nodes. </b>If we want to duplicate a parse node, we cannot do so with a shallow bit copy:
the node points to a list of its annotations, and the duplicated node would
therefore point to the same list. If, subsequently, one of the two nodes
were annotated further, then the other would change in synchrony, which
@ -201,18 +192,18 @@ deep copy which duplicates not only the node, but also its annotation 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">Node::copy</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Node::copy</span></span>:<br/><a href="2-pn.html#SP10">&#167;10</a>, <a href="2-pn.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::copy</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Node::copy</span></span>:<br/><a href="2-pn.html#SP9">&#167;9</a>, <a href="2-pn.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">COPY</span><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP10" class="function-link"><span class="function-syntax">Annotations::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::duplicate</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dup</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP9" class="function-link"><span class="function-syntax">Node::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dup</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dup</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP8" class="function-link"><span class="function-syntax">Node::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dup</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">dup</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>This variation preserves links out.
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>This variation preserves links out.
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -220,34 +211,34 @@ deep copy which duplicates not only the node, but also its annotation list.
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_link</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alt_link</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">down_link</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP9" class="function-link"><span class="function-syntax">Node::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP8" class="function-link"><span class="function-syntax">Node::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">next_link</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">alt_link</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">down_link</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>And to deep-copy a whole subtree:
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>And to deep-copy a whole subtree:
</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">Node::copy_subtree</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">level</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">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Null deep copy"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP9" class="function-link"><span class="function-syntax">Node::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP8" class="function-link"><span class="function-syntax">Node::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</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">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP11" class="function-link"><span class="function-syntax">Node::copy_subtree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">level</span><span class="plain-syntax">+1);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP10" class="function-link"><span class="function-syntax">Node::copy_subtree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">level</span><span class="plain-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">level</span><span class="plain-syntax">&gt;0) &amp;&amp; (</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP11" class="function-link"><span class="function-syntax">Node::copy_subtree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">level</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP10" class="function-link"><span class="function-syntax">Node::copy_subtree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">level</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">level</span><span class="plain-syntax">&gt;0) &amp;&amp; (</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP11" class="function-link"><span class="function-syntax">Node::copy_subtree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">level</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP10" class="function-link"><span class="function-syntax">Node::copy_subtree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">level</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Child count. </b></p>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. Child count. </b></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">Node::no_children</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
@ -256,7 +247,7 @@ deep copy which duplicates not only the node, but also its annotation list.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. Detection of subnodes. </b>This is needed when producing problem messages: we may need to work up from
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Detection of subnodes. </b>This is needed when producing problem messages: we may need to work up from
an arbitrary leaf to the main sentence branch containing it. At any rate,
given a node <span class="extract"><span class="extract-syntax">PN</span></span>, we want to know if another node <span class="extract"><span class="extract-syntax">to_find</span></span> lies beneath
it. (This will never be called when <span class="extract"><span class="extract-syntax">PN</span></span> is the root, and from all other
@ -269,12 +260,12 @@ wide nor deep.)
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_try</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">PN</span><span class="plain-syntax"> == </span><span class="identifier-syntax">to_find</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">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to_try</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">to_try</span><span class="plain-syntax">; </span><span class="identifier-syntax">to_try</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to_try</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP13" class="function-link"><span class="function-syntax">Node::contains</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_try</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_find</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP12" class="function-link"><span class="function-syntax">Node::contains</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to_try</span><span class="plain-syntax">, </span><span class="identifier-syntax">to_find</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">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="SP14"></a><b>&#167;14. The word range beneath a given node. </b>Any given node may be the root of a subtree concerning the structure of
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. The word range beneath a given node. </b>Any given node may be the root of a subtree concerning the structure of
a given contiguous range of words in the original source text. The
"left edge" of a node <span class="extract"><span class="extract-syntax">PN</span></span> is the least-numbered word considered by any
node at or below <span class="extract"><span class="extract-syntax">PN</span></span> in the tree; the "right edge" is the highest-numbered
@ -289,31 +280,31 @@ for <span class="extract"><span class="extract-syntax">PN</span></span> and the
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Node::left_edge_of</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">child</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="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)), </span><span class="identifier-syntax">lc</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="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)), </span><span class="identifier-syntax">lc</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">child</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">child</span><span class="plain-syntax">; </span><span class="identifier-syntax">child</span><span class="plain-syntax"> = </span><span class="identifier-syntax">child</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lc</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP14" class="function-link"><span class="function-syntax">Node::left_edge_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">child</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lc</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP13" class="function-link"><span class="function-syntax">Node::left_edge_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">child</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">lc</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; ((</span><span class="identifier-syntax">l</span><span class="plain-syntax"> == -1) || (</span><span class="identifier-syntax">lc</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">l</span><span class="plain-syntax">))) </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lc</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">l</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. </b>Symmetrically, the right edge is found by taking the maximum word number
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>Symmetrically, the right edge is found by taking the maximum word number
for <span class="extract"><span class="extract-syntax">PN</span></span> and the right edges of its children.
</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">Node::right_edge_of</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">child</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">r</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)), </span><span class="identifier-syntax">rc</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::first_wn</span><span class="plain-syntax">(</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)) &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">r</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="identifier-syntax">r</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)), </span><span class="identifier-syntax">rc</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::first_wn</span><span class="plain-syntax">(</span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)) &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">r</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">child</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PN</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">child</span><span class="plain-syntax">; </span><span class="identifier-syntax">child</span><span class="plain-syntax"> = </span><span class="identifier-syntax">child</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP15" class="function-link"><span class="function-syntax">Node::right_edge_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">child</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rc</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP14" class="function-link"><span class="function-syntax">Node::right_edge_of</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">child</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">rc</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; ((</span><span class="identifier-syntax">r</span><span class="plain-syntax"> == -1) || (</span><span class="identifier-syntax">rc</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">r</span><span class="plain-syntax">))) </span><span class="identifier-syntax">r</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rc</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">r</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. Logging the parse tree. </b>For most trees, logging is a fearsome prospect, but here we only mean printing
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. Logging the parse tree. </b>For most trees, logging is a fearsome prospect, but here we only mean printing
out a textual representation to the debugging log.
</p>
@ -326,12 +317,10 @@ logging is a diagnostic tool, we want it to work even when Inform is sick.
</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">pn_log_token</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::log_tree</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">Node::log_tree</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a><br/>Syntax Trees - <a href="2-st.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vpn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">vpn</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">pn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;null-meaning-list&gt;\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP17" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, ++</span><span class="identifier-syntax">pn_log_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><a href="2-st.html#SP22" class="function-link"><span class="function-syntax">SyntaxTree::new_traverse_token</span></a><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">Node::log_subtree</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">Node::log_subtree</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vpn</span><span class="plain-syntax">) {</span>
@ -340,50 +329,52 @@ logging is a diagnostic tool, we want it to work even when Inform is sick.
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"$P\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP17" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, ++</span><span class="identifier-syntax">pn_log_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, ++</span><span class="identifier-syntax">pn_log_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </b>Either way, we recurse as follows, being careful not to make recursive calls
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. </b>Either way, we recurse as follows, being careful not to make recursive calls
to pursue <span class="extract"><span class="extract-syntax">next</span></span> links, since otherwise a source text with more than 100,000
sentences or so will exceed the typical stack size Inform has to run in.
</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">Node::log_subtree_recursively</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">Node::log_subtree_recursively</span></span>:<br/><a href="2-pn.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">of</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::log_subtree_recursively</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">Node::log_subtree_recursively</span></span>:<br/><a href="2-pn.html#SP15">&#167;15</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</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">of</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">traverse_token</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">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">log_time</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"*** Not a tree: %W ***\n"</span><span class="plain-syntax">, </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_seen_on_traverse</span><span class="plain-syntax"> == </span><span class="identifier-syntax">traverse_token</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"*** Not a tree: %W ***\n"</span><span class="plain-syntax">, </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">log_time</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-pn.html#SP17_1" class="named-paragraph-link"><span class="named-paragraph">Calculate num and of such that this is [num/of] if they aren't already supplied</span><span class="named-paragraph-number">17.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_seen_on_traverse</span><span class="plain-syntax"> = </span><span class="identifier-syntax">traverse_token</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-pn.html#SP16_1" class="named-paragraph-link"><span class="named-paragraph">Calculate num and of such that this is [num/of] if they aren't already supplied</span><span class="named-paragraph-number">16.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">pn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;null-parse-node&gt;\n"</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">of</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"[%d/%d] "</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">, </span><span class="identifier-syntax">of</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP8" class="function-link"><span class="function-syntax">Node::get_score</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"(score %d) "</span><span class="plain-syntax">, </span><a href="2-pn.html#SP8" class="function-link"><span class="function-syntax">Node::get_score</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::get_score</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"(score %d) "</span><span class="plain-syntax">, </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::get_score</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"$P\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP17" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">traverse_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">) </span><a href="2-pn.html#SP17" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">of</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">ltime</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">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">) </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_subtree_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">of</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">traverse_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">; </span><span class="identifier-syntax">num</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">of</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">gen</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17_1"></a><b>&#167;17.1. </b>When the first alternative is called, <span class="extract"><span class="extract-syntax">Node::log_subtree_recursively</span></span>
<p class="commentary firstcommentary"><a id="SP16_1"></a><b>&#167;16.1. </b>When the first alternative is called, <span class="extract"><span class="extract-syntax">Node::log_subtree_recursively</span></span>
has arguments 0 and 0 for the possibility. The following code finds out the
correct value for <span class="extract"><span class="extract-syntax">of</span></span>, setting this possibility to be <span class="extract"><span class="extract-syntax">[1/of]</span></span>. When we later
iterate through other alternatives, we pass on correct values of <span class="extract"><span class="extract-syntax">num</span></span> and <span class="extract"><span class="extract-syntax">of</span></span>,
so that this code won't be used again on the same horizontal list of possibilities.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Calculate num and of such that this is [num/of] if they aren't already supplied</span><span class="named-paragraph-number">17.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Calculate num and of such that this is [num/of] if they aren't already supplied</span><span class="named-paragraph-number">16.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -393,8 +384,8 @@ so that this code won't be used again on the same horizontal list of possibiliti
<span class="plain-syntax"> </span><span class="identifier-syntax">num</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-pn.html#SP17">&#167;17</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. </b>All of those routines make use of the following, which actually performs
<ul class="endnotetexts"><li>This code is used in <a href="2-pn.html#SP16">&#167;16</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </b>All of those routines make use of the following, which actually performs
the log of a parse node. Note that this always produces exactly one line of
text in the debugging log.
</p>
@ -406,13 +397,14 @@ text in the debugging log.
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">PARSE_TREE_LOGGER</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PARSE_TREE_LOGGER</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::log</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">node_type</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><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">))) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"'%W'"</span><span class="plain-syntax">, </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-nt.html#SP8" class="function-link"><span class="function-syntax">NodeType::log</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">node_type</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><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">))) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"'%W'"</span><span class="plain-syntax">, </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::get_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</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">LINGUISTICS_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Diagrams::log_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</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">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">HEADING_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" (level %d)"</span><span class="plain-syntax">, </span><a href="2-na.html#SP5" class="function-link"><span class="function-syntax">Annotations::read_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">heading_level_ANNOT</span><span class="plain-syntax">)); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">HEADING_NT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" (level %d)"</span><span class="plain-syntax">, </span><a href="2-na.html#SP5" class="function-link"><span class="function-syntax">Annotations::read_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">heading_level_ANNOT</span><span class="plain-syntax">)); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
@ -420,7 +412,7 @@ text in the debugging log.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">a</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"/%d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">a</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19"></a><b>&#167;19. </b>This is occasionally useful:
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. </b>This is occasionally useful:
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -431,63 +423,6 @@ text in the debugging log.
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. Ambiguity subtrees. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">Node::add_possible_reading</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reading</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">existing</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">reading</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">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">existing</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">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">reading</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="constant-syntax">AMBIGUITY_NT</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">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ParseTreeUsage::is_phrasal</span><span class="plain-syntax">(</span><span class="identifier-syntax">reading</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">E</span><span class="plain-syntax">; </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">) == </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP20" class="function-link"><span class="function-syntax">Node::add_pr_inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">reading</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">existing</span><span class="plain-syntax">;</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</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">L</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">)) </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</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">existing</span><span class="plain-syntax">;</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">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">ParseTreeUsage::is_phrasal</span><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">) == </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP20" class="function-link"><span class="function-syntax">Node::add_pr_inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="identifier-syntax">reading</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">existing</span><span class="plain-syntax">;</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::new_with_words</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</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">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">existing</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</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">A</span><span class="plain-syntax">;</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">CORE_MODULE</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Node::add_pr_inv</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reading</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, *</span><span class="identifier-syntax">next_N</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">N</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">next_N</span><span class="plain-syntax">, </span><span class="identifier-syntax">next_N</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">N</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP20" class="function-link"><span class="function-syntax">Node::add_single_pr_inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</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">Node::add_single_pr_inv</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</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">Invocations::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</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">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">E</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</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">Invocations::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</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">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">N</span><span class="plain-syntax">; </span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-nt.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-sm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-st.html">st</a></li><li class="progresssection"><a href="2-nt.html">nt</a></li><li class="progresscurrent">pn</li><li class="progresssection"><a href="2-na.html">na</a></li><li class="progresssection"><a href="2-tv.html">tv</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="2-na.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -66,7 +66,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">syntax</a></li><li><a href="index.html#2">Chapter 2: The Parse Tree</a></li><li><b>Syntax Trees</b></li></ul></div>
<p class="purpose">To parse trees which decompose the meaning of excerpts of text, and which allow annotations to be made at each node.</p>
<ul class="toc"><li><a href="2-st.html#SP1">&#167;1. Optional headings tree</a></li><li><a href="2-st.html#SP2">&#167;2. Syntax trees</a></li><li><a href="2-st.html#SP3">&#167;3. Buds and grafts</a></li><li><a href="2-st.html#SP10">&#167;10. Where we currently are in the text</a></li><li><a href="2-st.html#SP11">&#167;11. General traversals</a></li><li><a href="2-st.html#SP20">&#167;20. Unconditional traverses</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-st.html#SP1">&#167;1. Optional headings tree</a></li><li><a href="2-st.html#SP2">&#167;2. Syntax trees</a></li><li><a href="2-st.html#SP3">&#167;3. Buds and grafts</a></li><li><a href="2-st.html#SP10">&#167;10. Where we currently are in the text</a></li><li><a href="2-st.html#SP11">&#167;11. General traversals</a></li><li><a href="2-st.html#SP20">&#167;20. Unconditional traverses</a></li><li><a href="2-st.html#SP22">&#167;22. Cautious traverses</a></li><li><a href="2-st.html#SP23">&#167;23. Toggling log output</a></li><li><a href="2-st.html#SP24">&#167;24. Ambiguity subtrees</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Optional headings tree. </b>Within <a href="../inform7/index.html" class="internal">inform7</a> and <a href="../inbuild/index.html" class="internal">inbuild</a>, the code in this section is augmented by
<a href="../supervisor-module/6-hdn.html" class="internal">Headings (in supervisor)</a>, which gives every syntax tree an associated tree of
@ -96,16 +96,18 @@ it includes, will form a single <a href="2-st.html#SP2" class="internal">parse_n
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bud_parent_stack</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_BUD_STACK_SIZE</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last_sentence</span><span class="plain-syntax">; </span><span class="comment-syntax"> cached position in tree</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_last_sentence_cacheing</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">trace_sentences</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">HEADING_TREE_SYNTAX_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">headings</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="function-syntax">SyntaxTree::new</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_sp</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">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_sentence</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">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allow_last_sentence_cacheing</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">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">trace_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP3" class="function-link"><span class="function-syntax">SyntaxTree::push_bud</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</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">NEW_HEADING_TREE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">headings</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_HEADING_TREE_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
@ -133,12 +135,12 @@ it includes, will form a single <a href="2-st.html#SP2" class="internal">parse_n
</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">SyntaxTree::graft_sentence</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">SyntaxTree::graft_sentence</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_4">&#167;6.9.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::graft_sentence</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">SyntaxTree::graft_sentence</span></span>:<br/>Sentences - <a href="3-snt.html#SP6_1">&#167;6.1</a>, <a href="3-snt.html#SP6_6">&#167;6.6</a>, <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</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">T</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">bud_parent_sp</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no attachment point"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-st.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Adjust bud point for a heading</span><span class="named-paragraph-number">4.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><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-st.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Adjust bud point for a heading</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sentence_attachment_point</span><span class="plain-syntax"> = </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_sp</span><span class="plain-syntax">-1];</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP7" class="function-link"><span class="function-syntax">SyntaxTree::graft</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sentence_attachment_point</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) </span><a href="2-st.html#SP3" class="function-link"><span class="function-syntax">SyntaxTree::push_bud</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) </span><a href="2-st.html#SP3" class="function-link"><span class="function-syntax">SyntaxTree::push_bud</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>&#167;4.1. </b>When what's attached is a heading node, that changes the stack. The idea
@ -156,7 +158,7 @@ pop the bud stack until we're beneath a heading node superior to Parts.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">heading_level</span><span class="plain-syntax"> &gt; </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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_sp</span><span class="plain-syntax">-1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&gt;=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">--) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_stack</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><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">) == </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-na.html#SP5" class="function-link"><span class="function-syntax">Annotations::read_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="constant-syntax">heading_level_ANNOT</span><span class="plain-syntax">) &gt;= </span><span class="identifier-syntax">heading_level</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">bud_parent_sp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -177,7 +179,7 @@ that file temporarily the debugging log stream <span class="extract"><span class
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = &amp;</span><span class="identifier-syntax">parse_tree_file</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Streams::enable_debugging</span><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP15" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_DL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STREAM_CLOSE</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">parse_tree_file</span><span class="plain-syntax">);</span>
@ -294,9 +296,9 @@ chosen start position, rather than the root of the tree.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::traverse_from</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><a href="2-st.html#SP11" class="function-link"><span class="function-syntax">SyntaxTree::traverse_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><a href="2-st.html#SP11" class="function-link"><span class="function-syntax">SyntaxTree::traverse_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -309,7 +311,7 @@ is the sole arbiter. This depends only on its node type.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::visitable</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">SyntaxTree::visitable</span></span>:<br/><a href="2-st.html#SP11">&#167;11</a>, <a href="2-st.html#SP13">&#167;13</a>, <a href="2-st.html#SP14">&#167;14</a>, <a href="2-st.html#SP15">&#167;15</a>, <a href="2-st.html#SP16">&#167;16</a>, <a href="2-st.html#SP17">&#167;17</a>, <a href="2-st.html#SP18">&#167;18</a>, <a href="2-st.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::has_flag</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</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><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::has_flag</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="constant-syntax">DONT_VISIT_NFLAG</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>
</pre>
@ -326,10 +328,10 @@ signature <span class="extract"><span class="extract-syntax">text_stream *, pars
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP13" class="function-link"><span class="function-syntax">SyntaxTree::traverse_text_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -349,10 +351,10 @@ signature <span class="extract"><span class="extract-syntax">parse_node *, int *
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *), </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP14" class="function-link"><span class="function-syntax">SyntaxTree::traverse_intp_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -372,10 +374,10 @@ signature <span class="extract"><span class="extract-syntax">parse_node *, int *
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *), </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Y</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP15" class="function-link"><span class="function-syntax">SyntaxTree::traverse_intp_intp_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">, </span><span class="identifier-syntax">Y</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -394,10 +396,10 @@ signature <span class="extract"><span class="extract-syntax">parse_node *, int *
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> **), </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> **</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP16" class="function-link"><span class="function-syntax">SyntaxTree::traverse_nodep_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -420,15 +422,15 @@ two nodes are the one being visited and its heading, respectively.
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last_h0</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="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">H0</span><span class="plain-syntax"> = </span><span class="identifier-syntax">last_h0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-na.html#SP5" class="function-link"><span class="function-syntax">Annotations::read_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="constant-syntax">heading_level_ANNOT</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">H0</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP17" class="function-link"><span class="function-syntax">SyntaxTree::traverse_headingwise_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">, </span><span class="identifier-syntax">H0</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</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><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">last_h0</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -461,7 +463,7 @@ because no visitable nodes would ever be reached.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</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">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP18" class="function-link"><span class="function-syntax">SyntaxTree::traverse_to_find_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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>
@ -485,13 +487,13 @@ it very much.
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</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">pn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">end</span><span class="plain-syntax">) { </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SCS</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">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_top_level</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP19" class="function-link"><span class="function-syntax">SyntaxTree::traverse_from_up_to_ip</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">end</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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">SCS</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="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-st.html#SP12" class="function-link"><span class="function-syntax">SyntaxTree::visitable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -511,7 +513,7 @@ ones. Here is a depth-first version (like all of the functions above):
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP20" class="function-link"><span class="function-syntax">SyntaxTree::traverse_dfirst_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</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">SCS</span><span class="plain-syntax">;</span>
@ -527,13 +529,112 @@ ones. Here is a depth-first version (like all of the functions above):
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::traverse_wfirst_from</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SCS</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</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">pn</span><span class="plain-syntax">; </span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-nt.html#SP11" class="function-link"><span class="function-syntax">NodeType::is_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_type</span><span class="plain-syntax">)) </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP21" class="function-link"><span class="function-syntax">SyntaxTree::traverse_wfirst_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">visitor</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> (*</span><span class="identifier-syntax">visitor</span><span class="plain-syntax">)(</span><span class="identifier-syntax">pn</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">SCS</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22"></a><b>&#167;22. Cautious traverses. </b>When logging or verifying the tree, we cannot use the carefree functions
above: the tree might be malformed. As a way to detect cycles, we call for
a new "traverse token" &mdash; just a unique integer value &mdash; and mark all nodes
visited with that value.
</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">pn_log_token</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::new_traverse_token</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">SyntaxTree::new_traverse_token</span></span>:<br/>Parse Nodes - <a href="2-pn.html#SP15">&#167;15</a><br/>Tree Verification - <a href="2-tv.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</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">pn_log_token</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP23"></a><b>&#167;23. Toggling log output. </b>Various modules conventionally use this global setting to toggle debugging
log output:
</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">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</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">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">trace_sentences</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">SyntaxTree::set_trace</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">trace_sentences</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::clear_trace</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">trace_sentences</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">SyntaxTree::toggle_trace</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">trace_sentences</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">trace_sentences</span><span class="plain-syntax">)?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP24"></a><b>&#167;24. Ambiguity subtrees. </b>The following function adds a new <span class="extract"><span class="extract-syntax">reading</span></span> to an <span class="extract"><span class="extract-syntax">existing</span></span> interpretation
of some wording <span class="extract"><span class="extract-syntax">W</span></span>, and return the node now representing. For example,
suppose the text "orange" can be read as a noun for fruit, a noun for colour,
or an adjective, resulting in nodes <span class="extract"><span class="extract-syntax">fruit_node</span></span> and <span class="extract"><span class="extract-syntax">colour_node</span></span> and <span class="extract"><span class="extract-syntax">adj_node</span></span>.
Then:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">SyntaxTree::add_reading(NULL, fruit_node, W)</span></span> returns <span class="extract"><span class="extract-syntax">noun_node</span></span>,
</li><li>(b) but <span class="extract"><span class="extract-syntax">SyntaxTree::add_reading(fruit_node, colour_node, W)</span></span> returns this subtree:
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> AMBIGUITY_NT A</span>
<span class="plain-syntax"> fruit_node</span>
<span class="plain-syntax"> colour_node</span>
</pre>
<ul class="items"><li>(c) and <span class="extract"><span class="extract-syntax">SyntaxTree::add_reading(A, adj_node, W)</span></span> returns the subtree:
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> AMBIGUITY_NT A</span>
<span class="plain-syntax"> fruit_node</span>
<span class="plain-syntax"> colour_node</span>
<span class="plain-syntax"> adj_node</span>
</pre>
<p class="commentary">Thus it accumulates possible readings of a given text.
</p>
<p class="commentary">A complication is that the following callback function is offered the chance
to amend this process in individual cases; it's called whenever <span class="extract"><span class="extract-syntax">reading</span></span>
is about to become one of the alternatives to some existing <span class="extract"><span class="extract-syntax">E</span></span>. If it returns
a non-null node, that's the answer, and otherwise we carry on as normal.
</p>
<p class="commentary">(<a href="../inform7/index.html" class="internal">inform7</a> uses this to handle ambiguous phrase invocations to be sorted
out in type-checking: see <a href="../core-module/14-ds2.html" class="internal">Dash (in core)</a>.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">SyntaxTree::add_reading</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reading</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">existing</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">reading</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">existing</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">reading</span><span class="plain-syntax">, </span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">reading</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="constant-syntax">AMBIGUITY_NT</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">AMBIGUITY_JOIN_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">E</span><span class="plain-syntax">; </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AMBIGUITY_JOIN_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">reading</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">pn</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pn</span><span class="plain-syntax">;</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">existing</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</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">L</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">)) </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</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">existing</span><span class="plain-syntax">;</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">AMBIGUITY_JOIN_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AMBIGUITY_JOIN_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">existing</span><span class="plain-syntax">, </span><span class="identifier-syntax">reading</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">pn</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pn</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new_with_words</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</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">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">existing</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">reading</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">A</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="1-sm.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-sm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">st</li><li class="progresssection"><a href="2-nt.html">nt</a></li><li class="progresssection"><a href="2-pn.html">pn</a></li><li class="progresssection"><a href="2-na.html">na</a></li><li class="progresssection"><a href="2-tv.html">tv</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="2-nt.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -68,7 +68,10 @@ function togglePopup(material_id) {
<ul class="toc"><li><a href="2-tv.html#SP1">&#167;1. Verify integrity</a></li><li><a href="2-tv.html#SP3">&#167;3. Verify structure</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Verify integrity. </b>The first duty of a tree is to contain no loops, and the following checks
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Verify integrity. </b>We can perform two different checks.
</p>
<p class="commentary">The first duty of a tree is to contain no loops, and the following checks
that (rejecting even undirected loops). In addition, it checks that each
node has an enumerated node type, rather than a meaning code.
</p>
@ -76,35 +79,32 @@ node has an enumerated node type, rather than a meaning code.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tree_stats_size</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">tree_stats_depth</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">tree_stats_width</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_integrity</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">VerifyTree::verify_integrity</span></span>:<br/><a href="2-tv.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">worth_logging</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_integrity</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tree_stats_size</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">tree_stats_depth</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">tree_stats_width</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP2" class="function-link"><span class="function-syntax">VerifyTree::verify_tree_integrity_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="string-syntax">"down"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, ++</span><span class="identifier-syntax">pn_log_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP1" class="function-link"><span class="function-syntax">VerifyTree::verify_integrity_below</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</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">VerifyTree::verify_integrity_below</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">VerifyTree::verify_integrity_below</span></span>:<br/><a href="2-tv.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP2" class="function-link"><span class="function-syntax">VerifyTree::verify_integrity_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="string-syntax">"down"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP22" class="function-link"><span class="function-syntax">SyntaxTree::new_traverse_token</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>The verification traverse is a very cautious manoeuvre: we step through
the tree, testing each branch with our outstretched foot in case it might
be illusory or broken. At the first sign of trouble we panic.
the tree, testing each branch with our outstretched foot. At the first sign
of trouble we panic.
</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">VerifyTree::verify_tree_integrity_recursively</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">VerifyTree::verify_tree_integrity_recursively</span></span>:<br/><a href="2-tv.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">way</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ltime</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">width</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pointer_sized_int</span><span class="plain-syntax"> </span><span class="identifier-syntax">probably_an_address</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">pointer_sized_int</span><span class="plain-syntax">) </span><span class="identifier-syntax">p</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax">++; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">depth</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">tree_stats_depth</span><span class="plain-syntax">) </span><span class="identifier-syntax">tree_stats_depth</span><span class="plain-syntax"> = </span><span class="identifier-syntax">depth</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">width</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</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="element-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">width</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">probably_an_address</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">probably_an_address</span><span class="plain-syntax"> == -1)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Link %s broken from:\n$P"</span><span class="plain-syntax">, </span><span class="identifier-syntax">way</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::set_internal_handler</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Link broken in parse tree"</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">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">log_time</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_integrity_r</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">VerifyTree::verify_integrity_r</span></span>:<br/><a href="2-tv.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">way</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">traverse_token</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">width</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</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="element-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">width</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">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_seen_on_traverse</span><span class="plain-syntax"> == </span><span class="identifier-syntax">traverse_token</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">"Cycle found in parse tree, found %s from:\n$P"</span><span class="plain-syntax">, </span><span class="identifier-syntax">way</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::set_internal_handler</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Cycle found in parse tree"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">log_time</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">last_seen_on_traverse</span><span class="plain-syntax"> = </span><span class="identifier-syntax">traverse_token</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><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><a href="2-nt.html#SP2" class="function-link"><span class="function-syntax">NodeType::is_enumerated</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">)) </span><span class="identifier-syntax">tree_stats_size</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">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Invalid node type (%08x) found %s from:\n$P"</span><span class="plain-syntax">, (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">way</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
@ -112,52 +112,47 @@ be illusory or broken. At the first sign of trouble we panic.
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Link broken in parse tree"</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">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP2" class="function-link"><span class="function-syntax">VerifyTree::verify_tree_integrity_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="string-syntax">"alt"</span><span class="plain-syntax">, </span><span class="identifier-syntax">depth</span><span class="plain-syntax">, </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP2" class="function-link"><span class="function-syntax">VerifyTree::verify_integrity_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="string-syntax">"alt"</span><span class="plain-syntax">, </span><span class="identifier-syntax">depth</span><span class="plain-syntax">, </span><span class="identifier-syntax">traverse_token</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">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP2" class="function-link"><span class="function-syntax">VerifyTree::verify_tree_integrity_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="string-syntax">"down"</span><span class="plain-syntax">, </span><span class="identifier-syntax">depth</span><span class="plain-syntax">, </span><span class="identifier-syntax">ltime</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP2" class="function-link"><span class="function-syntax">VerifyTree::verify_integrity_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="string-syntax">"down"</span><span class="plain-syntax">, </span><span class="identifier-syntax">depth</span><span class="plain-syntax">+1, </span><span class="identifier-syntax">traverse_token</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">width</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">tree_stats_width</span><span class="plain-syntax">) </span><span class="identifier-syntax">tree_stats_width</span><span class="plain-syntax"> = </span><span class="identifier-syntax">width</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">width</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">tree_stats_width</span><span class="plain-syntax">) </span><span class="identifier-syntax">tree_stats_width</span><span class="plain-syntax"> = </span><span class="identifier-syntax">width</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">depth</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">tree_stats_depth</span><span class="plain-syntax">) </span><span class="identifier-syntax">tree_stats_depth</span><span class="plain-syntax"> = </span><span class="identifier-syntax">depth</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. Verify structure. </b>The parse tree is a complicated structure, arbitrarily wide and deep, and
containing many different node types, each subject to its own rules of usage.
(For instance, a <span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span> node cannot legally be beneath a
<span class="extract"><span class="extract-syntax">PROPER_NOUN_NT</span></span> one.) This is both good and bad: bad because complexity is
always the enemy of program correctness, good because it gives us an
independent opportunity to test a great deal of what earlier code has done.
If, given every test case, we always construct a well-formed tree, we must be
doing something right.
In this second check, we ensure that nodes have acceptable parentage and
annotations &mdash; that is, parentage and annotations which fall within the
permissions set up when their node types were created.
</p>
<p class="commentary">The collection of rules like this which the tree must satisfy is called its
"invariant", and is expressed by the code below. Note that this is
verification, not an attempt to correct matters. If any test fails, Inform
will stop with an internal error. (If there are multiple failures, we
itemise them to the debugging log, and only produce a single internal error
at the end.)
<p class="commentary">If any test fails, Inform will stop with an internal error. (If there are
multiple failures, we itemise them to the debugging log, and only produce
a single internal error at the end.)
</p>
<p class="commentary">We protect ourselves by first checking that the tree is intact as a
structure: once we know the tree is safe to climb over, we can wander
about counting children with impunity.
about counting branches with impunity.
</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">VerifyTree::verify_node</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</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">T</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">root_node</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">Errors::set_internal_handler</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Root of parse tree NULL"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP3" class="function-link"><span class="function-syntax">VerifyTree::verify_structure</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP3" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</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">node_errors</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_structure</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP1" class="function-link"><span class="function-syntax">VerifyTree::verify_integrity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</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">node_errors</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP4" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</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">node_errors</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</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">"[Verification failed: %d node errors]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">node_errors</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_structure_from</span><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP1" class="function-link"><span class="function-syntax">VerifyTree::verify_integrity_below</span></a><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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">errors_found</span><span class="plain-syntax"> = </span><a href="2-tv.html#SP4" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">errors_found</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</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">"[Verification failed: %d node errors]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">errors_found</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::set_internal_handler</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"Parse tree broken"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -170,9 +165,9 @@ among its children.
</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">VerifyTree::verify_structure_recursively</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">VerifyTree::verify_structure_recursively</span></span>:<br/><a href="2-tv.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parent</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><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">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP6" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">VerifyTree::verify_structure_r</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">VerifyTree::verify_structure_r</span></span>:<br/><a href="2-tv.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parent</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><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">node_type_metadata</span><span class="plain-syntax"> *</span><span class="identifier-syntax">metadata</span><span class="plain-syntax"> = </span><a href="2-nt.html#SP7" class="function-link"><span class="function-syntax">NodeType::get_metadata</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">metadata</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"broken tree should have been reported"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tv.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Check rule (1) of the invariant</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
@ -181,12 +176,13 @@ among its children.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">children_count</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="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">q</span><span class="plain-syntax">=</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">down</span><span class="plain-syntax">; </span><span class="identifier-syntax">q</span><span class="plain-syntax">; </span><span class="identifier-syntax">q</span><span class="plain-syntax">=</span><span class="identifier-syntax">q</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">children_count</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP4" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ec</span><span class="plain-syntax"> += </span><a href="2-tv.html#SP4" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">ec</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tv.html#SP4_4" class="named-paragraph-link"><span class="named-paragraph">Check rule (4) of the invariant</span><span class="named-paragraph-number">4.4</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">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-tv.html#SP4" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_recursively</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">parent</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ec</span><span class="plain-syntax"> += </span><a href="2-tv.html#SP4" class="function-link"><span class="function-syntax">VerifyTree::verify_structure_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">parent</span><span class="plain-syntax">, </span><span class="identifier-syntax">ec</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">ec</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>&#167;4.1. </b>Rule (1): no INVALID nodes.
@ -197,7 +193,8 @@ among its children.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax"> == </span><span class="constant-syntax">INVALID_NT</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">"N%d is $N, which is not allowed except temporarily\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</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">"N%d is $N, which is not allowed except temporarily\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tv.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Log this invariant failure</span><span class="named-paragraph-number">4.1.1</span></a></span>
<span class="plain-syntax"> }</span>
</pre>
@ -225,10 +222,11 @@ among its children.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t_parent</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parent</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t_parent</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::get_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parent</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!(</span><a href="2-nt.html#SP12" class="function-link"><span class="function-syntax">NodeType::parentage_allowed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</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">"N%d is $N: should not be a child of $N\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!(</span><a href="2-nt.html#SP13" class="function-link"><span class="function-syntax">NodeType::parentage_allowed</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</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">"N%d is $N: should not be a child of $N\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">t_parent</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-tv.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Log this invariant failure</span><span class="named-paragraph-number">4.1.1</span></a></span>
<span class="plain-syntax"> }</span>
</pre>
@ -252,13 +250,16 @@ among its children.
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tv.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_1_1"></a><b>&#167;4.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Log this invariant failure</span><span class="named-paragraph-number">4.1.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP4_1_1"></a><b>&#167;4.1.1. </b>(Logging the root node produces an absolutely enormous output.)
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Log this invariant failure</span><span class="named-paragraph-number">4.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="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parent</span><span class="plain-syntax">, </span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Failing subtree:\n$T"</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><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::is</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parent</span><span class="plain-syntax">, </span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">)) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Failing subtree:\n$T"</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">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Failing subtree:\n$T"</span><span class="plain-syntax">, </span><span class="identifier-syntax">parent</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">node_errors</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ec</span><span class="plain-syntax">++;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tv.html#SP4_1">&#167;4.1</a>, <a href="2-tv.html#SP4_2">&#167;4.2</a>, <a href="2-tv.html#SP4_3">&#167;4.3</a>, <a href="2-tv.html#SP4_4">&#167;4.4</a> (twice).</li></ul>
<nav role="progress"><div class="progresscontainer">

View file

@ -104,11 +104,16 @@ in Preform grammar functions.
<pre class="definitions code-font"><span class="plain-syntax">@</span><span class="reserved-syntax">default</span><span class="plain-syntax"> </span><span class="constant-syntax">PROBLEM_REF_SYNTAX_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span>
<span class="plain-syntax">@</span><span class="reserved-syntax">default</span><span class="plain-syntax"> </span><span class="constant-syntax">PROJECT_REF_SYNTAX_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">NO_EXTENSION_POS</span><span class="plain-syntax"> </span><span class="identifier-syntax">from</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">BEFORE_BEGINS_EXTENSION_POS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">MIDDLE_EXTENSION_POS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">AFTER_ENDS_EXTENSION_POS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">PAST_CARING_EXTENSION_POS</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">syntax_fsm_state</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">source_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sf</span><span class="plain-syntax">; </span><span class="comment-syntax"> reading from this source file</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ext_pos</span><span class="plain-syntax">; </span><span class="comment-syntax"> 0: not extension; 1: before "begins here"; 2: before "ends here"; 3: after</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ext_pos</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the </span><span class="extract"><span class="extract-syntax">*_EXTENSION_POS</span></span><span class="comment-syntax"> values: where we are in an extension</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">skipping_material_at_level</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">main_source_start_wn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">;</span>
@ -140,7 +145,8 @@ one source text start position.
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">skipping_material_at_level</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ref</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">project_ref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">project_ref</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">is_extension</span><span class="plain-syntax">) </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</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">is_extension</span><span class="plain-syntax">) </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> = </span><span class="constant-syntax">BEFORE_BEGINS_EXTENSION_POS</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">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> = </span><span class="constant-syntax">NO_EXTENSION_POS</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>These are the syntax errors we will generate.
@ -227,7 +233,7 @@ since their entries are governed by different lexical and semantic rules.)
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="function-syntax">&lt;structural-sentence&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::from</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sentence_start</span><span class="plain-syntax">))) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-nt.html#SP9" class="function-link"><span class="function-syntax">NodeType::has_flag</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</span><span class="plain-syntax">, </span><span class="constant-syntax">TABBED_NFLAG</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> (</span><a href="2-nt.html#SP10" class="function-link"><span class="function-syntax">NodeType::has_flag</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</span><span class="plain-syntax">, </span><span class="constant-syntax">TABBED_NFLAG</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_table_mode</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">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_table_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -449,8 +455,9 @@ or until reaching the end of the text: whichever comes first.
</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">Sentences::make_node</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">Sentences::make_node</span></span>:<br/><a href="3-snt.html#SP5">&#167;5</a>, <a href="3-snt.html#SP6_9_3_1">&#167;6.9.3.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</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">stop_character</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">heading_level</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::make_node</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">Sentences::make_node</span></span>:<br/><a href="3-snt.html#SP5">&#167;5</a>, <a href="3-snt.html#SP6_9_2_1">&#167;6.9.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_node_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</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">stop_character</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">heading_level</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">begins_or_ends</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="comment-syntax"> 1 for "begins here", -1 for "ends here"</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new</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">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"empty sentence generated"</span><span class="plain-syntax">);</span>
@ -487,8 +494,8 @@ is declared as if it were a super-heading in the text.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Lexer::file_of_origin</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">)) != </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sf</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">implicit_heading</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">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax">, </span><span class="constant-syntax">sentence_unparsed_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax">, </span><span class="constant-syntax">heading_level_ANNOT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP4" class="function-link"><span class="function-syntax">SyntaxTree::graft_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">implicit_heading</span><span class="plain-syntax">);</span>
@ -504,9 +511,9 @@ is declared as if it were a super-heading in the text.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> == </span><span class="constant-syntax">3</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">begins_or_ends</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">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> == </span><span class="constant-syntax">AFTER_ENDS_EXTENSION_POS</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ExtSpuriouslyContinues_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</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">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> = </span><span class="constant-syntax">4</span><span class="plain-syntax">; </span><span class="comment-syntax"> to avoid multiply issuing this</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> = </span><span class="constant-syntax">PAST_CARING_EXTENSION_POS</span><span class="plain-syntax">; </span><span class="comment-syntax"> to avoid multiply issuing this</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6">&#167;6</a>.</li></ul>
@ -522,8 +529,8 @@ important), or <span class="extract"><span class="extract-syntax">-1</span></spa
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;dividing-sentence&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">switch</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> -1: </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> -2: </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = -1; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> -1: </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> != </span><span class="constant-syntax">NO_EXTENSION_POS</span><span class="plain-syntax">) </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> -2: </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> != </span><span class="constant-syntax">NO_EXTENSION_POS</span><span class="plain-syntax">) </span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> = -1; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">heading_level</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -565,7 +572,8 @@ newlines automatically added at the end of the feed of any source file.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Lexer::break_before</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)+1) != </span><span class="character-syntax">'\n'</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">k</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">k</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::last_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">k</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">)+8) &amp;&amp; (</span><span class="identifier-syntax">k</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">lexer_wordcount</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Lexer::break_before</span><span class="plain-syntax">(</span><span class="identifier-syntax">k</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">k</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">)+8) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">k</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">lexer_wordcount</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Lexer::break_before</span><span class="plain-syntax">(</span><span class="identifier-syntax">k</span><span class="plain-syntax">) != </span><span class="character-syntax">'\n'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">k</span><span class="plain-syntax">++) ;</span>
<span class="plain-syntax"> </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HeadingStopsBeforeEndOfLine_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -579,8 +587,8 @@ in Headings to determine whether we should include the material.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">new</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</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">new</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">sentence_unparsed_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">heading_level_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">heading_level</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP4" class="function-link"><span class="function-syntax">SyntaxTree::graft_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
@ -599,9 +607,10 @@ from an extension, we need to make sure we saw both beginning and end:
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ext_pos</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ExtNoBeginsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ExtNoEndsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">BEFORE_BEGINS_EXTENSION_POS:</span>
<span class="plain-syntax"> </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ExtNoBeginsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MIDDLE_EXTENSION_POS:</span>
<span class="plain-syntax"> </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ExtNoEndsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP5">&#167;5</a>.</li></ul>
@ -658,12 +667,12 @@ sentences and options-file sentences may have been read already.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_3" class="named-paragraph-link"><span class="named-paragraph">Convert comma-divided rule into two sentences, if this is allowed</span><span class="named-paragraph-number">6.9.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_4" class="named-paragraph-link"><span class="named-paragraph">Otherwise, make a SENTENCE node</span><span class="named-paragraph-number">6.9.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_2" class="named-paragraph-link"><span class="named-paragraph">Convert comma-divided rule into two sentences, if this is allowed</span><span class="named-paragraph-number">6.9.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_3" class="named-paragraph-link"><span class="named-paragraph">Otherwise, make a SENTENCE node</span><span class="named-paragraph-number">6.9.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_5" class="named-paragraph-link"><span class="named-paragraph">Convert a rule preamble to a ROUTINE node and enter rule mode</span><span class="named-paragraph-number">6.9.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_4" class="named-paragraph-link"><span class="named-paragraph">Convert a rule preamble to a ROUTINE node and enter rule mode</span><span class="named-paragraph-number">6.9.4</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">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_rule_mode</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_6" class="named-paragraph-link"><span class="named-paragraph">Convert to a COMMAND node and exit rule mode unless a semicolon implies further commands</span><span class="named-paragraph-number">6.9.6</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_5" class="named-paragraph-link"><span class="named-paragraph">Convert to a COMMAND node and exit rule mode unless a semicolon implies more</span><span class="named-paragraph-number">6.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">stop_character</span><span class="plain-syntax"> == </span><span class="character-syntax">';'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="3-snt.html#SP7" class="function-link"><span class="function-syntax">Sentences::syntax_problem</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UnexpectedSemicolon_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</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">stop_character</span><span class="plain-syntax"> = </span><span class="character-syntax">'.'</span><span class="plain-syntax">;</span>
@ -672,12 +681,12 @@ sentences and options-file sentences may have been read already.)
<span class="plain-syntax"> </span><span class="comment-syntax"> at this point we are certainly in assertion mode, not rule mode</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;structural-sentence&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"> == -1)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_8" class="named-paragraph-link"><span class="named-paragraph">Detect a language definition sentence and sneakily act upon it</span><span class="named-paragraph-number">6.9.8</span></a></span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_7" class="named-paragraph-link"><span class="named-paragraph">Detect a language definition sentence and sneakily act upon it</span><span class="named-paragraph-number">6.9.7</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="function-syntax">&lt;&lt;r&gt;&gt;</span><span class="plain-syntax"> == -2) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_9" class="named-paragraph-link"><span class="named-paragraph">Detect a Preform grammar inclusion and sneakily act upon it</span><span class="named-paragraph-number">6.9.9</span></a></span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_8" class="named-paragraph-link"><span class="named-paragraph">Detect a Preform grammar inclusion and sneakily act upon it</span><span class="named-paragraph-number">6.9.8</span></a></span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</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">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</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">SUPERVISOR_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BiblioSentence::notify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">project_ref</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
@ -686,36 +695,16 @@ sentences and options-file sentences may have been read already.)
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_7" class="named-paragraph-link"><span class="named-paragraph">Convert a begins here or ends here sentence to a BEGINHERE or ENDHERE node and return</span><span class="named-paragraph-number">6.9.7</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_6" class="named-paragraph-link"><span class="named-paragraph">Convert a begins here or ends here sentence to a BEGINHERE or ENDHERE node and return</span><span class="named-paragraph-number">6.9.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> none of that happened, so we have a SENTENCE node for certain</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">sentence_unparsed_ANNOT</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">SENTENCE_ANNOTATION_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SENTENCE_ANNOTATION_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</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">NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_1"></a><b>&#167;6.9.1. </b>Rules are ordinarily detected by their colon, which divides the header from the
rest: colons are not otherwise legal in Inform. But there's an exception. If the
sentence consists of text matching the following grammar, followed by comma,
followed by more text, then the comma is read as if it's a colon and the
sentence becomes a rule. For example:
</p>
<blockquote>
<p>Instead of going north, try entering the cage</p>
</blockquote>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;comma-divisible-sentence&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">instead</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">of</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-constant-syntax">every</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">turn</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">before</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-constant-syntax">after</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-constant-syntax">when</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_2"></a><b>&#167;6.9.2. </b>We make an exception to the exception for the serial comma used in a list of
<p class="commentary firstcommentary"><a id="SP6_9_1"></a><b>&#167;6.9.1. </b>We make an exception to the exception for the serial comma used in a list of
alternatives: thus the comma in "Aeschylus, Sophocles, or Euripides" does
not trigger this rule. We need this exception because such lists of
alternatives often occur in rule preambles, where it's the third comma
@ -735,27 +724,27 @@ which divides rule from preamble:
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">......</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_or</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">......</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_3"></a><b>&#167;6.9.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert comma-divided rule into two sentences, if this is allowed</span><span class="named-paragraph-number">6.9.3</span></span><span class="Preform-comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP6_9_2"></a><b>&#167;6.9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert comma-divided rule into two sentences, if this is allowed</span><span class="named-paragraph-number">6.9.2</span></span><span class="Preform-comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_rule_mode</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; ((</span><span class="identifier-syntax">stop_character</span><span class="plain-syntax"> == </span><span class="character-syntax">'.'</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">stop_character</span><span class="plain-syntax"> == </span><span class="character-syntax">'|'</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="function-syntax">&lt;comma-divisible-sentence&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="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_3_1" class="named-paragraph-link"><span class="named-paragraph">Look for a comma and split the sentence at it, unless in serial list</span><span class="named-paragraph-number">6.9.3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_2_1" class="named-paragraph-link"><span class="named-paragraph">Look for a comma and split the sentence at it, unless in serial list</span><span class="named-paragraph-number">6.9.2.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_3_1"></a><b>&#167;6.9.3.1. </b>In such sentences a comma is read as if it were a colon. (The text up to the
<p class="commentary firstcommentary"><a id="SP6_9_2_1"></a><b>&#167;6.9.2.1. </b>In such sentences a comma is read as if it were a colon. (The text up to the
comma will then be given a <span class="extract"><span class="extract-syntax">ROUTINE_NT</span></span> node and the text beyond the comma
will make a <span class="extract"><span class="extract-syntax">INVOCATION_LIST_NT</span></span> node.)
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Look for a comma and split the sentence at it, unless in serial list</span><span class="named-paragraph-number">6.9.3.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Look for a comma and split the sentence at it, unless in serial list</span><span class="named-paragraph-number">6.9.2.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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">earliest_comma_position</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">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_3_1_1" class="named-paragraph-link"><span class="named-paragraph">Set earliest comma to position after the or, if there is one</span><span class="named-paragraph-number">6.9.3.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-snt.html#SP6_9_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Set earliest comma to position after the or, if there is one</span><span class="named-paragraph-number">6.9.2.1.1</span></a></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">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">BW</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">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;list-comma-division&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::from</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">earliest_comma_position</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GET_RW</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;list-comma-division&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
@ -767,8 +756,8 @@ will make a <span class="extract"><span class="extract-syntax">INVOCATION_LIST_N
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_3">&#167;6.9.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_3_1_1"></a><b>&#167;6.9.3.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set earliest comma to position after the or, if there is one</span><span class="named-paragraph-number">6.9.3.1.1</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_2">&#167;6.9.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_2_1_1"></a><b>&#167;6.9.2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set earliest comma to position after the or, if there is one</span><span class="named-paragraph-number">6.9.2.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -777,24 +766,24 @@ will make a <span class="extract"><span class="extract-syntax">INVOCATION_LIST_N
<span class="plain-syntax"> </span><span class="identifier-syntax">earliest_comma_position</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">BW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_3_1">&#167;6.9.3.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_4"></a><b>&#167;6.9.4. </b>At this point we know that the text <span class="extract"><span class="extract-syntax">W</span></span> will make one and only
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9_2_1">&#167;6.9.2.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_3"></a><b>&#167;6.9.3. </b>At this point we know that the text <span class="extract"><span class="extract-syntax">W</span></span> will make one and only
one sentence node in the parse tree, so we may as well create and SyntaxTree::graft it
now. There are a number of special cases with variant node types, but the
commonest outcome is a SENTENCE node, so that's what we shall assume for now.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Otherwise, make a SENTENCE node</span><span class="named-paragraph-number">6.9.4</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Otherwise, make a SENTENCE node</span><span class="named-paragraph-number">6.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">new</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP3" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</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">new</span><span class="plain-syntax"> = </span><a href="2-pn.html#SP2" class="function-link"><span class="function-syntax">Node::new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">sentence_unparsed_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-st.html#SP4" class="function-link"><span class="function-syntax">SyntaxTree::graft_sentence</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">new</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_5"></a><b>&#167;6.9.5. </b>Rules are sequences of phrases with a preamble in front, which we detect by
<p class="commentary firstcommentary"><a id="SP6_9_4"></a><b>&#167;6.9.4. </b>Rules are sequences of phrases with a preamble in front, which we detect by
its terminating colon. For instance:
</p>
@ -838,21 +827,21 @@ want to fuss about changing the punctuation of the last to a full stop
instead of a semicolon. We may lament this, but it is so.)
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert a rule preamble to a ROUTINE node and enter rule mode</span><span class="named-paragraph-number">6.9.5</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert a rule preamble to a ROUTINE node and enter rule mode</span><span class="named-paragraph-number">6.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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_node_type</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stop_character</span><span class="plain-syntax"> == </span><span class="character-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">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_rule_mode</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">ControlStructures::detect</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_entry_node_type</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_entry_node_type</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">CORE_MODULE</span>
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">colon_block_command_ANNOT</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">endif</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_rule_mode</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="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_node_type</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_node_type</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_rule_mode</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>
@ -860,40 +849,40 @@ instead of a semicolon. We may lament this, but it is so.)
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_6"></a><b>&#167;6.9.6. </b>Subsequent commands are divided by semicolons, and any failure of a
<p class="commentary firstcommentary"><a id="SP6_9_5"></a><b>&#167;6.9.5. </b>Subsequent commands are divided by semicolons, and any failure of a
semicolon to appear indicates an end of the rule.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert to a COMMAND node and exit rule mode unless a semicolon implies further commands</span><span class="named-paragraph-number">6.9.6</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert to a COMMAND node and exit rule mode unless a semicolon implies more</span><span class="named-paragraph-number">6.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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_node_type</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_entry_node_type</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">list_entry_node_type</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stop_character</span><span class="plain-syntax"> != </span><span class="character-syntax">';'</span><span class="plain-syntax">) </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_rule_mode</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>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_7"></a><b>&#167;6.9.7. </b>Finally, we must tidy away the previously detected "begins here" and
<p class="commentary firstcommentary"><a id="SP6_9_6"></a><b>&#167;6.9.6. </b>Finally, we must tidy away the previously detected "begins here" and
"ends here" sentences into nodes on the tree.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert a begins here or ends here sentence to a BEGINHERE or ENDHERE node and return</span><span class="named-paragraph-number">6.9.7</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Convert a begins here or ends here sentence to a BEGINHERE or ENDHERE node and return</span><span class="named-paragraph-number">6.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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::trim_last_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::trim_last_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::trim_last_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::trim_last_word</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</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="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">begins_or_ends</span><span class="plain-syntax"> == -1) {</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP7" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP5" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::trim_last_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::trim_last_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP6" class="function-link"><span class="function-syntax">Node::set_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pn.html#SP4" class="function-link"><span class="function-syntax">Node::set_text</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::trim_last_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::trim_last_word</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ref</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
@ -901,12 +890,12 @@ semicolon to appear indicates an end of the rule.
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_8"></a><b>&#167;6.9.8. </b>Why are we taking a sneak look at this sentence now? Because it affects
<p class="commentary firstcommentary"><a id="SP6_9_7"></a><b>&#167;6.9.7. </b>Why are we taking a sneak look at this sentence now? Because it affects
which headings we read the contents of. If we waited until sentence traverses,
it would be too late.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Detect a language definition sentence and sneakily act upon it</span><span class="named-paragraph-number">6.9.8</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Detect a language definition sentence and sneakily act upon it</span><span class="named-paragraph-number">6.9.7</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -918,10 +907,10 @@ it would be too late.
<span class="plain-syntax"> </span><a href="2-na.html#SP6" class="function-link"><span class="function-syntax">Annotations::write_int</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="constant-syntax">sentence_unparsed_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-snt.html#SP6_9">&#167;6.9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_9_9"></a><b>&#167;6.9.9. </b>And for similar reasons:
<p class="commentary firstcommentary"><a id="SP6_9_8"></a><b>&#167;6.9.8. </b>And for similar reasons:
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Detect a Preform grammar inclusion and sneakily act upon it</span><span class="named-paragraph-number">6.9.9</span></span><span class="comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Detect a Preform grammar inclusion and sneakily act upon it</span><span class="named-paragraph-number">6.9.8</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">

View file

@ -0,0 +1,176 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>How To Include This Module</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../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="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="index.html"><span class="selectedlink">syntax</span></a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'How To Include This Module' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">syntax</a></li><li><a href="index.html#P">Preliminaries</a></li><li><b>How To Include This Module</b></li></ul></div>
<p class="purpose">What to do to make use of the syntax module in a new command-line tool.</p>
<ul class="toc"><li><a href="P-htitm.html#SP1">&#167;1. Status</a></li><li><a href="P-htitm.html#SP2">&#167;2. Importing the module</a></li><li><a href="P-htitm.html#SP3">&#167;3. Using callbacks</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Status. </b>The syntax module provided as one of the "shared" Inform modules, which means
that it was built with a view to potential incorporation in multiple tools.
It can be found, for example, in <a href="../inform7/index.html" class="internal">inform7</a>, <a href="../inbuild/index.html" class="internal">inbuild</a> and <a href="../syntax-test/index.html" class="internal">syntax-test</a>,
among others. <a href="../syntax-test/index.html" class="internal">syntax-test</a> may be useful as a minimal example of a tool
using <a href="index.html" class="internal">syntax</a>.
</p>
<p class="commentary">By convention, the modules considered as "shared" have no dependencies on
other modules except for <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a> and other "shared" modules.
</p>
<p class="commentary">A tool can import <a href="index.html" class="internal">syntax</a> only if it also imports <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a> and
<a href="../words-module/index.html" class="internal">words</a>.
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Importing the module. </b>We'll use the term "parent" to mean the tool which is importing <a href="index.html" class="internal">syntax</a>,
that is, which will include its code and be able to use it. As with any
imported module,
</p>
<ul class="items"><li>&#9679; The contents page of the parent's web must identify and locate the
module:
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="element-syntax">Import</span><span class="plain-syntax">:</span><span class="string-syntax"> somepath/syntax</span>
</pre>
<ul class="items"><li>&#9679; The parent must call <span class="extract"><span class="extract-syntax">SyntaxModule::start()</span></span> just after it starts up, and
<span class="extract"><span class="extract-syntax">SyntaxModule::end()</span></span> just before it shuts down. (But just after, and just
before, the corresponding calls to <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.)
</li></ul>
<p class="commentary">But in addition, the parent of <a href="index.html" class="internal">syntax</a> must define some Preform grammar:
</p>
<ul class="items"><li>&#9679; <span class="extract"><span class="extract-syntax">&lt;language-modifying-sentence&gt;</span></span> to recognise sentences modifying the
language which is currently being parsed;
</li><li>&#9679; <span class="extract"><span class="extract-syntax">&lt;structural-sentence&gt;</span></span> to recognise structurally important sentences;
</li><li>&#9679; <span class="extract"><span class="extract-syntax">&lt;dividing-sentence&gt;</span></span> to recognise sentences which divide up the text,
normally headings;
</li><li>&#9679; <span class="extract"><span class="extract-syntax">&lt;comma-divisible-sentence&gt;</span></span> to recognise sentences where a comma plays
a role normally expected to be played by a colon.
</li></ul>
<p class="commentary">Though compulsory, these don't need to do much: see <a href="../syntax-test/1-ut.html" class="internal">Unit Tests (in syntax-test)</a>.
</p>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. Using callbacks. </b>Shared modules like this one are tweaked in behaviour by defining "callback
functions". This means that the parent might provide a function of its own
which would answer a question put to it by the module, or take some action
on behalf of the module: it's a callback in the sense that the parent is
normally calling the module, but then the module calls the parent back to
ask for data or action.
</p>
<p class="commentary">The parent must indicate which function to use by defining a constant with
a specific name as being equal to that function's name. A fictional example
would be
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="function-syntax">@d</span><span class="plain-syntax"> EXPRESS_SURPRISE_SYNTAX_CALLBACK Emotions::gosh</span>
<span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="element-syntax">void Emotions:</span><span class="plain-syntax">:</span><span class="string-syntax">gosh(text_stream *OUT) {</span>
<span class="plain-syntax"> WRITE("Good gracious!\n");</span>
<span class="plain-syntax"> }</span>
</pre>
<p class="commentary">The syntax module has many callbacks, but they are all optional. The following
alphabetical list has references to fuller explanations:
</p>
<ul class="items"><li>&#9679; <span class="extract"><span class="extract-syntax">AMBIGUITY_JOIN_SYNTAX_CALLBACK</span></span> can divert ambiguous readings and prevent
them from being added to a syntax tree: see <a href="2-st.html#SP24" class="internal">SyntaxTree::add_reading</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">ANNOTATION_COPY_SYNTAX_CALLBACK</span></span> can perform deep rather than shallow
copies of node annotations when these are essential: see <a href="2-na.html#SP10" class="internal">Annotations::copy</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK</span></span>, <span class="extract"><span class="extract-syntax">MORE_ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK</span></span>
and <span class="extract"><span class="extract-syntax">EVEN_MORE_ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK</span></span> gives permission for nodes
of given types to have annotations with given IDs, and effectively provides a
way to create custom annotations: see <a href="2-na.html#SP12" class="internal">Annotations::make_annotation_allowed_table</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">BEGIN_OR_END_HERE_SYNTAX_CALLBACK</span></span> is called when a new extension beginning
or ending sentence is found in the source text being broken into sentences:
see <a href="3-snt.html#SP6" class="internal">Sentences::make_node</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">LANGUAGE_ELEMENT_SYNTAX_CALLBACK</span></span> is called when a sentence is found matching
the nonterminal <span class="extract"><span class="extract-syntax">&lt;language-modifying-sentence&gt;</span></span>: see <a href="3-snt.html#SP6" class="internal">Sentences::make_node</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">LOG_UNENUMERATED_NODE_TYPES_SYNTAX_CALLBACK</span></span> is called to log a node type
not recognised as one of the enumerated <span class="extract"><span class="extract-syntax">*_NT</span></span> values: see <a href="2-nt.html#SP8" class="internal">NodeType::log</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">NEW_HEADING_SYNTAX_CALLBACK</span></span> is called when a new heading sentence is found
in the source text being broken into sentences: see <a href="3-snt.html#SP6" class="internal">Sentences::make_node</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">NEW_HEADING_TREE_SYNTAX_CALLBACK</span></span> is called when a new syntax tree is being
created, and needs to be given a matching tree of headings: see <a href="2-st.html#SP2" class="internal">SyntaxTree::new</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">NODE_METADATA_SETUP_SYNTAX_CALLBACK</span></span>, <span class="extract"><span class="extract-syntax">MORE_NODE_METADATA_SETUP_SYNTAX_CALLBACK</span></span>
and <span class="extract"><span class="extract-syntax">EVEN_MORE_NODE_METADATA_SETUP_SYNTAX_CALLBACK</span></span> adds new syntax tree node
types: see <a href="2-nt.html#SP12" class="internal">NodeType::metadata_setup</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">PARENTAGE_EXCEPTIONS_SYNTAX_CALLBACK</span></span> allows exceptions to the rules about
which nodes in a syntax tree can be parents of which other nodes: see
<a href="2-nt.html#SP13" class="internal">NodeType::parentage_allowed</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span></span>, <span class="extract"><span class="extract-syntax">MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span></span>
and <span class="extract"><span class="extract-syntax">EVEN_MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK</span></span> adds permissions for nodes
to be parents of each other: see <a href="2-nt.html#SP4" class="internal">NodeType::make_parentage_allowed_table</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">PROBLEM_SYNTAX_CALLBACK</span></span> is called when a syntax error is found, and can
prevent this from being issued to the terminal as an error message: see
<a href="3-snt.html#SP7" class="internal">Sentences::syntax_problem</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK</span></span> is called when a new, regular
sentence is found in the source text being broken into sentences: see
<a href="3-snt.html#SP6" class="internal">Sentences::make_node</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">IS_SENTENCE_NODE_SYNTAX_CALLBACK</span></span> is asked whether a given node represents
a regular sentence or not: see <a href="2-nt.html#SP11" class="internal">NodeType::is_sentence</a>.
</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="P-wtmd.html">&#10094;</a></li><li class="progresscurrentchapter">P</li><li class="progresssection"><a href="P-wtmd.html">wtmd</a></li><li class="progresscurrent">htitm</li><li class="progresschapter"><a href="1-sm.html">1</a></li><li class="progresschapter"><a href="2-st.html">2</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="1-sm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -58,7 +58,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Shared Modules</a></li><li><a href="index.html">syntax</a></li><li><a href="index.html#P">Preliminaries</a></li><li><b>What This Module Does</b></li></ul></div>
<p class="purpose">An overview of the syntax module's role and abilities.</p>
<ul class="toc"><li><a href="P-wtmd.html#SP1">&#167;1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">&#167;2. Syntax trees</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="P-wtmd.html#SP1">&#167;1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">&#167;2. Syntax trees</a></li><li><a href="P-wtmd.html#SP6">&#167;6. Nodes</a></li><li><a href="P-wtmd.html#SP7">&#167;7. Fussy, defensive, pedantry</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Prerequisites. </b>The syntax module is a part of the Inform compiler toolset. It is
presented as a literate program or "web". Before diving in:
@ -93,20 +93,7 @@ manages extensions, it may generate one <a href="2-st.html#SP2" class="internal"
extension whose text it reads. Still &mdash; there are few trees.
</p>
<p class="commentary">But there are many nodes. Syntax trees are made up of <a href="2-pn.html#SP1" class="internal">parse_node</a> structures.
While these are in principle individual nodes, they effectively represent
subtrees, because they carry with them links to the nodes below. A <a href="2-pn.html#SP1" class="internal">parse_node</a>
object can therefore equally represent "orange", "the orange envelope", or
"now the card is in the orange envelope".
</p>
<p class="commentary">Meaning is an ambiguous thing, and so the tree needs to be capable of
representing multiple interpretations of the same wording. So nodes have not
only <span class="extract"><span class="extract-syntax">next</span></span> and <span class="extract"><span class="extract-syntax">down</span></span> links to other nodes, but also <span class="extract"><span class="extract-syntax">next_alternative</span></span> links,
which &mdash; if used &mdash; fork the syntax tree into different possible readings.
</p>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>The main trunk of the tree can be grown in any sequence: call <a href="2-st.html#SP3" class="internal">SyntaxTree::push_bud</a>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>The trunk of the tree can be grown in any sequence: call <a href="2-st.html#SP3" class="internal">SyntaxTree::push_bud</a>
to begin "budding" from a particular branch, and <a href="2-st.html#SP3" class="internal">SyntaxTree::pop_bud</a> to go back
to where you were. These are also used automatically to ensure that sentences
arriving at <a href="2-st.html#SP4" class="internal">SyntaxTree::graft_sentence</a> are grafted under the headings to
@ -136,12 +123,67 @@ each other using <a href="2-st.html#SP7" class="internal">SyntaxTree::graft</a>,
at all.
</p>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>An extensive suite of functions is provided to make it easy to traverse
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>Meaning is an ambiguous thing, and so the tree needs to be capable of
representing multiple interpretations of the same wording. So nodes have not
only <span class="extract"><span class="extract-syntax">next</span></span> and <span class="extract"><span class="extract-syntax">down</span></span> links to other nodes, but also <span class="extract"><span class="extract-syntax">next_alternative</span></span> links,
which &mdash; if used &mdash; fork the syntax tree into different possible readings.
</p>
<p class="commentary">These are not added to the tree by grafting: that's only done for definite
meanings. Instead, multiple ambiguous readings mostly lie beneath <span class="extract"><span class="extract-syntax">AMBIGUITY_NT</span></span>
nodes &mdash; see <a href="2-st.html#SP24" class="internal">SyntaxTree::add_reading</a>. For example, we might have:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> sun is orange</span>
<span class="plain-syntax"> sun</span>
<span class="plain-syntax"> AMBIGUITY</span>
<span class="plain-syntax"> orange (read as being a fruit)</span>
<span class="plain-syntax"> orange (read as being a colour)</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>An extensive suite of functions is provided to make it easy to traverse
a syntax tree, calling a visitor function on each node: see <a href="2-st.html#SP11" class="internal">SyntaxTree::traverse</a>.
</p>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. Nodes. </b>Syntax trees are made up of <a href="2-pn.html#SP1" class="internal">parse_node</a> structures. While these are in
principle individual nodes, they effectively represent subtrees, because they
carry with them links to the nodes below. A <a href="2-pn.html#SP1" class="internal">parse_node</a> object can
therefore equally represent "orange", "the orange envelope", or "now the card
is in the orange envelope".
</p>
<p class="commentary">Each node carries three essential pieces of information with it:
</p>
<ul class="items"><li>(1) The text giving rise to it (say, "Section Five - Fruit").
</li><li>(2) A node type ID, which in broad terms says what kind of reference is being
made (say, <span class="extract"><span class="extract-syntax">HEADING_NT</span></span>). The possible node types are stored in the C type
<span class="extract"><span class="extract-syntax">node_type_t</span></span>, which corresponds to some metadata in a <a href="2-nt.html#SP3" class="internal">node_type_metadata</a>
object: see <a href="2-pn.html#SP5" class="internal">Node::get_type</a> and <a href="2-nt.html#SP7" class="internal">NodeType::get_metadata</a>.
</li><li>(3) A list of optional annotations, which are either integer or object-valued,
and which give specifics about the meaning (say, the level number in the
hierarchy of headings). See <a href="2-na.html" class="internal">Node Annotations</a>.
</li></ul>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. Fussy, defensive, pedantry. </b>Safe to say that Inform includes bugs: the more defensive coding we can do,
the better. That means not only extensive logging (see <a href="2-pn.html#SP15" class="internal">Node::log_tree</a>)
but also strict verification tests on every tree made (see <a href="2-tv.html" class="internal">Tree Verification</a>).
</p>
<ul class="items"><li>(a) The only nodes allowed to exist are those for node types declared
by <a href="2-nt.html#SP9" class="internal">NodeType::new</a>: more generally, see <a href="2-nt.html" class="internal">Node Types</a> on metadata associated
with these.
</li><li>(b) A node of type <span class="extract"><span class="extract-syntax">A</span></span> can only be a child of a node of type <span class="extract"><span class="extract-syntax">B</span></span> if
<a href="2-nt.html#SP13" class="internal">NodeType::parentage_allowed</a> says so, and this is (mostly) a matter
of calling <a href="2-nt.html#SP5" class="internal">NodeType::allow_parentage_for_categories</a> &mdash; parentage depends
not on the type per se, but on the category of the type, which groups types
together.
</li><li>(c) A node of type <span class="extract"><span class="extract-syntax">A</span></span> can only have an annotation with ID <span class="extract"><span class="extract-syntax">I</span></span> if
<a href="2-na.html#SP14" class="internal">Annotations::is_allowed</a> says so. To declare an annotation legal,
call <span class="extract"><span class="extract-syntax">Annotations::allow(A, I)</span></span>, or <span class="extract"><span class="extract-syntax">Annotations::allow_for_category(C, I)</span></span>
for the category <span class="extract"><span class="extract-syntax">C</span></span> of <span class="extract"><span class="extract-syntax">A</span></span>.
</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">P</li><li class="progresscurrent">wtmd</li><li class="progresschapter"><a href="1-sm.html">1</a></li><li class="progresschapter"><a href="2-st.html">2</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="1-sm.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">P</li><li class="progresscurrent">wtmd</li><li class="progresssection"><a href="P-htitm.html">htitm</a></li><li class="progresschapter"><a href="1-sm.html">1</a></li><li class="progresschapter"><a href="2-st.html">2</a></li><li class="progresschapter"><a href="3-snt.html">3</a></li><li class="progressnext"><a href="P-htitm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -65,6 +65,11 @@
<spon class="sectiontitle">What This Module Does</span></a> -
<span class="sectionpurpose">An overview of the syntax module's role and abilities.</span></p>
</li>
<li>
<p class="sectionentry"><a href="P-htitm.html">
<spon class="sectiontitle">How To Include This Module</span></a> -
<span class="sectionpurpose">What to do to make use of the syntax module in a new command-line tool.</span></p>
</li>
</ul>
</li>
<li>
@ -90,13 +95,13 @@
</li>
<li>
<p class="sectionentry"><a href="2-nt.html">
<spon class="sectiontitle">Node Tyoes</span></a> -
<spon class="sectiontitle">Node Types</span></a> -
<span class="sectionpurpose">Each node in a syntax tree has a type, which informs whether it can have child nodes, and what in general terms it means.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-pn.html">
<spon class="sectiontitle">Parse Nodes</span></a> -
<span class="sectionpurpose">To represent atomic pieces of meaning; or, less pretentiously, to provide the nodes of which syntax trees are made up.</span></p>
<span class="sectionpurpose">Syntax trees are made of single nodes, each representing one way to understand a given piece of text.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-na.html">

View file

@ -52,20 +52,25 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../units.html">Unit Test Tools</a></li><li><a href="index.html">syntax-test</a></li><li><a href="index.html#1">Chapter 1: Scaffolding</a></li><li><b>Unit Tests</b></li></ul></div>
<p class="purpose">How we shall test it.</p>
<ul class="toc"><li><a href="1-ut.html#SP1">&#167;1. </a></li><li><a href="1-ut.html#SP2">&#167;2. Syntax tree</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-ut.html#SP1">&#167;1. Minimal Preform grammar</a></li><li><a href="1-ut.html#SP2">&#167;2. Syntax tree</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b></p>
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Minimal Preform grammar. </b>Only <span class="extract"><span class="extract-syntax">&lt;dividing-sentence&gt;</span></span> can ever match, since the others are wired to match
any text but then fail.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;dividing-sentence&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">chapter</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"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">section</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"> 2</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">chapter</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"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">section</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"> 2</span>
<span class="Preform-function-syntax">&lt;structural-sentence&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"> TRUE; return FAIL_NONTERMINAL;</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; return FAIL_NONTERMINAL;</span>
<span class="Preform-function-syntax">&lt;language-modifying-sentence&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"> TRUE; return FAIL_NONTERMINAL;</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; return FAIL_NONTERMINAL;</span>
<span class="Preform-function-syntax">&lt;comma-divisible-sentence&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"> TRUE; return FAIL_NONTERMINAL;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-prf.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Syntax tree. </b></p>
@ -86,7 +91,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">save_DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/2-str.html#SP20" class="function-link"><span class="function-syntax">Streams::enable_debugging</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-pn.html#SP16" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-pn.html#SP15" class="function-link"><span class="function-syntax">Node::log_tree</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">save_DL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -2021,7 +2021,7 @@ and the pointer result is null.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">multiplicitous</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">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">added_to_result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">QP</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">acc_result</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">Node::add_possible_reading</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">acc_result</span><span class="plain-syntax">, </span><span class="identifier-syntax">QP</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">acc_result</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">SyntaxTree::add_reading</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">acc_result</span><span class="plain-syntax">, </span><span class="identifier-syntax">QP</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">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">goto</span><span class="plain-syntax"> </span><span class="identifier-syntax">Fail</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>

View file

@ -137,7 +137,7 @@ void SourceText::bulk_of_source_loaded(void) {
@ And here is the callback function. It's only ever needed for //inform7//,
not for //inbuild//, which isn't in the inventions business.
@d SENTENCE_ANNOTATION_SYNTAX_CALLBACK SourceText::annotate_new_sentence
@d NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK SourceText::annotate_new_sentence
=
void SourceText::annotate_new_sentence(parse_node *new) {
@ -249,6 +249,22 @@ never accidentally match in the main source text.
include ... by ... | ==> 0; sfsm->nt = INCLUDE_NT;
include (- ... ==> 0; sfsm->nt = INFORM6CODE_NT;
@ Rules are ordinarily detected by their colon, which divides the header from the
rest: colons are not otherwise legal in Inform. But there's an exception. If the
sentence consists of text matching the following grammar, followed by comma,
followed by more text, then the comma is read as if it's a colon and the
sentence becomes a rule. For example:
>> Instead of going north, try entering the cage
=
<comma-divisible-sentence> ::=
instead of ... |
every turn *** |
before ... |
after ... |
when ...
@ Properly speaking, despite the definition above, language modifying sentences
are nonstructural. So what are they doing here? The answer is that we need to
read them early on, because they affect the way that they parse all other

View file

@ -232,7 +232,7 @@ parse_node *ExParser::parse_with_cache(wording W, int context, nonterminal *nt)
preform_lookahead_mode = plm;
@<Write the newly discovered specification to the cache for future use@>;
VerifyTree::verify_structure(spec);
VerifyTree::verify_structure_from(spec);
return spec;
}

View file

@ -291,7 +291,7 @@ parse_node *ExParser::Subtrees::to_specification_inner(int SV_not_SN, wording W,
one->next_alternative = NULL;
parse_node *new_poss = ExParser::Subtrees::to_specification(SV_not_SN, W, one, B);
if (!(Node::is(new_poss, UNKNOWN_NT)))
amb = Node::add_possible_reading(amb, new_poss, W);
amb = SyntaxTree::add_reading(amb, new_poss, W);
}
if (amb == NULL) amb = Specifications::new_UNKNOWN(W);
return amb;
@ -304,7 +304,7 @@ parse_node *ExParser::Subtrees::to_specification_inner(int SV_not_SN, wording W,
hmm->down->next_alternative = NULL;
parse_node *new_poss = ExParser::Subtrees::to_specification(SV_not_SN, W, A, hmm);
if (!(Node::is(new_poss, UNKNOWN_NT)))
amb = Node::add_possible_reading(amb, new_poss, W);
amb = SyntaxTree::add_reading(amb, new_poss, W);
}
if (amb == NULL) amb = Specifications::new_UNKNOWN(W);
return amb;

View file

@ -169,7 +169,7 @@ parse_node *Conditions::attach_historic_requirement(parse_node *cond, time_perio
reading->next_alternative = NULL;
reading = Conditions::attach_historic_requirement(reading, tp);
if (Node::is(reading, UNKNOWN_NT) == FALSE)
amb = Node::add_possible_reading(amb,
amb = SyntaxTree::add_reading(amb,
reading, Node::get_text(cond));
}
return amb;

View file

@ -3511,3 +3511,33 @@ void Dash::experiment(wording W, int full) {
LOG("$m\n", test_tree);
}
}
@
@d AMBIGUITY_JOIN_SYNTAX_CALLBACK Dash::ambiguity_join
=
parse_node *Dash::ambiguity_join(parse_node *existing, parse_node *reading) {
if ((ParseTreeUsage::is_phrasal(reading)) &&
(Node::get_type(reading) == Node::get_type(existing))) {
Dash::add_pr_inv(existing, reading);
return existing;
}
return NULL;
}
void Dash::add_pr_inv(parse_node *E, parse_node *reading) {
for (parse_node *N = reading->down->down, *next_N = (N)?(N->next_alternative):NULL; N;
N = next_N, next_N = (N)?(N->next_alternative):NULL)
Dash::add_single_pr_inv(E, N);
}
void Dash::add_single_pr_inv(parse_node *E, parse_node *N) {
E = E->down->down;
if (Invocations::eq(E, N)) return;
while ((E) && (E->next_alternative)) {
E = E->next_alternative;
if (Invocations::eq(E, N)) return;
}
E->next_alternative = N; N->next_alternative = NULL;
}

View file

@ -79,9 +79,9 @@ void Routines::Compile::routine(phrase *ph,
current_sentence = ph->declaration_node;
if (Phrases::Context::compile_test_head(ph, acl) == FALSE) {
if (ph->declaration_node) {
VerifyTree::verify_structure(ph->declaration_node);
VerifyTree::verify_structure_from(ph->declaration_node);
Routines::Compile::code_block_outer(1, ph->declaration_node->down);
VerifyTree::verify_structure(ph->declaration_node);
VerifyTree::verify_structure_from(ph->declaration_node);
}
current_sentence = ph->declaration_node;
Phrases::Context::compile_test_tail(ph, acl);

View file

@ -1202,3 +1202,12 @@ void NewVerbs::tabulate_meaning(OUTPUT_STREAM, lexicon_entry *lex) {
}
}
@
@d TRACING_LINGUISTICS_CALLBACK NewVerbs::trace_parsing
=
int NewVerbs::trace_parsing(void) {
if (SyntaxTree::is_trace_set(Task::syntax_tree())) return TRUE;
return FALSE;
}

View file

@ -98,8 +98,8 @@ void Sentences::VPs::traverse(void) {
}
void Sentences::VPs::visit(parse_node *p) {
if (Node::get_type(p) == TRACE_NT) {
trace_sentences = 1 - trace_sentences;
Log::tracing_on(trace_sentences, I"Diagramming");
SyntaxTree::toggle_trace(Task::syntax_tree());
Log::tracing_on(SyntaxTree::is_trace_set(Task::syntax_tree()), I"Diagramming");
}
if ((Node::get_type(p) == SENTENCE_NT) &&
(Annotations::read_int(p, sentence_unparsed_ANNOT))) {
@ -331,7 +331,7 @@ action declarations continue with usually extensive further text:
Annotations::write_int(VP_PN, verb_id_ANNOT, ASSERT_VB);
SyntaxTree::graft(Task::syntax_tree(), VP_PN, nss_tree_head);
if (trace_sentences) {
if (SyntaxTree::is_trace_set(Task::syntax_tree())) {
LOG("$T\n", nss_tree_head); STREAM_FLUSH(DL);
}
*X = 0;

View file

@ -61,7 +61,7 @@ void Sentences::Rearrangement::further_material(void) {
}
void Sentences::Rearrangement::tidy_up_ofs_and_froms(void) {
VerifyTree::verify_integrity(Task::syntax_tree()->root_node, FALSE);
VerifyTree::verify_integrity(Task::syntax_tree());
SyntaxTree::traverse_wfirst(Task::syntax_tree(), Sentences::Rearrangement::traverse_for_property_names);
SyntaxTree::traverse(Task::syntax_tree(), Sentences::Rearrangement::traverse_for_nonbreaking_ofs);
}

View file

@ -146,28 +146,28 @@ void ParseTreeUsage::md(void) {
=
void ParseTreeUsage::write_parentage_permissions(void) {
parentage_allowed[L2_NCAT][L3_NCAT] = TRUE;
parentage_allowed[L3_NCAT][L3_NCAT] = TRUE;
parentage_allowed[L2_NCAT][L4_NCAT] = TRUE;
parentage_allowed[L4_NCAT][L4_NCAT] = TRUE;
parentage_allowed[L4_NCAT][UNKNOWN_NCAT] = TRUE;
NodeType::allow_parentage_for_categories(L2_NCAT, L3_NCAT);
NodeType::allow_parentage_for_categories(L3_NCAT, L3_NCAT);
NodeType::allow_parentage_for_categories(L2_NCAT, L4_NCAT);
NodeType::allow_parentage_for_categories(L4_NCAT, L4_NCAT);
NodeType::allow_parentage_for_categories(L4_NCAT, UNKNOWN_NCAT);
parentage_allowed[L4_NCAT][LVALUE_NCAT] = TRUE;
parentage_allowed[L4_NCAT][RVALUE_NCAT] = TRUE;
parentage_allowed[L4_NCAT][COND_NCAT] = TRUE;
NodeType::allow_parentage_for_categories(L4_NCAT, LVALUE_NCAT);
NodeType::allow_parentage_for_categories(L4_NCAT, RVALUE_NCAT);
NodeType::allow_parentage_for_categories(L4_NCAT, COND_NCAT);
parentage_allowed[LVALUE_NCAT][UNKNOWN_NCAT] = TRUE;
parentage_allowed[RVALUE_NCAT][UNKNOWN_NCAT] = TRUE;
parentage_allowed[COND_NCAT][UNKNOWN_NCAT] = TRUE;
parentage_allowed[LVALUE_NCAT][LVALUE_NCAT] = TRUE;
parentage_allowed[RVALUE_NCAT][LVALUE_NCAT] = TRUE;
parentage_allowed[COND_NCAT][LVALUE_NCAT] = TRUE;
parentage_allowed[LVALUE_NCAT][RVALUE_NCAT] = TRUE;
parentage_allowed[RVALUE_NCAT][RVALUE_NCAT] = TRUE;
parentage_allowed[COND_NCAT][RVALUE_NCAT] = TRUE;
parentage_allowed[LVALUE_NCAT][COND_NCAT] = TRUE;
parentage_allowed[RVALUE_NCAT][COND_NCAT] = TRUE;
parentage_allowed[COND_NCAT][COND_NCAT] = TRUE;
NodeType::allow_parentage_for_categories(LVALUE_NCAT, UNKNOWN_NCAT);
NodeType::allow_parentage_for_categories(RVALUE_NCAT, UNKNOWN_NCAT);
NodeType::allow_parentage_for_categories(COND_NCAT, UNKNOWN_NCAT);
NodeType::allow_parentage_for_categories(LVALUE_NCAT, LVALUE_NCAT);
NodeType::allow_parentage_for_categories(RVALUE_NCAT, LVALUE_NCAT);
NodeType::allow_parentage_for_categories(COND_NCAT, LVALUE_NCAT);
NodeType::allow_parentage_for_categories(LVALUE_NCAT, RVALUE_NCAT);
NodeType::allow_parentage_for_categories(RVALUE_NCAT, RVALUE_NCAT);
NodeType::allow_parentage_for_categories(COND_NCAT, RVALUE_NCAT);
NodeType::allow_parentage_for_categories(LVALUE_NCAT, COND_NCAT);
NodeType::allow_parentage_for_categories(RVALUE_NCAT, COND_NCAT);
NodeType::allow_parentage_for_categories(COND_NCAT, COND_NCAT);
}
@
@ -339,7 +339,7 @@ int ParseTreeUsage::parentage_exceptions(node_type_t t_parent, int cat_parent,
@ Further classification:
@d IMMUTABLE_NODE ParseTreeUsage::immutable
@d SENTENCE_NODE_SYNTAX_CALLBACK ParseTreeUsage::second_level
@d IS_SENTENCE_NODE_SYNTAX_CALLBACK ParseTreeUsage::second_level
=
int ParseTreeUsage::second_level(node_type_t t) {
@ -403,7 +403,7 @@ be such that their head nodes each pass this test:
=
int ParseTreeUsage::allow_in_assertions(parse_node *p) {
VerifyTree::verify_structure(p);
VerifyTree::verify_structure_from(p);
if (NodeType::has_flag(Node::get_type(p), ASSERT_NFLAG)) return TRUE;
return FALSE;
}
@ -487,7 +487,8 @@ void ParseTreeUsage::log_node(OUTPUT_STREAM, parse_node *pn) {
@ =
void ParseTreeUsage::verify(void) {
VerifyTree::verify_node(Task::syntax_tree());
VerifyTree::verify_integrity(Task::syntax_tree());
VerifyTree::verify_structure(Task::syntax_tree());
}
@

View file

@ -192,7 +192,7 @@ void Assertions::Copular::make_assertion(parse_node *px, parse_node *py) {
if (Assertions::Creator::consult_the_creator(px, py) == FALSE) return;
}
if (trace_sentences) LOG("$T", current_sentence);
if (SyntaxTree::is_trace_set(Task::syntax_tree())) LOG("$T", current_sentence);
if (<s-existential-np>(Node::get_text(px))) {
if (traverse == 1) Assertions::Copular::make_existential_assertion(py);
px = py;

View file

@ -110,7 +110,7 @@ void Assertions::Traverse::traverse2(void) {
void Assertions::Traverse::traverse(int pass) {
Assertions::Traverse::new_discussion(); /* clear memory of what the subject and object of discussion are */
traverse = pass;
trace_sentences = FALSE;
SyntaxTree::clear_trace(Task::syntax_tree());
if (sentence_handlers_initialised == FALSE) @<Initialise sentence handlers@>;
@ -200,7 +200,7 @@ handlers until right at the end of the program. The routine which does so,
}
@<Deal with an individual sentence@> =
if ((trace_sentences) && (Node::get_type(p) != TRACE_NT))
if ((SyntaxTree::is_trace_set(Task::syntax_tree())) && (Node::get_type(p) != TRACE_NT))
LOG("\n[%W]\n", Node::get_text(p));
@<If this sentence can be handled, then do so and continue@>;
@ -248,9 +248,9 @@ void Assertions::Traverse::switch_sentence_trace(parse_node *PN) {
"so I'll note it down in the Telemetry file (if you're keeping one.)");
telemetry_recording = tr;
} else {
trace_sentences = 1 - trace_sentences;
if (traverse == 1) Log::tracing_on(trace_sentences, I"Pass 1");
else Log::tracing_on(trace_sentences, I"Pass 2");
SyntaxTree::toggle_trace(Task::syntax_tree());
if (traverse == 1) Log::tracing_on(SyntaxTree::is_trace_set(Task::syntax_tree()), I"Pass 1");
else Log::tracing_on(SyntaxTree::is_trace_set(Task::syntax_tree()), I"Pass 2");
}
}

View file

@ -101,9 +101,9 @@ verbs were added to the grammar. Still, it was a pity.
=
<sentence> internal {
if (trace_sentences) { LOG("Parsing the sentence: %W\n", W); LOG_INDENT; }
if (VerbPhrases::tracing()) { LOG("Parsing the sentence: %W\n", W); LOG_INDENT; }
int rv = VerbPhrases::seek(W, X, XP, 0);
if (trace_sentences) {
if (VerbPhrases::tracing()) {
LOG_OUTDENT;
if (rv) {
LOG("Passed\n"); LOG_INDENT;
@ -137,7 +137,7 @@ which word positions might be the beginning of verb phrases.
int VerbPhrases::seek(wording W, int *X, void **XP, int existential_OP_edge) {
int viable[VIABILITY_MAP_SIZE];
@<Calculate the viability map@>;
if (trace_sentences) @<Log the viability map@>;
if (VerbPhrases::tracing()) @<Log the viability map@>;
@<Seek verb usages@>;
return FALSE;
}
@ -330,7 +330,7 @@ certainty are removed from these.
}
certainty = pre_certainty;
if (certainty == UNKNOWN_CE) certainty = post_certainty;
if (trace_sentences) LOG("Found usage, pass %d tier %d: (%W) $w (%W)\n",
if (VerbPhrases::tracing()) LOG("Found usage, pass %d tier %d: (%W) $w (%W)\n",
pass, tier->priority, ISW, vi, IOW);
@ If the verb form is, say, "place in ... with ...", and we have detected the
@ -352,7 +352,8 @@ who is in the Dining Room" (note the additional "is"), it would.
if (existential_OP_edge > 0) { /* i.e., if we are looking for "(S which) verbs (O)" */
if (<pre-verb-rc-marker>(SW)) { /* there is indeed a "which" at the end of |SW| */
SW = GET_RW(<pre-verb-rc-marker>, 1); /* so trim it off */
if (trace_sentences) LOG("Trimmed to: (%W) $w (%W)\n", SW, vi, OW);
if (VerbPhrases::tracing())
LOG("Trimmed to: (%W) $w (%W)\n", SW, vi, OW);
}
}
@ -396,7 +397,7 @@ who is in the Dining Room" (note the additional "is"), it would.
usage_succeeds = TRUE;
}
if (usage_succeeds == FALSE) {
if (trace_sentences) LOG("$w + $p + $p : failed for lack of $p\n",
if (VerbPhrases::tracing()) LOG("$w + $p + $p : failed for lack of $p\n",
vi, prep, second_prep, prep);
continue;
}
@ -419,7 +420,7 @@ who is in the Dining Room" (note the additional "is"), it would.
usage_succeeds = TRUE;
}
if (usage_succeeds == FALSE) {
if (trace_sentences) LOG("$w + $p + $p : failed for lack of $p\n",
if (VerbPhrases::tracing()) LOG("$w + $p + $p : failed for lack of $p\n",
vi, prep, second_prep, second_prep);
continue;
}
@ -450,10 +451,12 @@ representing the verb.
VP_PN = VerbPhrases::accept(vf, VP_PN, SW, OW, O2W);
if (VP_PN) {
*XP = VP_PN;
if (trace_sentences) LOG("Accepted as $w + $p + $p\n", vi, prep, second_prep);
if (VerbPhrases::tracing())
LOG("Accepted as $w + $p + $p\n", vi, prep, second_prep);
return TRUE;
} else {
if (trace_sentences) LOG("Rejected as $w + $p + $p\n", vi, prep, second_prep);
if (VerbPhrases::tracing())
LOG("Rejected as $w + $p + $p\n", vi, prep, second_prep);
}
@ This routine completes the sentence diagram by adding further nodes to
@ -547,3 +550,15 @@ the exactly equivalent idea of the hat being worn by Darcy.
V->next->next = NounPhrases::PN_rel(
Node::get_text(V), VerbMeanings::reverse_VMT(meaning), STANDARD_RELN, O_PN);
}
@
=
int VerbPhrases::tracing(void) {
#ifdef TRACING_LINGUISTICS_CALLBACK
return TRACING_LINGUISTICS_CALLBACK();
#endif
#ifndef TRACING_LINGUISTICS_CALLBACK
return FALSE;
#endif
}

View file

@ -19,8 +19,6 @@ int main(int argc, char **argv) {
SyntaxModule::start();
LinguisticsModule::start();
Unit::start_diagrams();
CommandLine::declare_heading(L"linguistics-test: a tool for testing the linguistics module\n");
CommandLine::declare_switch(TEST_DIAGRAMS_CLSW, L"test-diagrams", 2,

View file

@ -23,19 +23,27 @@ int Unit::allow_generally(verb_conjugation *vc, int tense, int sense, int person
return TRUE;
}
@h
@h Minimal Preform grammar.
Only |<dividing-sentence>| can ever match, since the others are wired to match
any text but then fail.
=
<dividing-sentence> ::=
chapter ... | ==> 1
section ... ==> 2
chapter ... | ==> 1
section ... ==> 2
<structural-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
... ==> TRUE; return FAIL_NONTERMINAL;
<language-modifying-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
... ==> TRUE; return FAIL_NONTERMINAL;
<comma-divisible-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
@
=
<unexceptional-sentence> ::=
<sentence> ==> @<Report any error@>
@ -54,10 +62,6 @@ int Unit::allow_generally(verb_conjugation *vc, int tense, int sense, int person
=
int my_first_verb = TRUE;
void Unit::start_diagrams(void) {
trace_sentences = TRUE;
}
parse_node_tree *syntax_tree = NULL;
void Unit::test_diagrams(text_stream *arg) {
Streams::enable_debugging(STDOUT);
@ -73,6 +77,7 @@ void Unit::test_diagrams(text_stream *arg) {
text_stream *save_DL = DL;
DL = STDOUT;
Streams::enable_debugging(DL);
SyntaxTree::clear_trace(syntax_tree);
SyntaxTree::traverse(syntax_tree, Unit::diagram);
Node::log_tree(DL, syntax_tree->root_node);
DL = save_DL;

View file

@ -7,16 +7,25 @@ How we shall test it.
=
parse_node_tree *syntax_tree = NULL;
@h Minimal Preform grammar.
Only |<dividing-sentence>| can ever match, since the others are wired to match
any text but then fail.
=
<dividing-sentence> ::=
chapter ... | ==> 1
section ... ==> 2
chapter ... | ==> 1
section ... ==> 2
<structural-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
... ==> TRUE; return FAIL_NONTERMINAL;
<language-modifying-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
... ==> TRUE; return FAIL_NONTERMINAL;
<comma-divisible-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
@ =
<scan-individual-phrase> ::=
... banana ... ==> @<Issue PM_UnexpectedFruit problem@>;

View file

@ -1,4 +1,4 @@
[NodeType::] Node Tyoes.
[NodeType::] Node Types.
Each node in a syntax tree has a type, which informs whether it can have
child nodes, and what in general terms it means.
@ -67,10 +67,24 @@ void NodeType::make_parentage_allowed_table(void) {
for (int i = 0; i < NO_DEFINED_NCAT_VALUES; i++)
for (int j = 0; j < NO_DEFINED_NCAT_VALUES; j++)
parentage_allowed[i][j] = FALSE;
parentage_allowed[L1_NCAT][L1_NCAT] = TRUE;
NodeType::allow_parentage_for_categories(L1_NCAT, L1_NCAT);
#ifdef PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK
PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK();
#endif
#ifdef MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK
MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK();
#endif
#ifdef EVEN_MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK
EVEN_MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK();
#endif
}
@ The callback function |PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK| should
call this as needed to fill in more permissions:
=
void NodeType::allow_parentage_for_categories(int A, int B) {
parentage_allowed[A][B] = TRUE;
}
@ The bitmap of node flags currently contains only two:
@ -164,10 +178,10 @@ text_stream *NodeType::get_name(node_type_t t) {
=
int NodeType::is_sentence(node_type_t t) {
#ifdef SENTENCE_NODE_SYNTAX_CALLBACK
return SENTENCE_NODE_SYNTAX_CALLBACK(t);
#ifdef IS_SENTENCE_NODE_SYNTAX_CALLBACK
return IS_SENTENCE_NODE_SYNTAX_CALLBACK(t);
#endif
#ifndef SENTENCE_NODE_SYNTAX_CALLBACK
#ifndef IS_SENTENCE_NODE_SYNTAX_CALLBACK
return FALSE;
#endif
}

View file

@ -1,7 +1,7 @@
[Node::] Parse Nodes.
To represent atomic pieces of meaning; or, less pretentiously, to provide
the nodes of which syntax trees are made up.
Syntax trees are made of single nodes, each representing one way to understand
a given piece of text.
@h Nodes themselves.
Each node is an instance of this:
@ -9,26 +9,18 @@ Each node is an instance of this:
=
typedef struct parse_node {
struct wording text_parsed; /* the text being interpreted by this node */
node_type_t node_type; /* what the node basically represents */
struct parse_node_annotation *annotations; /* see //Node Annotations// */
struct parse_node *down; /* pointers within the current interpretation */
struct parse_node *next;
int score; /* used to choose most likely interpretation */
struct parse_node *next_alternative; /* fork to alternative interpretation */
int log_time; /* used purely as a defensive measure when writing debugging log */
int score; /* scratch storage for choosing between interpretations */
int last_seen_on_traverse; /* scratch storage for detecting accidental loops */
CLASS_DEFINITION
} parse_node;
@ Various modules conventionally use this global setting to toggle debugging
log output:
=
int trace_sentences = FALSE;
@h Creation.
=
@ -38,7 +30,7 @@ parse_node *Node::new(node_type_t t) {
Node::set_text(pn, EMPTY_WORDING);
Annotations::clear(pn);
pn->down = NULL; pn->next = NULL; pn->next_alternative = NULL;
pn->log_time = 0;
pn->last_seen_on_traverse = 0;
Node::set_score(pn, 0);
return pn;
}
@ -236,12 +228,10 @@ that we're logging a badly-formed tree; this should never happen, but since
logging is a diagnostic tool, we want it to work even when Inform is sick.
=
int pn_log_token = 0;
void Node::log_tree(OUTPUT_STREAM, void *vpn) {
parse_node *pn = (parse_node *) vpn;
if (pn == NULL) { WRITE("<null-meaning-list>\n"); return; }
Node::log_subtree_recursively(OUT, pn, 0, 0, 1, ++pn_log_token);
Node::log_subtree_recursively(OUT, pn, 0, 0, 1, SyntaxTree::new_traverse_token());
}
void Node::log_subtree(OUTPUT_STREAM, void *vpn) {
@ -260,12 +250,13 @@ to pursue |next| links, since otherwise a source text with more than 100,000
sentences or so will exceed the typical stack size Inform has to run in.
=
void Node::log_subtree_recursively(OUTPUT_STREAM, parse_node *pn, int num, int of, int gen, int ltime) {
void Node::log_subtree_recursively(OUTPUT_STREAM, parse_node *pn, int num,
int of, int gen, int traverse_token) {
while (pn) {
if (pn->log_time == ltime) {
if (pn->last_seen_on_traverse == traverse_token) {
WRITE("*** Not a tree: %W ***\n", Node::get_text(pn)); return;
}
pn->log_time = ltime;
pn->last_seen_on_traverse = traverse_token;
@<Calculate num and of such that this is [num/of] if they aren't already supplied@>;
if (pn == NULL) { WRITE("<null-parse-node>\n"); return; }
@ -276,10 +267,11 @@ void Node::log_subtree_recursively(OUTPUT_STREAM, parse_node *pn, int num, int o
WRITE("$P\n", pn);
if (pn->down) {
LOG_INDENT;
Node::log_subtree_recursively(OUT, pn->down, 0, 0, gen+1, ltime);
Node::log_subtree_recursively(OUT, pn->down, 0, 0, gen+1, traverse_token);
LOG_OUTDENT;
}
if (pn->next_alternative) Node::log_subtree_recursively(OUT, pn->next_alternative, num+1, of, gen+1, ltime);
if (pn->next_alternative) Node::log_subtree_recursively(OUT,
pn->next_alternative, num+1, of, gen+1, traverse_token);
pn = pn->next; num = 0; of = 0; gen++;
}
@ -315,7 +307,8 @@ void Node::log_node(OUTPUT_STREAM, void *vpn) {
Diagrams::log_node(OUT, pn);
#endif
switch(pn->node_type) {
case HEADING_NT: WRITE(" (level %d)", Annotations::read_int(pn, heading_level_ANNOT)); break;
case HEADING_NT: WRITE(" (level %d)", Annotations::read_int(pn,
heading_level_ANNOT)); break;
}
#endif
int a = 0;
@ -332,60 +325,3 @@ void Node::log_with_annotations(parse_node *pn) {
LOG("-%d", pna->annotation_id);
LOG("\n");
}
@h Ambiguity subtrees.
=
parse_node *Node::add_possible_reading(parse_node *existing, parse_node *reading, wording W) {
if (existing == NULL) return reading;
#ifdef CORE_MODULE
if (Node::is(reading, UNKNOWN_NT)) return existing;
#endif
if (Node::is(reading, AMBIGUITY_NT)) reading = reading->down;
if (Node::is(existing, AMBIGUITY_NT)) {
#ifdef CORE_MODULE
if (ParseTreeUsage::is_phrasal(reading))
for (parse_node *E = existing->down; E; E = E->next_alternative)
if (Node::get_type(reading) == Node::get_type(E)) {
Node::add_pr_inv(E, reading);
return existing;
}
#endif
parse_node *L = existing->down;
while ((L) && (L->next_alternative)) L = L->next_alternative;
L->next_alternative = reading;
return existing;
}
#ifdef CORE_MODULE
if ((ParseTreeUsage::is_phrasal(reading)) &&
(Node::get_type(reading) == Node::get_type(existing))) {
Node::add_pr_inv(existing, reading);
return existing;
}
#endif
parse_node *A = Node::new_with_words(AMBIGUITY_NT, W);
A->down = existing;
A->down->next_alternative = reading;
return A;
}
#ifdef CORE_MODULE
void Node::add_pr_inv(parse_node *E, parse_node *reading) {
for (parse_node *N = reading->down->down, *next_N = (N)?(N->next_alternative):NULL; N;
N = next_N, next_N = (N)?(N->next_alternative):NULL)
Node::add_single_pr_inv(E, N);
}
void Node::add_single_pr_inv(parse_node *E, parse_node *N) {
E = E->down->down;
if (Invocations::eq(E, N)) return;
while ((E) && (E->next_alternative)) {
E = E->next_alternative;
if (Invocations::eq(E, N)) return;
}
E->next_alternative = N; N->next_alternative = NULL;
}
#endif

View file

@ -30,6 +30,7 @@ typedef struct parse_node_tree {
struct parse_node *bud_parent_stack[MAX_BUD_STACK_SIZE];
struct parse_node *last_sentence; /* cached position in tree */
int allow_last_sentence_cacheing;
int trace_sentences;
HEADING_TREE_SYNTAX_TYPE *headings;
CLASS_DEFINITION
} parse_node_tree;
@ -40,6 +41,7 @@ parse_node_tree *SyntaxTree::new(void) {
T->bud_parent_sp = 0;
T->last_sentence = NULL;
T->allow_last_sentence_cacheing = FALSE;
T->trace_sentences = FALSE;
SyntaxTree::push_bud(T, T->root_node);
#ifdef NEW_HEADING_TREE_SYNTAX_CALLBACK
T->headings = NEW_HEADING_TREE_SYNTAX_CALLBACK(T);
@ -440,3 +442,96 @@ void SyntaxTree::traverse_wfirst_from(parse_node *pn, void (*visitor)(parse_node
}
current_sentence = SCS;
}
@h Cautious traverses.
When logging or verifying the tree, we cannot use the carefree functions
above: the tree might be malformed. As a way to detect cycles, we call for
a new "traverse token" -- just a unique integer value -- and mark all nodes
visited with that value.
=
int pn_log_token = 0;
int SyntaxTree::new_traverse_token(void) {
return ++pn_log_token;
}
@h Toggling log output.
Various modules conventionally use this global setting to toggle debugging
log output:
=
int SyntaxTree::is_trace_set(parse_node_tree *T) {
return T->trace_sentences;
}
void SyntaxTree::set_trace(parse_node_tree *T) {
T->trace_sentences = TRUE;
}
void SyntaxTree::clear_trace(parse_node_tree *T) {
T->trace_sentences = FALSE;
}
void SyntaxTree::toggle_trace(parse_node_tree *T) {
T->trace_sentences = (T->trace_sentences)?FALSE:TRUE;
}
@h Ambiguity subtrees.
The following function adds a new |reading| to an |existing| interpretation
of some wording |W|, and return the node now representing. For example,
suppose the text "orange" can be read as a noun for fruit, a noun for colour,
or an adjective, resulting in nodes |fruit_node| and |colour_node| and |adj_node|.
Then:
(a) |SyntaxTree::add_reading(NULL, fruit_node, W)| returns |noun_node|,
(b) but |SyntaxTree::add_reading(fruit_node, colour_node, W)| returns this subtree:
= (text)
AMBIGUITY_NT A
fruit_node
colour_node
=
(c) and |SyntaxTree::add_reading(A, adj_node, W)| returns the subtree:
= (text)
AMBIGUITY_NT A
fruit_node
colour_node
adj_node
=
Thus it accumulates possible readings of a given text.
A complication is that the following callback function is offered the chance
to amend this process in individual cases; it's called whenever |reading|
is about to become one of the alternatives to some existing |E|. If it returns
a non-null node, that's the answer, and otherwise we carry on as normal.
(//inform7// uses this to handle ambiguous phrase invocations to be sorted
out in type-checking: see //core: Dash//.)
=
parse_node *SyntaxTree::add_reading(parse_node *existing, parse_node *reading, wording W) {
if (existing == NULL) return reading;
if (Node::is(reading, UNKNOWN_NT)) return existing;
if (Node::is(reading, AMBIGUITY_NT)) reading = reading->down;
if (Node::is(existing, AMBIGUITY_NT)) {
#ifdef AMBIGUITY_JOIN_SYNTAX_CALLBACK
for (parse_node *E = existing->down; E; E = E->next_alternative) {
parse_node *pn = AMBIGUITY_JOIN_SYNTAX_CALLBACK(E, reading);
if (pn) return pn;
}
#endif
parse_node *L = existing->down;
while ((L) && (L->next_alternative)) L = L->next_alternative;
L->next_alternative = reading;
return existing;
}
#ifdef AMBIGUITY_JOIN_SYNTAX_CALLBACK
parse_node *pn = AMBIGUITY_JOIN_SYNTAX_CALLBACK(existing, reading);
if (pn) return pn;
#endif
parse_node *A = Node::new_with_words(AMBIGUITY_NT, W);
A->down = existing;
A->down->next_alternative = reading;
return A;
}

View file

@ -5,6 +5,8 @@ Inform contains bugs of a kind which lead to malformed syntax trees: that
should never happen even if the source text being compiled is a dumpster fire.
@h Verify integrity.
We can perform two different checks.
The first duty of a tree is to contain no loops, and the following checks
that (rejecting even undirected loops). In addition, it checks that each
node has an enumerated node type, rather than a meaning code.
@ -12,33 +14,30 @@ node has an enumerated node type, rather than a meaning code.
=
int tree_stats_size = 0, tree_stats_depth = 0, tree_stats_width = 0;
void VerifyTree::verify_integrity(parse_node *p, int worth_logging) {
void VerifyTree::verify_integrity(parse_node_tree *T) {
tree_stats_size = 0; tree_stats_depth = 0; tree_stats_width = 1;
VerifyTree::verify_tree_integrity_recursively(p->down, p, "down", 0, ++pn_log_token);
VerifyTree::verify_integrity_below(T->root_node);
}
void VerifyTree::verify_integrity_below(parse_node *p) {
VerifyTree::verify_integrity_r(p->down, p, "down", 0,
SyntaxTree::new_traverse_token());
}
@ The verification traverse is a very cautious manoeuvre: we step through
the tree, testing each branch with our outstretched foot in case it might
be illusory or broken. At the first sign of trouble we panic.
the tree, testing each branch with our outstretched foot. At the first sign
of trouble we panic.
=
void VerifyTree::verify_tree_integrity_recursively(parse_node *p,
parse_node *from, char *way, int depth, int ltime) {
int width;
pointer_sized_int probably_an_address = (pointer_sized_int) p;
depth++; if (depth > tree_stats_depth) tree_stats_depth = depth;
for (width = 0; p; p = p->next, width++) {
if ((probably_an_address == 0) || (probably_an_address == -1)) {
LOG("Link %s broken from:\n$P", way, from);
Errors::set_internal_handler(NULL);
internal_error("Link broken in parse tree");
}
if (p->log_time == ltime) {
void VerifyTree::verify_integrity_r(parse_node *p,
parse_node *from, char *way, int depth, int traverse_token) {
for (int width = 0; p; p = p->next, width++) {
if (p->last_seen_on_traverse == traverse_token) {
LOG("Cycle found in parse tree, found %s from:\n$P", way, from);
Errors::set_internal_handler(NULL);
internal_error("Cycle found in parse tree");
}
p->log_time = ltime;
p->last_seen_on_traverse = traverse_token;
node_type_t t = Node::get_type(p);
if (NodeType::is_enumerated(t)) tree_stats_size++;
else {
@ -47,50 +46,45 @@ void VerifyTree::verify_tree_integrity_recursively(parse_node *p,
internal_error("Link broken in parse tree");
}
if (p->next_alternative)
VerifyTree::verify_tree_integrity_recursively(p->next_alternative, p, "alt", depth, ltime);
VerifyTree::verify_integrity_r(p->next_alternative,
p, "alt", depth, traverse_token);
if (p->down)
VerifyTree::verify_tree_integrity_recursively(p->down, p, "down", depth, ltime);
VerifyTree::verify_integrity_r(p->down,
p, "down", depth+1, traverse_token);
if (width > tree_stats_width) tree_stats_width = width;
}
if (width > tree_stats_width) tree_stats_width = width;
if (depth > tree_stats_depth) tree_stats_depth = depth;
}
@h Verify structure.
The parse tree is a complicated structure, arbitrarily wide and deep, and
containing many different node types, each subject to its own rules of usage.
(For instance, a |SENTENCE_NT| node cannot legally be beneath a
|PROPER_NOUN_NT| one.) This is both good and bad: bad because complexity is
always the enemy of program correctness, good because it gives us an
independent opportunity to test a great deal of what earlier code has done.
If, given every test case, we always construct a well-formed tree, we must be
doing something right.
In this second check, we ensure that nodes have acceptable parentage and
annotations -- that is, parentage and annotations which fall within the
permissions set up when their node types were created.
The collection of rules like this which the tree must satisfy is called its
"invariant", and is expressed by the code below. Note that this is
verification, not an attempt to correct matters. If any test fails, Inform
will stop with an internal error. (If there are multiple failures, we
itemise them to the debugging log, and only produce a single internal error
at the end.)
If any test fails, Inform will stop with an internal error. (If there are
multiple failures, we itemise them to the debugging log, and only produce
a single internal error at the end.)
We protect ourselves by first checking that the tree is intact as a
structure: once we know the tree is safe to climb over, we can wander
about counting children with impunity.
about counting branches with impunity.
=
void VerifyTree::verify_node(parse_node_tree *T) {
void VerifyTree::verify_structure(parse_node_tree *T) {
if (T->root_node == NULL) {
Errors::set_internal_handler(NULL);
internal_error("Root of parse tree NULL");
}
VerifyTree::verify_structure(T->root_node);
VerifyTree::verify_structure_from(T->root_node);
}
int node_errors = 0;
void VerifyTree::verify_structure(parse_node *p) {
VerifyTree::verify_integrity(p, FALSE);
node_errors = 0;
VerifyTree::verify_structure_recursively(p, NULL);
if (node_errors > 0) {
LOG("[Verification failed: %d node errors]\n", node_errors);
void VerifyTree::verify_structure_from(parse_node *p) {
VerifyTree::verify_integrity_below(p);
int errors_found = VerifyTree::verify_structure_r(p, NULL, 0);
if (errors_found > 0) {
LOG("[Verification failed: %d node errors]\n", errors_found);
Errors::set_internal_handler(NULL);
internal_error("Parse tree broken");
}
@ -102,7 +96,7 @@ parse node and (ii) either |p| is the tree root, in which case |parent| is
among its children.
=
void VerifyTree::verify_structure_recursively(parse_node *p, parse_node *parent) {
int VerifyTree::verify_structure_r(parse_node *p, parse_node *parent, int ec) {
node_type_t t = Node::get_type(p);
node_type_metadata *metadata = NodeType::get_metadata(t);
if (metadata == NULL) internal_error("broken tree should have been reported");
@ -113,19 +107,21 @@ void VerifyTree::verify_structure_recursively(parse_node *p, parse_node *parent)
int children_count = 0;
for (parse_node *q=p->down; q; q=q->next, children_count++)
VerifyTree::verify_structure_recursively(q, p);
ec += VerifyTree::verify_structure_r(q, p, ec);
@<Check rule (4) of the invariant@>;
if (p->next_alternative)
VerifyTree::verify_structure_recursively(p->next_alternative, parent);
ec += VerifyTree::verify_structure_r(p->next_alternative, parent, ec);
return ec;
}
@ Rule (1): no INVALID nodes.
@<Check rule (1) of the invariant@> =
if (t == INVALID_NT) {
LOG("N%d is $N, which is not allowed except temporarily\n", p->allocation_id, t);
LOG("N%d is $N, which is not allowed except temporarily\n",
p->allocation_id, t);
@<Log this invariant failure@>
}
@ -146,7 +142,8 @@ void VerifyTree::verify_structure_recursively(parse_node *p, parse_node *parent)
node_type_t t_parent = Node::get_type(parent);
if (!(NodeType::parentage_allowed(t_parent, t))) {
LOG("N%d is $N: should not be a child of $N\n", p->allocation_id, t, t_parent);
LOG("N%d is $N: should not be a child of $N\n",
p->allocation_id, t, t_parent);
@<Log this invariant failure@>
}
@ -164,7 +161,9 @@ void VerifyTree::verify_structure_recursively(parse_node *p, parse_node *parent)
@<Log this invariant failure@>
}
@ (Logging the root node produces an absolutely enormous output.)
@<Log this invariant failure@> =
if (Node::is(parent, ROOT_NT)) LOG("Failing subtree:\n$T", p);
else LOG("Failing subtree:\n$T", parent);
node_errors++;
ec++;

View file

@ -33,10 +33,16 @@ in Preform grammar functions.
@default PROBLEM_REF_SYNTAX_TYPE void
@default PROJECT_REF_SYNTAX_TYPE void
@e NO_EXTENSION_POS from 0
@e BEFORE_BEGINS_EXTENSION_POS
@e MIDDLE_EXTENSION_POS
@e AFTER_ENDS_EXTENSION_POS
@e PAST_CARING_EXTENSION_POS
=
typedef struct syntax_fsm_state {
source_file *sf; /* reading from this source file */
int ext_pos; /* 0: not extension; 1: before "begins here"; 2: before "ends here"; 3: after */
int ext_pos; /* one of the |*_EXTENSION_POS| values: where we are in an extension */
int skipping_material_at_level;
int main_source_start_wn;
node_type_t nt;
@ -66,7 +72,8 @@ void Sentences::reset(syntax_fsm_state *sfsm, int is_extension,
sfsm->skipping_material_at_level = -1;
sfsm->ref = ref;
sfsm->project_ref = project_ref;
if (is_extension) sfsm->ext_pos = 1; else sfsm->ext_pos = 0;
if (is_extension) sfsm->ext_pos = BEFORE_BEGINS_EXTENSION_POS;
else sfsm->ext_pos = NO_EXTENSION_POS;
}
@ These are the syntax errors we will generate.
@ -311,7 +318,8 @@ or until reaching the end of the text: whichever comes first.
=
void Sentences::make_node(parse_node_tree *T, wording W, int stop_character) {
int heading_level = 0, begins_or_ends = 0;
int heading_level = 0;
int begins_or_ends = 0; /* 1 for "begins here", -1 for "ends here" */
parse_node *new;
if (Wordings::empty(W)) internal_error("empty sentence generated");
@ -357,9 +365,9 @@ is declared as if it were a super-heading in the text.
sfsm->sf = Lexer::file_of_origin(Wordings::first_wn(W));
@<Reject if we have run on past the end of an extension@> =
if ((sfsm->ext_pos == 3) && (begins_or_ends == 0)) {
if ((sfsm->ext_pos == AFTER_ENDS_EXTENSION_POS) && (begins_or_ends == 0)) {
Sentences::syntax_problem(ExtSpuriouslyContinues_SYNERROR, W, sfsm->ref, 0);
sfsm->ext_pos = 4; /* to avoid multiply issuing this */
sfsm->ext_pos = PAST_CARING_EXTENSION_POS; /* to avoid multiply issuing this */
}
@ The client must define a Preform nonterminal called |<dividing-sentence>|
@ -370,8 +378,8 @@ important), or |-1| to mean that the sentence begins an extension, or
@<Detect a dividing sentence@> =
if (<dividing-sentence>(W)) {
switch (<<r>>) {
case -1: if (sfsm->ext_pos > 0) begins_or_ends = 1; break;
case -2: if (sfsm->ext_pos > 0) begins_or_ends = -1; break;
case -1: if (sfsm->ext_pos != NO_EXTENSION_POS) begins_or_ends = 1; break;
case -2: if (sfsm->ext_pos != NO_EXTENSION_POS) begins_or_ends = -1; break;
default: heading_level = <<r>>; break;
}
}
@ -403,7 +411,8 @@ newlines automatically added at the end of the feed of any source file.
if (Lexer::break_before(Wordings::last_wn(W)+1) != '\n') {
int k;
for (k = Wordings::last_wn(W)+1;
(k<=Wordings::last_wn(W)+8) && (k<lexer_wordcount) && (Lexer::break_before(k) != '\n');
(k<=Wordings::last_wn(W)+8) &&
(k<lexer_wordcount) && (Lexer::break_before(k) != '\n');
k++) ;
Sentences::syntax_problem(HeadingStopsBeforeEndOfLine_SYNERROR, W, sfsm->ref, k);
}
@ -427,9 +436,10 @@ from an extension, we need to make sure we saw both beginning and end:
@<Issue a problem message if we are missing the begin and end here sentences@> =
switch (sfsm->ext_pos) {
case 1: Sentences::syntax_problem(ExtNoBeginsHere_SYNERROR, W, sfsm->ref, 0); break;
case 2: Sentences::syntax_problem(ExtNoEndsHere_SYNERROR, W, sfsm->ref, 0); break;
case 3: break;
case BEFORE_BEGINS_EXTENSION_POS:
Sentences::syntax_problem(ExtNoBeginsHere_SYNERROR, W, sfsm->ref, 0); break;
case MIDDLE_EXTENSION_POS:
Sentences::syntax_problem(ExtNoEndsHere_SYNERROR, W, sfsm->ref, 0); break;
}
@h Unskipped material which is not a heading.
@ -482,7 +492,7 @@ sentences and options-file sentences may have been read already.)
@<Convert a rule preamble to a ROUTINE node and enter rule mode@>;
if (sfsm->inside_rule_mode)
@<Convert to a COMMAND node and exit rule mode unless a semicolon implies further commands@>
@<Convert to a COMMAND node and exit rule mode unless a semicolon implies more@>
else if (stop_character == ';') {
Sentences::syntax_problem(UnexpectedSemicolon_SYNERROR, W, sfsm->ref, 0);
stop_character = '.';
@ -509,26 +519,10 @@ sentences and options-file sentences may have been read already.)
/* none of that happened, so we have a SENTENCE node for certain */
Annotations::write_int(new, sentence_unparsed_ANNOT, TRUE);
#ifdef SENTENCE_ANNOTATION_SYNTAX_CALLBACK
SENTENCE_ANNOTATION_SYNTAX_CALLBACK(new);
#ifdef NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK
NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK(new);
#endif
@ Rules are ordinarily detected by their colon, which divides the header from the
rest: colons are not otherwise legal in Inform. But there's an exception. If the
sentence consists of text matching the following grammar, followed by comma,
followed by more text, then the comma is read as if it's a colon and the
sentence becomes a rule. For example:
>> Instead of going north, try entering the cage
=
<comma-divisible-sentence> ::=
instead of ... |
every turn *** |
before ... |
after ... |
when ...
@ We make an exception to the exception for the serial comma used in a list of
alternatives: thus the comma in "Aeschylus, Sophocles, or Euripides" does
not trigger this rule. We need this exception because such lists of
@ -639,7 +633,7 @@ instead of a semicolon. We may lament this, but it is so.)
@ Subsequent commands are divided by semicolons, and any failure of a
semicolon to appear indicates an end of the rule.
@<Convert to a COMMAND node and exit rule mode unless a semicolon implies further commands@> =
@<Convert to a COMMAND node and exit rule mode unless a semicolon implies more@> =
#ifdef list_node_type
Node::set_type(new, list_entry_node_type);
#endif

View file

@ -6,6 +6,7 @@ Licence: Artistic License 2.0
Preliminaries
What This Module Does
How To Include This Module
Chapter 1: Setting Up
"Loading this module."

View file

@ -0,0 +1,113 @@
How To Include This Module.
What to do to make use of the syntax module in a new command-line tool.
@h Status.
The syntax module provided as one of the "shared" Inform modules, which means
that it was built with a view to potential incorporation in multiple tools.
It can be found, for example, in //inform7//, //inbuild// and //syntax-test//,
among others. //syntax-test// may be useful as a minimal example of a tool
using //syntax//.
By convention, the modules considered as "shared" have no dependencies on
other modules except for //foundation// and other "shared" modules.
A tool can import //syntax// only if it also imports //foundation// and
//words//.
@h Importing the module.
We'll use the term "parent" to mean the tool which is importing //syntax//,
that is, which will include its code and be able to use it. As with any
imported module,
(*) The contents page of the parent's web must identify and locate the
module:
= (text as Inweb)
Import: somepath/syntax
=
(*) The parent must call |SyntaxModule::start()| just after it starts up, and
|SyntaxModule::end()| just before it shuts down. (But just after, and just
before, the corresponding calls to //foundation//.)
But in addition, the parent of //syntax// must define some Preform grammar:
(*) |<language-modifying-sentence>| to recognise sentences modifying the
language which is currently being parsed;
(*) |<structural-sentence>| to recognise structurally important sentences;
(*) |<dividing-sentence>| to recognise sentences which divide up the text,
normally headings;
(*) |<comma-divisible-sentence>| to recognise sentences where a comma plays
a role normally expected to be played by a colon.
Though compulsory, these don't need to do much: see //syntax-test: Unit Tests//.
@h Using callbacks.
Shared modules like this one are tweaked in behaviour by defining "callback
functions". This means that the parent might provide a function of its own
which would answer a question put to it by the module, or take some action
on behalf of the module: it's a callback in the sense that the parent is
normally calling the module, but then the module calls the parent back to
ask for data or action.
The parent must indicate which function to use by defining a constant with
a specific name as being equal to that function's name. A fictional example
would be
= (text as Inweb)
@d EXPRESS_SURPRISE_SYNTAX_CALLBACK Emotions::gosh
=
void Emotions::gosh(text_stream *OUT) {
WRITE("Good gracious!\n");
}
=
The syntax module has many callbacks, but they are all optional. The following
alphabetical list has references to fuller explanations:
(*) |AMBIGUITY_JOIN_SYNTAX_CALLBACK| can divert ambiguous readings and prevent
them from being added to a syntax tree: see //SyntaxTree::add_reading//.
(*) |ANNOTATION_COPY_SYNTAX_CALLBACK| can perform deep rather than shallow
copies of node annotations when these are essential: see //Annotations::copy//.
(*) |ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK|, |MORE_ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK|
and |EVEN_MORE_ANNOTATION_PERMISSIONS_SYNTAX_CALLBACK| gives permission for nodes
of given types to have annotations with given IDs, and effectively provides a
way to create custom annotations: see //Annotations::make_annotation_allowed_table//.
(*) |BEGIN_OR_END_HERE_SYNTAX_CALLBACK| is called when a new extension beginning
or ending sentence is found in the source text being broken into sentences:
see //Sentences::make_node//.
(*) |LANGUAGE_ELEMENT_SYNTAX_CALLBACK| is called when a sentence is found matching
the nonterminal |<language-modifying-sentence>|: see //Sentences::make_node//.
(*) |LOG_UNENUMERATED_NODE_TYPES_SYNTAX_CALLBACK| is called to log a node type
not recognised as one of the enumerated |*_NT| values: see //NodeType::log//.
(*) |NEW_HEADING_SYNTAX_CALLBACK| is called when a new heading sentence is found
in the source text being broken into sentences: see //Sentences::make_node//.
(*) |NEW_HEADING_TREE_SYNTAX_CALLBACK| is called when a new syntax tree is being
created, and needs to be given a matching tree of headings: see //SyntaxTree::new//.
(*) |NODE_METADATA_SETUP_SYNTAX_CALLBACK|, |MORE_NODE_METADATA_SETUP_SYNTAX_CALLBACK|
and |EVEN_MORE_NODE_METADATA_SETUP_SYNTAX_CALLBACK| adds new syntax tree node
types: see //NodeType::metadata_setup//.
(*) |PARENTAGE_EXCEPTIONS_SYNTAX_CALLBACK| allows exceptions to the rules about
which nodes in a syntax tree can be parents of which other nodes: see
//NodeType::parentage_allowed//.
(*) |PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK|, |MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK|
and |EVEN_MORE_PARENTAGE_PERMISSIONS_SYNTAX_CALLBACK| adds permissions for nodes
to be parents of each other: see //NodeType::make_parentage_allowed_table//.
(*) |PROBLEM_SYNTAX_CALLBACK| is called when a syntax error is found, and can
prevent this from being issued to the terminal as an error message: see
//Sentences::syntax_problem//.
(*) |NEW_NONSTRUCTURAL_SENTENCE_SYNTAX_CALLBACK| is called when a new, regular
sentence is found in the source text being broken into sentences: see
//Sentences::make_node//.
(*) |IS_SENTENCE_NODE_SYNTAX_CALLBACK| is asked whether a given node represents
a regular sentence or not: see //NodeType::is_sentence//.

View file

@ -31,18 +31,7 @@ source text compiled by //inform7// is just one syntax tree. When //supervisor//
manages extensions, it may generate one //parse_node_tree// object for each
extension whose text it reads. Still -- there are few trees.
But there are many nodes. Syntax trees are made up of //parse_node// structures.
While these are in principle individual nodes, they effectively represent
subtrees, because they carry with them links to the nodes below. A //parse_node//
object can therefore equally represent "orange", "the orange envelope", or
"now the card is in the orange envelope".
Meaning is an ambiguous thing, and so the tree needs to be capable of
representing multiple interpretations of the same wording. So nodes have not
only |next| and |down| links to other nodes, but also |next_alternative| links,
which -- if used -- fork the syntax tree into different possible readings.
@ The main trunk of the tree can be grown in any sequence: call //SyntaxTree::push_bud//
@ The trunk of the tree can be grown in any sequence: call //SyntaxTree::push_bud//
to begin "budding" from a particular branch, and //SyntaxTree::pop_bud// to go back
to where you were. These are also used automatically to ensure that sentences
arriving at //SyntaxTree::graft_sentence// are grafted under the headings to
@ -67,5 +56,55 @@ But it is also possible to graft smaller (not-whole-sentence) cuttings onto
each other using //SyntaxTree::graft//, which doesn't involve the bud stack
at all.
@ Meaning is an ambiguous thing, and so the tree needs to be capable of
representing multiple interpretations of the same wording. So nodes have not
only |next| and |down| links to other nodes, but also |next_alternative| links,
which -- if used -- fork the syntax tree into different possible readings.
These are not added to the tree by grafting: that's only done for definite
meanings. Instead, multiple ambiguous readings mostly lie beneath |AMBIGUITY_NT|
nodes -- see //SyntaxTree::add_reading//. For example, we might have:
= (text)
sun is orange
sun
AMBIGUITY
orange (read as being a fruit)
orange (read as being a colour)
=
@ An extensive suite of functions is provided to make it easy to traverse
a syntax tree, calling a visitor function on each node: see //SyntaxTree::traverse//.
@h Nodes.
Syntax trees are made up of //parse_node// structures. While these are in
principle individual nodes, they effectively represent subtrees, because they
carry with them links to the nodes below. A //parse_node// object can
therefore equally represent "orange", "the orange envelope", or "now the card
is in the orange envelope".
Each node carries three essential pieces of information with it:
(1) The text giving rise to it (say, "Section Five - Fruit").
(2) A node type ID, which in broad terms says what kind of reference is being
made (say, |HEADING_NT|). The possible node types are stored in the C type
|node_type_t|, which corresponds to some metadata in a //node_type_metadata//
object: see //Node::get_type// and //NodeType::get_metadata//.
(3) A list of optional annotations, which are either integer or object-valued,
and which give specifics about the meaning (say, the level number in the
hierarchy of headings). See //Node Annotations//.
@h Fussy, defensive, pedantry.
Safe to say that Inform includes bugs: the more defensive coding we can do,
the better. That means not only extensive logging (see //Node::log_tree//)
but also strict verification tests on every tree made (see //Tree Verification//).
(a) The only nodes allowed to exist are those for node types declared
by //NodeType::new//: more generally, see //Node Types// on metadata associated
with these.
(b) A node of type |A| can only be a child of a node of type |B| if
//NodeType::parentage_allowed// says so, and this is (mostly) a matter
of calling //NodeType::allow_parentage_for_categories// -- parentage depends
not on the type per se, but on the category of the type, which groups types
together.
(c) A node of type |A| can only have an annotation with ID |I| if
//Annotations::is_allowed// says so. To declare an annotation legal,
call |Annotations::allow(A, I)|, or |Annotations::allow_for_category(C, I)|
for the category |C| of |A|.

View file

@ -2,18 +2,23 @@
How we shall test it.
@h
@h Minimal Preform grammar.
Only |<dividing-sentence>| can ever match, since the others are wired to match
any text but then fail.
=
<dividing-sentence> ::=
chapter ... | ==> 1
section ... ==> 2
chapter ... | ==> 1
section ... ==> 2
<structural-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
... ==> TRUE; return FAIL_NONTERMINAL;
<language-modifying-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
... ==> TRUE; return FAIL_NONTERMINAL;
<comma-divisible-sentence> ::=
... ==> TRUE; return FAIL_NONTERMINAL;
@h Syntax tree.

View file

@ -1746,7 +1746,7 @@ and the pointer result is null.
if (nt->multiplicitous) {
#ifdef CORE_MODULE
added_to_result = QP;
acc_result = (void *) Node::add_possible_reading((parse_node *) acc_result, QP, W);
acc_result = (void *) SyntaxTree::add_reading((parse_node *) acc_result, QP, W);
#endif
goto Fail;
}