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:
parent
b87ace2f32
commit
98c3419e84
File diff suppressed because one or more lines are too long
|
@ -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>
|
||||
|
|
|
@ -424,7 +424,7 @@ object.
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">one</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></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>
|
||||
|
|
|
@ -270,7 +270,7 @@ created condition:
|
|||
<span class="plain-syntax"> </span><span class="identifier-syntax">reading</span><span class="plain-syntax">-></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>
|
||||
|
|
|
@ -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>§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">)) &&</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">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></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">-></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">-></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">-></span><span class="identifier-syntax">down</span><span class="plain-syntax">-></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">) && (</span><span class="identifier-syntax">E</span><span class="plain-syntax">-></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">-></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">-></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">-></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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">-></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">-></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">-></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">-></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">-></span><span class="element-syntax">declaration_node</span><span class="plain-syntax">-></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">-></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">-></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">-></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>
|
||||
|
|
|
@ -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">§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">) && (</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">) && (</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">§5</a>, <a href="1-cm.html#SP6_6">§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">§5</a>, <a href="1-cm.html#SP6_6">§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>
|
||||
|
|
|
@ -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>§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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">) &&</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>
|
||||
|
|
|
@ -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">§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">()-></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>
|
||||
|
|
|
@ -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>§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">§10</a><br/>Binding and Substitution - <a href="11-bas.html#SP19">§19</a><br/>Cinders and Deferrals - <a href="12-cad.html#SP6">§6</a><br/>Local Variables - <a href="24-lv.html#SP34">§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">§10</a><br/>Binding and Substitution - <a href="11-bas.html#SP19">§19</a><br/>Cinders and Deferrals - <a href="12-cad.html#SP6">§6</a><br/>Dash - <a href="14-ds2.html#SP29">§29</a><br/>Local Variables - <a href="24-lv.html#SP34">§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">§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">§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>§16. </b></p>
|
||||
|
|
|
@ -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"><s-existential-np></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>
|
||||
|
|
|
@ -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">) && (</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">())) && (</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>
|
||||
|
|
|
@ -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"><sentence></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">§6</a>, <a href="5-vp.html#SP7_3_1_2">§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">-></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">§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"> > </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"><pre-verb-rc-marker></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"><pre-verb-rc-marker></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">§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">§9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§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">§6</a>, <a href="5-vp.html#SP7">§7</a>, <a href="5-vp.html#SP7_3_1_1">§7.3.1.1</a>, <a href="5-vp.html#SP7_3_1_2">§7.3.1.2</a>, <a href="5-vp.html#SP7_3_1_2_1">§7.3.1.2.1</a>, <a href="5-vp.html#SP7_3_1_2_2">§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">❮</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">❯</li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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">§2. What verb usages we allow</a></li><li><a href="1-ut.html#SP3">§3. </a></li><li><a href="1-ut.html#SP5">§5. Syntax tree</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="1-ut.html#SP2">§2. What verb usages we allow</a></li><li><a href="1-ut.html#SP3">§3. Minimal Preform grammar</a></li><li><a href="1-ut.html#SP6">§6. Syntax tree</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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>§3. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. Minimal Preform grammar. </b>Only <span class="extract"><span class="extract-syntax"><dividing-sentence></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"><dividing-sentence></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">==></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">==></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">==></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">==></span><span class="Preform-plain-syntax"> 2</span>
|
||||
|
||||
<span class="Preform-function-syntax"><structural-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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">==></span><span class="Preform-plain-syntax"> TRUE; return FAIL_NONTERMINAL;</span>
|
||||
|
||||
<span class="Preform-function-syntax"><language-modifying-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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">==></span><span class="Preform-plain-syntax"> TRUE; return FAIL_NONTERMINAL;</span>
|
||||
|
||||
<span class="Preform-function-syntax"><unexceptional-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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"><comma-divisible-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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>§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>§4. </b></p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
<span class="Preform-function-syntax"><unexceptional-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></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>§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">§3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b></p>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ut.html#SP4">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b></p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
<span class="Preform-function-syntax"><stock></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"><cardinal-number></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"> 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>§5. Syntax tree. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§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">§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">§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">§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">-></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">-></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"><stock></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"><<rp>></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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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">§1. </a></li><li><a href="1-ut.html#SP2">§2. Syntax tree</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="1-ut.html#SP1">§1. </a></li><li><a href="1-ut.html#SP2">§2. Minimal Preform grammar</a></li><li><a href="1-ut.html#SP4">§4. Syntax tree</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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>§2. Minimal Preform grammar. </b>Only <span class="extract"><span class="extract-syntax"><dividing-sentence></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"><dividing-sentence></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">==></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">==></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">==></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">==></span><span class="Preform-plain-syntax"> 2</span>
|
||||
|
||||
<span class="Preform-function-syntax"><structural-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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">==></span><span class="Preform-plain-syntax"> TRUE; return FAIL_NONTERMINAL;</span>
|
||||
|
||||
<span class="Preform-function-syntax"><language-modifying-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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">==></span><span class="Preform-plain-syntax"> TRUE; return FAIL_NONTERMINAL;</span>
|
||||
|
||||
<span class="Preform-function-syntax"><scan-individual-phrase></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">==></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"><comma-divisible-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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>§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>§3. </b></p>
|
||||
|
||||
<pre class="Preform-displayed-code all-displayed-code code-font">
|
||||
<span class="Preform-function-syntax"><scan-individual-phrase></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">==></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>§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">§1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. Syntax tree. </b></p>
|
||||
<ul class="endnotetexts"><li>This code is used in <a href="1-ut.html#SP3">§3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§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">§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"><scan-individual-phrase></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>
|
||||
|
|
|
@ -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">§13</a><br/>Headings - <a href="6-hdn.html#SP12_1">§12.1</a>, <a href="6-hdn.html#SP12_2">§12.2</a>, <a href="6-hdn.html#SP21_1">§21.1</a>, <a href="6-hdn.html#SP22_2">§22.2</a>, <a href="6-hdn.html#SP21_3">§21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">§1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">§2.1</a>, <a href="6-inc.html#SP5_1_2">§5.1.2</a>, <a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP8_1">§8.1</a>, <a href="6-inc.html#SP10">§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">§14</a><br/>Headings - <a href="6-hdn.html#SP12_1">§12.1</a>, <a href="6-hdn.html#SP12_2">§12.2</a>, <a href="6-hdn.html#SP21_1">§21.1</a>, <a href="6-hdn.html#SP22_2">§22.2</a>, <a href="6-hdn.html#SP21_3">§21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">§1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">§2.1</a>, <a href="6-inc.html#SP5_1_2">§5.1.2</a>, <a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP8_1">§8.1</a>, <a href="6-inc.html#SP10">§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">-></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">-></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">-></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">§26</a><br/>Source Text - <a href="6-st.html#SP13">§13</a><br/>Headings - <a href="6-hdn.html#SP12_1">§12.1</a>, <a href="6-hdn.html#SP12_2">§12.2</a>, <a href="6-hdn.html#SP21_1">§21.1</a>, <a href="6-hdn.html#SP21_2">§21.2</a>, <a href="6-hdn.html#SP21_3">§21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">§1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">§2.1</a>, <a href="6-inc.html#SP5_1_1">§5.1.1</a>, <a href="6-inc.html#SP5_1_2">§5.1.2</a>, <a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP8_1">§8.1</a>, <a href="6-inc.html#SP10">§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">§26</a><br/>Source Text - <a href="6-st.html#SP14">§14</a><br/>Headings - <a href="6-hdn.html#SP12_1">§12.1</a>, <a href="6-hdn.html#SP12_2">§12.2</a>, <a href="6-hdn.html#SP21_1">§21.1</a>, <a href="6-hdn.html#SP21_2">§21.2</a>, <a href="6-hdn.html#SP21_3">§21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">§1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">§2.1</a>, <a href="6-inc.html#SP5_1_1">§5.1.1</a>, <a href="6-inc.html#SP5_1_2">§5.1.2</a>, <a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP8_1">§8.1</a>, <a href="6-inc.html#SP10">§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">-></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>
|
||||
|
||||
|
|
|
@ -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">§2.2</a>, <a href="5-es.html#SP2_2_3">§2.2.3</a>, <a href="5-es.html#SP2_2_3_2">§2.2.3.2</a>, <a href="5-es.html#SP2_3">§2.3</a><br/>Kit Services - <a href="5-ks.html#SP5">§5</a>, <a href="5-ks.html#SP5_1">§5.1</a>, <a href="5-ks.html#SP5_3">§5.3</a><br/>Project Services - <a href="5-ps2.html#SP26">§26</a><br/>Source Text - <a href="6-st.html#SP2">§2</a>, <a href="6-st.html#SP3">§3</a>, <a href="6-st.html#SP4">§4</a>, <a href="6-st.html#SP13">§13</a><br/>Headings - <a href="6-hdn.html#SP12_1">§12.1</a>, <a href="6-hdn.html#SP12_2">§12.2</a>, <a href="6-hdn.html#SP21_1">§21.1</a>, <a href="6-hdn.html#SP22_2">§22.2</a>, <a href="6-hdn.html#SP21_2">§21.2</a>, <a href="6-hdn.html#SP21_3">§21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">§1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">§2.1</a>, <a href="6-inc.html#SP5_1_1">§5.1.1</a>, <a href="6-inc.html#SP5_1_2">§5.1.2</a>, <a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP8_1">§8.1</a>, <a href="6-inc.html#SP10">§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">§2.2</a>, <a href="5-es.html#SP2_2_3">§2.2.3</a>, <a href="5-es.html#SP2_2_3_2">§2.2.3.2</a>, <a href="5-es.html#SP2_3">§2.3</a><br/>Kit Services - <a href="5-ks.html#SP5">§5</a>, <a href="5-ks.html#SP5_1">§5.1</a>, <a href="5-ks.html#SP5_3">§5.3</a><br/>Project Services - <a href="5-ps2.html#SP26">§26</a><br/>Source Text - <a href="6-st.html#SP2">§2</a>, <a href="6-st.html#SP3">§3</a>, <a href="6-st.html#SP4">§4</a>, <a href="6-st.html#SP14">§14</a><br/>Headings - <a href="6-hdn.html#SP12_1">§12.1</a>, <a href="6-hdn.html#SP12_2">§12.2</a>, <a href="6-hdn.html#SP21_1">§21.1</a>, <a href="6-hdn.html#SP22_2">§22.2</a>, <a href="6-hdn.html#SP21_2">§21.2</a>, <a href="6-hdn.html#SP21_3">§21.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">§1</a><br/>Inclusions - <a href="6-inc.html#SP2_1">§2.1</a>, <a href="6-inc.html#SP5_1_1">§5.1.1</a>, <a href="6-inc.html#SP5_1_2">§5.1.2</a>, <a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP8_1">§8.1</a>, <a href="6-inc.html#SP10">§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">-></span><span class="element-syntax">errors_reading_source_text</span><span class="plain-syntax">);</span>
|
||||
|
|
|
@ -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">§8</a>, <a href="4-em.html#SP9">§9</a><br/>Extension Services - <a href="5-es.html#SP8">§8</a><br/>Project Services - <a href="5-ps2.html#SP26">§26</a><br/>Source Text - <a href="6-st.html#SP12">§12</a><br/>Inclusions - <a href="6-inc.html#SP5_1">§5.1</a><br/>Dictionary - <a href="7-dct.html#SP9">§9</a><br/>Census - <a href="7-cns.html#SP5">§5</a>, <a href="7-cns.html#SP6">§6</a><br/>Index Pages - <a href="7-ip.html#SP1_1_2_1_6_4_4">§1.1.2.1.6.4.4</a><br/>Individual Pages - <a href="7-ip2.html#SP2_1">§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">§8</a>, <a href="4-em.html#SP9">§9</a><br/>Extension Services - <a href="5-es.html#SP8">§8</a><br/>Project Services - <a href="5-ps2.html#SP26">§26</a><br/>Source Text - <a href="6-st.html#SP13">§13</a><br/>Inclusions - <a href="6-inc.html#SP5_1">§5.1</a><br/>Dictionary - <a href="7-dct.html#SP9">§9</a><br/>Census - <a href="7-cns.html#SP5">§5</a>, <a href="7-cns.html#SP6">§6</a><br/>Index Pages - <a href="7-ip.html#SP1_1_2_1_6_4_4">§1.1.2.1.6.4.4</a><br/>Individual Pages - <a href="7-ip2.html#SP2_1">§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">) && (</span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">edition</span><span class="plain-syntax">-></span><span class="element-syntax">work</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">metadata</span><span class="plain-syntax">);</span>
|
||||
<span class="plain-syntax"> }</span>
|
||||
|
|
|
@ -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>§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">§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">§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">-></span><span class="element-syntax">as_copy</span><span class="plain-syntax">;</span>
|
||||
<span class="plain-syntax"> </span><span class="function-syntax"><begins-here-sentence-subject></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"><the-prefix-for-extensions></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">§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">§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">-></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>
|
||||
|
|
|
@ -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">==></span><span class="Preform-plain-syntax"> 0; sfsm->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>§11. </b>Properly speaking, despite the definition above, language modifying sentences
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§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"><comma-divisible-sentence></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>§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">==></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>§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>§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> — 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>§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>§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>
|
||||
|
|
|
@ -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">❮</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">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprev"><a href="P-htitm.html">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -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">§3</a>, <a href="2-pn.html#SP7">§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">§2</a>, <a href="2-pn.html#SP6">§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">-></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">§4.1</a>, <a href="2-st.html#SP17">§17</a><br/>Parse Nodes - <a href="2-pn.html#SP18">§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">§4.1</a>, <a href="2-st.html#SP17">§17</a><br/>Parse Nodes - <a href="2-pn.html#SP17">§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">-></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">-></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">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9">§6.9</a>, <a href="3-snt.html#SP6_9_4">§6.9.4</a>, <a href="3-snt.html#SP6_9_5">§6.9.5</a>, <a href="3-snt.html#SP6_9_8">§6.9.8</a>, <a href="3-snt.html#SP6_9_9">§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">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9">§6.9</a>, <a href="3-snt.html#SP6_9_3">§6.9.3</a>, <a href="3-snt.html#SP6_9_4">§6.9.4</a>, <a href="3-snt.html#SP6_9_7">§6.9.7</a>, <a href="3-snt.html#SP6_9_8">§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">-></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">-></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">§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">§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">-></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">-></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">-></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">§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">§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">§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">-></span><span class="element-syntax">annotations</span><span class="plain-syntax">) &&</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">-></span><span class="element-syntax">annotations</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">annotations</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-></span><span class="element-syntax">annotations</span><span class="plain-syntax">-></span><span class="element-syntax">next_annotation</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -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">§1. Node types</a></li><li><a href="2-nt.html#SP3">§3. Metadata on node types</a></li><li><a href="2-nt.html#SP7">§7. Logging</a></li><li><a href="2-nt.html#SP8">§8. Creation</a></li><li><a href="2-nt.html#SP9">§9. Basic properties</a></li><li><a href="2-nt.html#SP11">§11. Node types used by the syntax module</a></li><li><a href="2-nt.html#SP12">§12. Parentage rules</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="2-nt.html#SP1">§1. Node types</a></li><li><a href="2-nt.html#SP3">§3. Metadata on node types</a></li><li><a href="2-nt.html#SP8">§8. Logging</a></li><li><a href="2-nt.html#SP9">§9. Creation</a></li><li><a href="2-nt.html#SP10">§10. Basic properties</a></li><li><a href="2-nt.html#SP12">§12. Node types used by the syntax module</a></li><li><a href="2-nt.html#SP13">§13. Parentage rules</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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 — 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"><</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">§6</a>, <a href="2-nt.html#SP8">§8</a><br/>Node Annotations - <a href="2-na.html#SP14">§14</a><br/>Tree Verification - <a href="2-tv.html#SP2">§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">§7</a>, <a href="2-nt.html#SP9">§9</a><br/>Node Annotations - <a href="2-na.html#SP14">§14</a><br/>Tree Verification - <a href="2-tv.html#SP2">§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"> >= </span><span class="constant-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">) &&</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">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"> < </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"> < </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>§5. </b>The bitmap of node flags currently contains only two:
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§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">§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>§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>§6. </b>And the metadata is stored in this table, whose indexes are offset by
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§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">§7</a>, <a href="2-nt.html#SP9">§9</a>, <a href="2-nt.html#SP12">§12</a><br/>Tree Verification - <a href="2-tv.html#SP4">§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">§8</a>, <a href="2-nt.html#SP10">§10</a>, <a href="2-nt.html#SP13">§13</a><br/>Tree Verification - <a href="2-tv.html#SP4">§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"> &(</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>§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>§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">§3</a><br/>Parse Nodes - <a href="2-pn.html#SP18">§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">§3</a><br/>Parse Nodes - <a href="2-pn.html#SP17">§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">-></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>§8. Creation. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§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">§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">§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">-></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>§9. Basic properties. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§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">§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">§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">-></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">§11</a>, <a href="2-st.html#SP13">§13</a>, <a href="2-st.html#SP14">§14</a>, <a href="2-st.html#SP15">§15</a>, <a href="2-st.html#SP16">§16</a>, <a href="2-st.html#SP17">§17</a>, <a href="2-st.html#SP18">§18</a>, <a href="2-st.html#SP19">§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">§11</a>, <a href="2-st.html#SP13">§13</a>, <a href="2-st.html#SP14">§14</a>, <a href="2-st.html#SP15">§15</a>, <a href="2-st.html#SP16">§16</a>, <a href="2-st.html#SP17">§17</a>, <a href="2-st.html#SP18">§18</a>, <a href="2-st.html#SP19">§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">§12</a><br/>Sentences - <a href="3-snt.html#SP5_1">§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">§12</a><br/>Sentences - <a href="3-snt.html#SP5_1">§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">) && ((</span><span class="identifier-syntax">metadata</span><span class="plain-syntax">-></span><span class="element-syntax">node_flags</span><span class="plain-syntax">) & </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">-></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>§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>§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">§11</a>, <a href="2-st.html#SP13">§13</a>, <a href="2-st.html#SP14">§14</a>, <a href="2-st.html#SP15">§15</a>, <a href="2-st.html#SP16">§16</a>, <a href="2-st.html#SP17">§17</a>, <a href="2-st.html#SP19">§19</a>, <a href="2-st.html#SP20">§20</a>, <a href="2-st.html#SP21">§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">§11</a>, <a href="2-st.html#SP13">§13</a>, <a href="2-st.html#SP14">§14</a>, <a href="2-st.html#SP15">§15</a>, <a href="2-st.html#SP16">§16</a>, <a href="2-st.html#SP17">§17</a>, <a href="2-st.html#SP19">§19</a>, <a href="2-st.html#SP20">§20</a>, <a href="2-st.html#SP21">§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>§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>§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">§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">§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>§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>§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">§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">§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">-></span><span class="element-syntax">category</span><span class="plain-syntax">;</span>
|
||||
|
|
|
@ -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">§1. Nodes themselves</a></li><li><a href="2-pn.html#SP3">§3. Creation</a></li><li><a href="2-pn.html#SP6">§6. Annotations</a></li><li><a href="2-pn.html#SP9">§9. Copying parse nodes</a></li><li><a href="2-pn.html#SP12">§12. Child count</a></li><li><a href="2-pn.html#SP13">§13. Detection of subnodes</a></li><li><a href="2-pn.html#SP14">§14. The word range beneath a given node</a></li><li><a href="2-pn.html#SP16">§16. Logging the parse tree</a></li><li><a href="2-pn.html#SP20">§20. Ambiguity subtrees</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="2-pn.html#SP1">§1. Nodes themselves</a></li><li><a href="2-pn.html#SP2">§2. Creation</a></li><li><a href="2-pn.html#SP5">§5. Annotations</a></li><li><a href="2-pn.html#SP8">§8. Copying parse nodes</a></li><li><a href="2-pn.html#SP11">§11. Child count</a></li><li><a href="2-pn.html#SP12">§12. Detection of subnodes</a></li><li><a href="2-pn.html#SP13">§13. The word range beneath a given node</a></li><li><a href="2-pn.html#SP15">§15. Logging the parse tree</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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>§2. </b>Various modules conventionally use this global setting to toggle debugging
|
||||
log output:
|
||||
</p>
|
||||
<p class="commentary firstcommentary"><a id="SP2"></a><b>§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>§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">§4</a>, <a href="2-pn.html#SP9">§9</a>, <a href="2-pn.html#SP11">§11</a><br/>Syntax Trees - <a href="2-st.html#SP2">§2</a><br/>Sentences - <a href="3-snt.html#SP6_1">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9_4">§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">§3</a>, <a href="2-pn.html#SP8">§8</a>, <a href="2-pn.html#SP10">§10</a><br/>Syntax Trees - <a href="2-st.html#SP2">§2</a><br/>Sentences - <a href="3-snt.html#SP6_1">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9_3">§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">-></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">-></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">-></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">-></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">-></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">-></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>§4. </b>The following constructor routines fill out the fields in useful ways.
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§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">§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">§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>§5. </b>The attached text.
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§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">§14</a>, <a href="2-pn.html#SP15">§15</a>, <a href="2-pn.html#SP17">§17</a>, <a href="2-pn.html#SP18">§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">§13</a>, <a href="2-pn.html#SP14">§14</a>, <a href="2-pn.html#SP16">§16</a>, <a href="2-pn.html#SP17">§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">-></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">§3</a>, <a href="2-pn.html#SP4">§4</a><br/>Sentences - <a href="3-snt.html#SP6_1">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9_4">§6.9.4</a>, <a href="3-snt.html#SP6_9_7">§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">§2</a>, <a href="2-pn.html#SP3">§3</a><br/>Sentences - <a href="3-snt.html#SP6_1">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9_3">§6.9.3</a>, <a href="3-snt.html#SP6_9_6">§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">-></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>§6. Annotations. </b>It's easily overlooked that the single most useful piece of information
|
||||
<p class="commentary firstcommentary"><a id="SP5"></a><b>§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">§20</a><br/>Syntax Trees - <a href="2-st.html#SP4">§4</a>, <a href="2-st.html#SP4_1">§4.1</a><br/>Node Annotations - <a href="2-na.html#SP15">§15</a><br/>Tree Verification - <a href="2-tv.html#SP2">§2</a>, <a href="2-tv.html#SP4">§4</a>, <a href="2-tv.html#SP4_3">§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">§4</a>, <a href="2-st.html#SP4_1">§4.1</a><br/>Node Annotations - <a href="2-na.html#SP15">§15</a><br/>Tree Verification - <a href="2-tv.html#SP2">§2</a>, <a href="2-tv.html#SP4">§4</a>, <a href="2-tv.html#SP4_3">§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">-></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">§20</a><br/>Syntax Trees - <a href="2-st.html#SP17">§17</a><br/>Tree Verification - <a href="2-tv.html#SP4_1_1">§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">§17</a>, <a href="2-st.html#SP24">§24</a><br/>Tree Verification - <a href="2-tv.html#SP4_1_1">§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">) && (</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-></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>§7. </b>When setting, we have to preserve the invariant, so we clear away any
|
||||
<p class="commentary firstcommentary"><a id="SP6"></a><b>§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">§6.9</a>, <a href="3-snt.html#SP6_9_5">§6.9.5</a>, <a href="3-snt.html#SP6_9_6">§6.9.6</a>, <a href="3-snt.html#SP6_9_7">§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">§6.9</a>, <a href="3-snt.html#SP6_9_4">§6.9.4</a>, <a href="3-snt.html#SP6_9_5">§6.9.5</a>, <a href="3-snt.html#SP6_9_6">§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">-></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>§8. </b>The integer score, used in choosing best matches:
|
||||
<p class="commentary firstcommentary"><a id="SP7"></a><b>§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">§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">-></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">§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">-></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">§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">-></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">§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">-></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>§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>§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">§10</a>, <a href="2-pn.html#SP11">§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">§9</a>, <a href="2-pn.html#SP10">§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>§10. </b>This variation preserves links out.
|
||||
<p class="commentary firstcommentary"><a id="SP9"></a><b>§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">-></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">-></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">-></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">-></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">-></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">-></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>§11. </b>And to deep-copy a whole subtree:
|
||||
<p class="commentary firstcommentary"><a id="SP10"></a><b>§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">-></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">-></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">-></span><span class="identifier-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></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">-></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">-></span><span class="identifier-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></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">>0) && (</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></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">-></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">-></span><span class="identifier-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></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">-></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">-></span><span class="identifier-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></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">>0) && (</span><span class="identifier-syntax">from</span><span class="plain-syntax">-></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">-></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">-></span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></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">-></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">-></span><span class="identifier-syntax">next_alternative</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">-></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>§12. Child count. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP11"></a><b>§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>§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>§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">-></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">-></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>§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>§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">-></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">-></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"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) && ((</span><span class="identifier-syntax">l</span><span class="plain-syntax"> == -1) || (</span><span class="identifier-syntax">lc</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"> = </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>§15. </b>Symmetrically, the right edge is found by taking the maximum word number
|
||||
<p class="commentary firstcommentary"><a id="SP14"></a><b>§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">)) < </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">)) < </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">-></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">-></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"> >= </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="identifier-syntax">rc</span><span class="plain-syntax"> > </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>§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>§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">§3</a><br/>Syntax Trees - <a href="2-st.html#SP5">§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">"<null-meaning-list>\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">§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">-></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">-></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">-></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>§17. </b>Either way, we recurse as follows, being careful not to make recursive calls
|
||||
<p class="commentary firstcommentary"><a id="SP16"></a><b>§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">§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">§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">-></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">-></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">-></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">-></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">"<null-parse-node>\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"> > </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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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>§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>§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">§17</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§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">§16</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP17"></a><b>§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">-></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">-></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">-></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"> > </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>§19. </b>This is occasionally useful:
|
||||
<p class="commentary firstcommentary"><a id="SP18"></a><b>§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>§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">-></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">-></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">-></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">-></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">) && (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></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">-></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">-></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">)) &&</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">-></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">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></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">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></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">-></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">-></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">-></span><span class="identifier-syntax">down</span><span class="plain-syntax">-></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">) && (</span><span class="identifier-syntax">E</span><span class="plain-syntax">-></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">-></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">-></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">-></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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -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">§1. Optional headings tree</a></li><li><a href="2-st.html#SP2">§2. Syntax trees</a></li><li><a href="2-st.html#SP3">§3. Buds and grafts</a></li><li><a href="2-st.html#SP10">§10. Where we currently are in the text</a></li><li><a href="2-st.html#SP11">§11. General traversals</a></li><li><a href="2-st.html#SP20">§20. Unconditional traverses</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="2-st.html#SP1">§1. Optional headings tree</a></li><li><a href="2-st.html#SP2">§2. Syntax trees</a></li><li><a href="2-st.html#SP3">§3. Buds and grafts</a></li><li><a href="2-st.html#SP10">§10. Where we currently are in the text</a></li><li><a href="2-st.html#SP11">§11. General traversals</a></li><li><a href="2-st.html#SP20">§20. Unconditional traverses</a></li><li><a href="2-st.html#SP22">§22. Cautious traverses</a></li><li><a href="2-st.html#SP23">§23. Toggling log output</a></li><li><a href="2-st.html#SP24">§24. Ambiguity subtrees</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9_4">§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">§6.1</a>, <a href="3-snt.html#SP6_6">§6.6</a>, <a href="3-snt.html#SP6_9_3">§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">-></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">-></span><span class="element-syntax">bud_parent_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">T</span><span class="plain-syntax">-></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>§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"> > </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">-></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">>=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">-></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">) &&</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">) &&</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">) >= </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">-></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"> = &</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">-></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">-></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">(&</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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">§11</a>, <a href="2-st.html#SP13">§13</a>, <a href="2-st.html#SP14">§14</a>, <a href="2-st.html#SP15">§15</a>, <a href="2-st.html#SP16">§16</a>, <a href="2-st.html#SP17">§17</a>, <a href="2-st.html#SP18">§18</a>, <a href="2-st.html#SP19">§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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">)) &&</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">)) &&</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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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>§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" — just a unique integer value — 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">§15</a><br/>Tree Verification - <a href="2-tv.html#SP1">§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>§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">-></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">-></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">-></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">-></span><span class="element-syntax">trace_sentences</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">T</span><span class="plain-syntax">-></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>§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">-></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">-></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">-></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">-></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">) && (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></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">-></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">-></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">-></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">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
|
|
@ -68,7 +68,10 @@ function togglePopup(material_id) {
|
|||
|
||||
<ul class="toc"><li><a href="2-tv.html#SP1">§1. Verify integrity</a></li><li><a href="2-tv.html#SP3">§3. Verify structure</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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>§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">§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">-></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">-></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">§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">-></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>§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">§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"> > </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">-></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">-></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">§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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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"> > </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"> > </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"> > </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>§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 — 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">-></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">-></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">-></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"> > </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"> > </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">§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">§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">-></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">-></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">-></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">-></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">-></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>§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">-></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">-></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">-></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">-></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">§4</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP4_1_1"></a><b>§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>§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">§4.1</a>, <a href="2-tv.html#SP4_2">§4.2</a>, <a href="2-tv.html#SP4_3">§4.3</a>, <a href="2-tv.html#SP4_4">§4.4</a> (twice).</li></ul>
|
||||
<nav role="progress"><div class="progresscontainer">
|
||||
|
|
|
@ -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">-></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">-></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">-></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">-></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">-></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">-></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">-></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>§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"><structural-sentence></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">))) &&</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">-></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">-></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">-></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">-></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">§5</a>, <a href="3-snt.html#SP6_9_3_1">§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">§5</a>, <a href="3-snt.html#SP6_9_2_1">§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">-></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">-></span><span class="element-syntax">ext_pos</span><span class="plain-syntax"> == </span><span class="constant-syntax">3</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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">sfsm</span><span class="plain-syntax">-></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">) && (</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">-></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">-></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">-></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">§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"><dividing-sentence></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"><<r>></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">-></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="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">-></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="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">-></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">-></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"><<r>></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"><=</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) && (</span><span class="identifier-syntax">k</span><span class="plain-syntax"><</span><span class="identifier-syntax">lexer_wordcount</span><span class="plain-syntax">) && (</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="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)+8) &&</span>
|
||||
<span class="plain-syntax"> (</span><span class="identifier-syntax">k</span><span class="plain-syntax"><</span><span class="identifier-syntax">lexer_wordcount</span><span class="plain-syntax">) && (</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">-></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">-></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">-></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">-></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">-></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">-></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">§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">-></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">-></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"><structural-sentence></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"><<r>></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"><<r>></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">-></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">-></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">-></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">-></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">-></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">-></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">§6</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_1"></a><b>§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"><comma-divisible-sentence></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>§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>§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>§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>§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">-></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="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"> && (</span><span class="function-syntax"><comma-divisible-sentence></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">§6.9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_3_1"></a><b>§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>§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"><list-comma-division></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"><list-comma-division></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">§6.9.3</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_3_1_1"></a><b>§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">§6.9.2</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_2_1_1"></a><b>§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">§6.9.3.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_4"></a><b>§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">§6.9.2.1</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_3"></a><b>§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">§6.9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_5"></a><b>§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>§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">-></span><span class="element-syntax">inside_rule_mode</span><span class="plain-syntax">) && (</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">-></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">-></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">§6.9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_6"></a><b>§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>§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">-></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">§6.9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_7"></a><b>§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>§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">-></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">-></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">§6.9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_8"></a><b>§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>§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">§6.9</a>.</li></ul>
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_9"></a><b>§6.9.9. </b>And for similar reasons:
|
||||
<p class="commentary firstcommentary"><a id="SP6_9_8"></a><b>§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">
|
||||
|
|
176
docs/syntax-module/P-htitm.html
Normal file
176
docs/syntax-module/P-htitm.html
Normal 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">§1. Status</a></li><li><a href="P-htitm.html#SP2">§2. Importing the module</a></li><li><a href="P-htitm.html#SP3">§3. Using callbacks</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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>§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>● 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>● 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>● <span class="extract"><span class="extract-syntax"><language-modifying-sentence></span></span> to recognise sentences modifying the
|
||||
language which is currently being parsed;
|
||||
</li><li>● <span class="extract"><span class="extract-syntax"><structural-sentence></span></span> to recognise structurally important sentences;
|
||||
</li><li>● <span class="extract"><span class="extract-syntax"><dividing-sentence></span></span> to recognise sentences which divide up the text,
|
||||
normally headings;
|
||||
</li><li>● <span class="extract"><span class="extract-syntax"><comma-divisible-sentence></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>§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>● <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>● <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>● <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>● <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>● <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"><language-modifying-sentence></span></span>: see <a href="3-snt.html#SP6" class="internal">Sentences::make_node</a>.
|
||||
</li><li>● <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>● <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>● <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>● <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>● <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>● <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>● <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>● <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>● <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">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -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">§1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">§2. Syntax trees</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="P-wtmd.html#SP1">§1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">§2. Syntax trees</a></li><li><a href="P-wtmd.html#SP6">§6. Nodes</a></li><li><a href="P-wtmd.html#SP7">§7. Fussy, defensive, pedantry</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§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 — 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 — if used — fork the syntax tree into different possible readings.
|
||||
</p>
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP3"></a><b>§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>§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>§4. </b>An extensive suite of functions is provided to make it easy to traverse
|
||||
<p class="commentary firstcommentary"><a id="SP4"></a><b>§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 — if used — 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 — 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>§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>§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>§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> — 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">❮</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">❯</a></li></ul></div>
|
||||
<ul class="progressbar"><li class="progressprevoff">❮</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">❯</a></li></ul></div>
|
||||
</nav><!--End of weave-->
|
||||
|
||||
</main>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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">§1. </a></li><li><a href="1-ut.html#SP2">§2. Syntax tree</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="1-ut.html#SP1">§1. Minimal Preform grammar</a></li><li><a href="1-ut.html#SP2">§2. Syntax tree</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Minimal Preform grammar. </b>Only <span class="extract"><span class="extract-syntax"><dividing-sentence></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"><dividing-sentence></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">==></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">==></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">==></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">==></span><span class="Preform-plain-syntax"> 2</span>
|
||||
|
||||
<span class="Preform-function-syntax"><structural-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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">==></span><span class="Preform-plain-syntax"> TRUE; return FAIL_NONTERMINAL;</span>
|
||||
|
||||
<span class="Preform-function-syntax"><language-modifying-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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">==></span><span class="Preform-plain-syntax"> TRUE; return FAIL_NONTERMINAL;</span>
|
||||
|
||||
<span class="Preform-function-syntax"><comma-divisible-sentence></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
||||
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 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>§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">-></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">-></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>
|
||||
|
|
|
@ -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">-></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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
@
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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@>;
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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."
|
||||
|
|
113
shared/syntax-module/Preliminaries/How To Include This Module.w
Normal file
113
shared/syntax-module/Preliminaries/How To Include This Module.w
Normal 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//.
|
|
@ -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|.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue