1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-09 11:58:10 +03:00

Improved supervisor/words bridge

This commit is contained in:
Graham Nelson 2020-05-06 12:55:04 +01:00
parent 6f179ce3a4
commit d8ff772b1f
25 changed files with 422 additions and 365 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6Q39 'Krypton' (5 May 2020)
v10.1.0-alpha.1+6Q40 'Krypton' (6 May 2020)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 5 May 2020
Build Number: 6Q39
Build Date: 6 May 2020
Build Number: 6Q40

View file

@ -189,7 +189,6 @@ most of these worker functions are in the <span class="extract"><span class="ext
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="7-ns.html#SP8" class="function-link"><span class="function-syntax">Sentences::VPs::traverse</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="7-oaf.html#SP3" class="function-link"><span class="function-syntax">Sentences::Rearrangement::tidy_up_ofs_and_froms</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="7-rs.html#SP3" class="function-link"><span class="function-syntax">Sentences::RuleSubtrees::register_recently_lexed_phrases</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><span class="identifier-syntax">SourceText::declare_source_loaded</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BENCH</span><span class="plain-syntax">(</span><a href="13-kak.html#SP6" class="function-link"><span class="function-syntax">Kinds::Knowledge::include_templates_for_kinds</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="1-wtc.html#SP4" class="function-link"><span class="function-syntax">Task::advance_stage_to</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SEMANTIC_II_CSEQ</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Semantic analysis II"</span><span class="plain-syntax">, -1);</span>

View file

@ -168,57 +168,55 @@ also makes it easier for us to manipulate the results.
</pre>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PARSE_TREE_METADATA_SETUP</span><span class="plain-syntax"> </span><a href="7-ptu.html#SP9" class="function-link"><span class="function-syntax">ParseTreeUsage::md</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SYNTAX_TREE_FURTHER_METADATA_SETUP</span><span class="plain-syntax"> </span><a href="7-ptu.html#SP9" class="function-link"><span class="function-syntax">ParseTreeUsage::md</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">ParseTreeUsage::md</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> first, the structural nodes:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SourceText::node_metadata</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">ALLOWED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ALLOWED_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">EVERY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"EVERY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">COMMON_NOUN_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"COMMON_NOUN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">ACTION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ACTION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">ADJECTIVE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ADJECTIVE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">PROPERTYCALLED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPERTYCALLED_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TOKEN_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TOKEN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">X_OF_Y_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"X_OF_Y_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">CREATED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CREATED_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="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ALLOWED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ALLOWED_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">EVERY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"EVERY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">COMMON_NOUN_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"COMMON_NOUN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ACTION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ACTION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ADJECTIVE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ADJECTIVE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">PROPERTYCALLED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPERTYCALLED_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TOKEN_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TOKEN_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">X_OF_Y_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"X_OF_Y_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">CREATED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CREATED_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="identifier-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">CODE_BLOCK_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CODE_BLOCK_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="identifier-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INVOCATION_LIST_SAY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_SAY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INVOCATION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">VOID_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"VOID_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">RVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"RVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LVALUE_TR_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LVALUE_TR_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">SPECIFIC_RVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"SPECIFIC_RVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">MATCHING_RVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"MATCHING_RVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">NEW_LOCAL_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"NEW_LOCAL_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LVALUE_LOCAL_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LVALUE_LOCAL_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">CONDITION_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CONDITION_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">CODE_BLOCK_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CODE_BLOCK_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="identifier-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">INVOCATION_LIST_SAY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_SAY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">INVOCATION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">VOID_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"VOID_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">RVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"RVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_TR_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LVALUE_TR_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">SPECIFIC_RVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"SPECIFIC_RVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">MATCHING_RVALUE_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"MATCHING_RVALUE_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">NEW_LOCAL_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"NEW_LOCAL_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LVALUE_LOCAL_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LVALUE_LOCAL_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">CONDITION_CONTEXT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CONDITION_CONTEXT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L4_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="comment-syntax"> now the specification nodes:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </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">0</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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </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">0</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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">CONSTANT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CONSTANT_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">RVALUE_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">PHRASE_TO_DECIDE_VALUE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PHRASE_TO_DECIDE_VALUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">PHRASAL_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">CONSTANT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CONSTANT_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">RVALUE_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">PHRASE_TO_DECIDE_VALUE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PHRASE_TO_DECIDE_VALUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">RVALUE_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">PHRASAL_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LOCAL_VARIABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOCAL_VARIABLE_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">LVALUE_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">NONLOCAL_VARIABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"NONLOCAL_VARIABLE_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">LVALUE_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">PROPERTY_VALUE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPERTY_VALUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TABLE_ENTRY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TABLE_ENTRY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LIST_ENTRY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LIST_ENTRY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LOCAL_VARIABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOCAL_VARIABLE_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">LVALUE_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">NONLOCAL_VARIABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"NONLOCAL_VARIABLE_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">LVALUE_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">PROPERTY_VALUE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPERTY_VALUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TABLE_ENTRY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TABLE_ENTRY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LIST_ENTRY_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LIST_ENTRY_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">LVALUE_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LOGICAL_NOT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_NOT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LOGICAL_TENSE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_TENSE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LOGICAL_AND_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_AND_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">LOGICAL_OR_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_OR_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TEST_PROPOSITION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TEST_PROPOSITION_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">COND_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TEST_PHRASE_OPTION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TEST_PHRASE_OPTION_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">COND_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TEST_VALUE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TEST_VALUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LOGICAL_NOT_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_NOT_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LOGICAL_TENSE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_TENSE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LOGICAL_AND_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_AND_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">LOGICAL_OR_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"LOGICAL_OR_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TEST_PROPOSITION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TEST_PROPOSITION_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">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TEST_PHRASE_OPTION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TEST_PHRASE_OPTION_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">COND_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TEST_VALUE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TEST_VALUE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="constant-syntax">COND_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b></p>

View file

@ -66,7 +66,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Compiler Tools</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#1">Chapter 1: Outside of inform7</a></li><li><b>Main</b></li></ul></div>
<p class="purpose">A command-line interface for Inbuild functions which are not part of the normal operation of the Inform compiler.</p>
<ul class="toc"><li><a href="1-mn.html#SP1">&#167;1. Settings variables</a></li><li><a href="1-mn.html#SP2">&#167;2. Main routine</a></li><li><a href="1-mn.html#SP2_6">&#167;2.6. Target list</a></li><li><a href="1-mn.html#SP2_7">&#167;2.7. Command line</a></li><li><a href="1-mn.html#SP5">&#167;5. Interface to Words module</a></li><li><a href="1-mn.html#SP6">&#167;6. Interface to Syntax module</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-mn.html#SP1">&#167;1. Settings variables</a></li><li><a href="1-mn.html#SP2">&#167;2. Main routine</a></li><li><a href="1-mn.html#SP2_6">&#167;2.6. Target list</a></li><li><a href="1-mn.html#SP2_7">&#167;2.7. Command line</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Settings variables. </b>The following will be set at the command line.
</p>
@ -464,18 +464,6 @@ subordinate to any switch; we take it as the name of a copy.
<span class="plain-syntax"> </span><a href="1-mn.html#SP2_6" class="function-link"><span class="function-syntax">Main::add_file_or_path_as_target</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">arg</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="SP5"></a><b>&#167;5. Interface to Words module. </b>We use the mighty Preform natural-language parser only a little when
Inbuild runs on its own, but it needs to be told what C type to use when
identifying natural languages.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_LANGUAGE_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inform_language</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. Interface to Syntax module. </b>Again, we make a fairly light use of <span class="extract"><span class="extract-syntax">syntax</span></span> when Inbuild runs alone.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PARSE_TREE_METADATA_SETUP</span><span class="plain-syntax"> </span><a href="../supervisor-module/6-st.html#SP7" class="function-link"><span class="function-syntax">SourceText::node_metadata</span></a>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="M-rc.html">&#10094;</a></li><li class="progresschapter"><a href="M-ui.html">M</a></li><li class="progresscurrentchapter">1</li><li class="progresscurrent">mn</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->

View file

@ -87,14 +87,14 @@ function togglePopup(material_id) {
<span class="definition-keyword">define</span> <span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000008</span><span class="plain-syntax"> </span><span class="comment-syntax"> allow this on either side of an assertion?</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TwoLikelihoods_LINERROR</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Diagrams::setup</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">Diagrams::setup</span></span>:<br/>Linguistics Module - <a href="1-lm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">AVERB_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"AVERB_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">L3_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">RELATIONSHIP_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"RELATIONSHIP_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">CALLED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CALLED_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">WITH_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"WITH_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">AND_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"AND_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">KIND_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"KIND_NT"</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="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPER_NOUN_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">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">PROPERTY_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPERTY_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">AVERB_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"AVERB_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">L3_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">RELATIONSHIP_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"RELATIONSHIP_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">CALLED_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"CALLED_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">WITH_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"WITH_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">AND_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"AND_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">KIND_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"KIND_NT"</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="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPER_NOUN_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">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">PROPERTY_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"PROPERTY_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="constant-syntax">L3_NCAT</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSERT_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::allow_annotation</span><span class="plain-syntax">(</span><span class="constant-syntax">AVERB_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">verbal_certainty_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::allow_annotation</span><span class="plain-syntax">(</span><span class="constant-syntax">AVERB_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">sentence_is_existential_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::allow_annotation</span><span class="plain-syntax">(</span><span class="constant-syntax">AVERB_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">possessive_verb_ANNOT</span><span class="plain-syntax">);</span>

View file

@ -115,7 +115,7 @@ function togglePopup(material_id) {
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Unit::start_diagrams</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Unit::start_diagrams</span></span>:<br/>Program Control - <a href="1-pc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">trace_sentences</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../syntax-module/2-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </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">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="../syntax-module/2-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </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">L2_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="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>

View file

@ -140,7 +140,7 @@ fields are blank.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</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">copy_error</span><span class="plain-syntax"> *</span><span class="function-syntax">CopyErrors::new_F</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">CopyErrors::new_F</span></span>:<br/>Extension Services - <a href="5-es.html#SP2_2">&#167;2.2</a><br/>Source Text - <a href="6-st.html#SP1">&#167;1</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="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="function-syntax">CopyErrors::new_F</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">CopyErrors::new_F</span></span>:<br/>Extension Services - <a href="5-es.html#SP2_2">&#167;2.2</a><br/>Source Text - <a href="6-st.html#SP3">&#167;3</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="identifier-syntax">filename</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">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax"> = </span><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cat</span><span class="plain-syntax">, </span><span class="identifier-syntax">subcat</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">details_file</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">CE</span><span class="plain-syntax">;</span>

View file

@ -144,7 +144,7 @@ for later reporting. These are stored in a list.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Copies::attach_error</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Copies::attach_error</span></span>:<br/>Extension Services - <a href="5-es.html#SP2_2">&#167;2.2</a>, <a href="5-es.html#SP2_2_3">&#167;2.2.3</a>, <a href="5-es.html#SP2_2_3_2">&#167;2.2.3.2</a>, <a href="5-es.html#SP2_3">&#167;2.3</a><br/>Kit Services - <a href="5-ks.html#SP5">&#167;5</a>, <a href="5-ks.html#SP5_1">&#167;5.1</a>, <a href="5-ks.html#SP5_3">&#167;5.3</a><br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP1">&#167;1</a>, <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP12">&#167;12</a><br/>Headings - <a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP24_1">&#167;24.1</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Copies::attach_error</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Copies::attach_error</span></span>:<br/>Extension Services - <a href="5-es.html#SP2_2">&#167;2.2</a>, <a href="5-es.html#SP2_2_3">&#167;2.2.3</a>, <a href="5-es.html#SP2_2_3_2">&#167;2.2.3.2</a>, <a href="5-es.html#SP2_3">&#167;2.3</a><br/>Kit Services - <a href="5-ks.html#SP5">&#167;5</a>, <a href="5-ks.html#SP5_1">&#167;5.1</a>, <a href="5-ks.html#SP5_3">&#167;5.3</a><br/>Project Services - <a href="5-ps2.html#SP26">&#167;26</a><br/>Source Text - <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP3">&#167;3</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP12">&#167;12</a><br/>Headings - <a href="6-hdn.html#SP13_1">&#167;13.1</a>, <a href="6-hdn.html#SP13_2">&#167;13.2</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP24_1">&#167;24.1</a>, <a href="6-hdn.html#SP23_2">&#167;23.2</a>, <a href="6-hdn.html#SP23_3">&#167;23.3</a><br/>The Bibliographic Sentence - <a href="6-tbs.html#SP1">&#167;1</a><br/>Inclusions - <a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">C</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no copy to attach to"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ce.html#SP4" class="function-link"><span class="function-syntax">CopyErrors::supply_attached_copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">CE</span><span class="plain-syntax">, </span><span class="reserved-syntax">copy_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">errors_reading_source_text</span><span class="plain-syntax">);</span>

View file

@ -130,6 +130,7 @@ folders anyway; maybe we should leave well be.)
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">project</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 project"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">S</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">associated_copy</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">edition</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">genre</span><span class="plain-syntax"> == </span><span class="identifier-syntax">project_bundle_genre</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Pathnames::create_in_file_system</span><span class="plain-syntax">(</span><a href="5-ps2.html#SP4" class="function-link"><span class="function-syntax">Projects::materials_path</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">project</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="6-st.html#SP5" class="function-link"><span class="function-syntax">SourceText::bulk_of_source_loaded</span></a><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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Task::carry_out</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>

View file

@ -400,7 +400,7 @@ This is that time.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">census_mode</span><span class="plain-syntax">) </span><span class="identifier-syntax">doc_only</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">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-es.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Concoct a synopsis for the extension to be read</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">read_into_file</span><span class="plain-syntax"> = </span><a href="6-st.html#SP1" class="function-link"><span class="function-syntax">SourceText::read_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">doc_only</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">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">read_into_file</span><span class="plain-syntax"> = </span><a href="6-st.html#SP3" class="function-link"><span class="function-syntax">SourceText::read_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">doc_only</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">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">read_into_file</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">read_into_file</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">your_ref</span><span class="plain-syntax"> = </span><span class="identifier-syntax">STORE_POINTER_inbuild_copy</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">);</span>

View file

@ -927,7 +927,7 @@ it comes.
<span class="plain-syntax"> </span><span class="identifier-syntax">Sentences::set_start_of_source</span><span class="plain-syntax">(</span><span class="identifier-syntax">lexer_wordcount</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_source_file</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-st.html#SP1" class="function-link"><span class="function-syntax">SourceText::read_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">source_source</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-st.html#SP3" class="function-link"><span class="function-syntax">SourceText::read_file</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_copy</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">source_source</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ParseTree::push_attachment_point</span><span class="plain-syntax">(</span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">, </span><span class="identifier-syntax">proj</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">syntax_tree</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">root_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sentences::break_into_project_copy</span><span class="plain-syntax">(</span>

View file

@ -67,17 +67,43 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: Inform Source Text</a></li><li><b>Source Text</b></li></ul></div>
<p class="purpose">Code for reading Inform 7 source text, which Inbuild uses for both extensions and projects.</p>
<ul class="toc"><li><a href="6-st.html#SP10">&#167;10. Sentence division</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="6-st.html#SP1">&#167;1. Bridge to the Lexer</a></li><li><a href="6-st.html#SP4">&#167;4. Bridge to the syntax analyser</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>This short function is a bridge to the lexer, and is used for reading
text files of source into either projects or extensions. Note that it
doesn't attach the fed text to the copy: the copy may need to contain text
from multiple files and indeed from elsewhere.
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Bridge to the Lexer. </b>Firstly, we need to tell the <a href="../words-module/index.html" class="internal">words</a> module what type to use when referencing
natural languages.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_LANGUAGE_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">inform_language</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>Lexical errors &mdash; overly long words, half-open quotations, and such &mdash; are
converted into copy errors and attached to the copy currently being worked on.
The following callback function performs that service.
</p>
<p class="commentary"><a href="../words-module/index.html" class="internal">words</a> has no convenient way to keep track of what copy we're working on,
so we will simply store it in a global variable.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LEXER_PROBLEM_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP2" class="function-link"><span class="function-syntax">SourceText::lexer_problem_handler</span></a>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_lexing_into</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">SourceText::lexer_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">word</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MEMORY_OUT_LEXERERROR</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::fatal</span><span class="plain-syntax">(</span><span class="string-syntax">"Out of memory: unable to create lexer workspace"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">currently_lexing_into</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><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new_WT</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LEXER_CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">word</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>This next function is our bridge to the lexer (see <a href="../words-module/3-tff.html" class="internal">Text From Files (in words)</a>),
and is used for reading text files of source into either projects or extensions.
Note that it doesn't attach the fed text to the copy: the caller must do that,
perhaps combining our feed with that of others.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">source_file</span><span class="plain-syntax"> *</span><span class="function-syntax">SourceText::read_file</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">SourceText::read_file</span></span>:<br/>Extension Services - <a href="5-es.html#SP6">&#167;6</a><br/>Project Services - <a href="5-ps2.html#SP27_2">&#167;27.2</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="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">synopsis</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">documentation_only</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">primary</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
@ -94,7 +120,7 @@ from multiple files and indeed from elsewhere.
<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">fclose</span><span class="plain-syntax">(</span><span class="identifier-syntax">handle</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">documentation_only</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="6-st.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Tell console output about the file</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">documentation_only</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="6-st.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Tell console output about the file</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -102,64 +128,123 @@ from multiple files and indeed from elsewhere.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">sf</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP1_1"></a><b>&#167;1.1. </b>This is where messages like
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>&#167;3.1. </b>This is where messages like
</p>
<pre class="ConsoleText-displayed-code all-displayed-code code-font">
<span class="ConsoleText-plain-syntax"> I've also read Standard Rules by Graham Nelson, which is 27204 words long.</span>
</pre>
<p class="commentary">are printed to <span class="extract"><span class="ConsoleText-extract-syntax">stdout</span></span> (not <span class="extract"><span class="ConsoleText-extract-syntax">stderr</span></span>), in something of an affectionate nod
to TeX's traditional console output, though occasionally I think silence is
<p class="commentary">are printed to <span class="extract"><span class="ConsoleText-extract-syntax">stdout</span></span> (not <span class="extract"><span class="ConsoleText-extract-syntax">stderr</span></span>), though occasionally I think silence is
golden and that these messages could go. It's a moot point for almost all users,
though, because the console output is concealed from them by the Inform
application.
though, because the console output is concealed from them by the Inform UI
applications.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Tell console output about the file</span><span class="named-paragraph-number">1.1</span></span><span class="ConsoleText-comment-syntax"> =</span>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Tell console output about the file</span><span class="named-paragraph-number">3.1</span></span><span class="ConsoleText-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">wc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax"> = </span><span class="string-syntax">"I've also read %S, which is %d words long.\n"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">primary</span><span class="plain-syntax">) </span><span class="identifier-syntax">message</span><span class="plain-syntax"> = </span><span class="string-syntax">"I've now read %S, which is %d words long.\n"</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">message</span><span class="plain-syntax"> = </span><span class="string-syntax">"I've also read %S, which is %d words long.\n"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextFromFiles::total_word_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">sf</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">wc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TextFromFiles::total_word_count</span><span class="plain-syntax">(</span><span class="identifier-syntax">sf</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">wc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STREAM_FLUSH</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDOUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">synopsis</span><span class="plain-syntax">, </span><span class="identifier-syntax">wc</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b></p>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. Bridge to the syntax analyser. </b>Similarly, <a href="index.html" class="internal">supervisor</a> sits on top of the <a href="../syntax-module/index.html" class="internal">syntax</a> module, which forms
up the stream of words from the lexer into syntax trees. This too produces
potential errors, and these will also convert into copy errors, but now we
have a more elegant way to keep track of the copy; <a href="../syntax-module/index.html" class="internal">syntax</a> can be passed
a sort of "your ref" pointer to it.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">LEXER_PROBLEM_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP2" class="function-link"><span class="function-syntax">SourceText::lexer_problem_handler</span></a>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SYNTAX_PROBLEM_REF_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> </span><span class="comment-syntax"> the "your ref" is a pointer to this type</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP4" class="function-link"><span class="function-syntax">SourceText::syntax_problem_handler</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::lexer_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">desc</span><span class="plain-syntax">, </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">word</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MEMORY_OUT_LEXERERROR</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::fatal</span><span class="plain-syntax">(</span><span class="string-syntax">"Out of memory: unable to create lexer workspace"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">currently_lexing_into</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><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new_WT</span></a><span class="plain-syntax">(</span><span class="constant-syntax">LEXER_CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">word</span><span class="plain-syntax">, </span><span class="identifier-syntax">desc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">currently_lexing_into</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">COPY_FILE_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">inbuild_copy</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP4" class="function-link"><span class="function-syntax">SourceText::syntax_problem_handler</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::syntax_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</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="identifier-syntax">ref</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">inbuild_copy</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">inbuild_copy</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">ref</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::syntax_problem_handler</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">err_no</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="constant-syntax">SYNTAX_PROBLEM_REF_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</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">copy_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">CE</span><span class="plain-syntax"> = </span><a href="2-ce.html#SP2" class="function-link"><span class="function-syntax">CopyErrors::new_N</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SYNTAX_CE</span><span class="plain-syntax">, </span><span class="identifier-syntax">err_no</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ce.html#SP3" class="function-link"><span class="function-syntax">CopyErrors::supply_wording</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">CE</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-cps.html#SP5" class="function-link"><span class="function-syntax">Copies::attach_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">CE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>Sentences in the source text are of five categories: dividing sentences,
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>The <a href="../inform7/index.html" class="internal">inform7</a> compiler will eventually make a much more detailed syntax
tree, extending the one we make here: but we will basically just break the
text into sentences, arrange those under headings, and take action on just a
few so-called "structural sentences" which have to be dealt with early on.
</p>
<p class="commentary"><a href="../syntax-module/index.html" class="internal">syntax</a> allows us to create a callback function which will be called
whenever a new sentence is made. What we use it for reflects that fact that
the vast bulk of the source text is read by <a href="index.html" class="internal">supervisor</a> early in a run of
<a href="../inform7/index.html" class="internal">inform7</a>, with just a few sentences ("inventions") added later. The bulk
part is parsed collectively, but the later inventions have to be marked as
needing to be parsed one by one. So, when <a href="index.html" class="internal">supervisor</a> has definitely
finished loading the bulk in, it calls:
</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">bulk_of_source_loaded</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::bulk_of_source_loaded</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">SourceText::bulk_of_source_loaded</span></span>:<br/>Inform7 Skill - <a href="3-is2.html#SP2">&#167;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">bulk_of_source_loaded</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>And here is the callback function. It's only ever needed for <a href="../inform7/index.html" class="internal">inform7</a>,
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_FUNCTION</span><span class="plain-syntax"> </span><a href="6-st.html#SP6" 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>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bulk_of_source_loaded</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::annotate_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-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><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">Sentences::VPs::seek</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>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>The next tweak to <a href="../syntax-module/index.html" class="internal">syntax</a> is to give it some node metadata. <a href="../syntax-module/index.html" class="internal">syntax</a>
itself places nodes of a small number of basic types into the syntax tree;
we want to expand on those. (And the <a href="../core-module/index.html" class="internal">core</a> module will expand on them still
further, so this still isn't everything. Note that we give our own version of
<span class="extract"><span class="extract-syntax">INVOCATION_LIST_NT</span></span> only if <a href="../inform7/index.html" class="internal">inform7</a> is not the parent: that's because
there's a slightly different version in <a href="../core-module/7-ptu.html" class="internal">Parse Tree Usage (in core)</a>.)
</p>
<p class="commentary">The node types we're adding are for the "structural sentences" which we will
look for below. (The asterisk notation isn't known to most Inform users: it
increases output to the debugging log.)
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SYNTAX_TREE_METADATA_SETUP</span><span class="plain-syntax"> </span><a href="6-st.html#SP7" class="function-link"><span class="function-syntax">SourceText::node_metadata</span></a>
<span class="definition-keyword">enum</span> <span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> For the initial title sentence</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ROUTINE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Instead of taking something, ..."</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Include (- ... -)</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TABLE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Table 1 - Counties of England"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Equation 2 - Newton's Second Law"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRACE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A sentence consisting of an asterisk and optional quoted text</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> Single invocation of a (possibly compound) phrase</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">list_node_type</span><span class="plain-syntax"> </span><span class="constant-syntax">ROUTINE_NT</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">list_entry_node_type</span><span class="plain-syntax"> </span><span class="constant-syntax">INVOCATION_LIST_NT</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">SourceText::node_metadata</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">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"BIBLIOGRAPHIC_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="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">ROUTINE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ROUTINE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INFORM6CODE_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="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TABLE_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="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TABBED_NFLAG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"EQUATION_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="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">TRACE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TRACE_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="identifier-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><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">(</span><span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-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><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>Sentences in the source text are of five categories: dividing sentences,
which divide up the source into segments; structural sentences, which split
the source into different forms (standard text, tables, equations, I6 matter,
and so on); nonstructural sentences, which make grammatical definitions and
@ -212,10 +297,10 @@ source text.
<span class="plain-syntax"> </span><span class="identifier-syntax">section</span><span class="plain-syntax"> ... ==&gt; </span><span class="constant-syntax">5</span>
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">extension</span><span class="plain-syntax">-</span><span class="identifier-syntax">end</span><span class="plain-syntax">-</span><span class="identifier-syntax">marker</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ::=</span>
<span class="plain-syntax"> ... </span><span class="identifier-syntax">begin</span><span class="plain-syntax">/</span><span class="identifier-syntax">begins</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> | ==&gt; -1; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Check we can begin an extension here</span><span class="named-paragraph-number">5.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ... </span><span class="identifier-syntax">end</span><span class="plain-syntax">/</span><span class="identifier-syntax">ends</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> ==&gt; -2; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Check we can end an extension here</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ... </span><span class="identifier-syntax">begin</span><span class="plain-syntax">/</span><span class="identifier-syntax">begins</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> | ==&gt; -1; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Check we can begin an extension here</span><span class="named-paragraph-number">8.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ... </span><span class="identifier-syntax">end</span><span class="plain-syntax">/</span><span class="identifier-syntax">ends</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> ==&gt; -2; </span><span class="named-paragraph-container code-font"><a href="6-st.html#SP8_2" class="named-paragraph-link"><span class="named-paragraph">Check we can end an extension here</span><span class="named-paragraph-number">8.2</span></a></span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5_1"></a><b>&#167;5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can begin an extension here</span><span class="named-paragraph-number">5.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP8_1"></a><b>&#167;8.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can begin an extension here</span><span class="named-paragraph-number">8.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -225,8 +310,8 @@ source text.
<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="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax">(</span><span class="constant-syntax">ExtBeginsAfterEndsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm_copy</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="6-st.html#SP5">&#167;5</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5_2"></a><b>&#167;5.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can end an extension here</span><span class="named-paragraph-number">5.2</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_2"></a><b>&#167;8.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Check we can end an extension here</span><span class="named-paragraph-number">8.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -236,7 +321,7 @@ source text.
<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="constant-syntax">SYNTAX_PROBLEM_HANDLER</span><span class="plain-syntax">(</span><span class="constant-syntax">ExtMultipleEndsHere_SYNERROR</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sfsm_copy</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="6-st.html#SP5">&#167;5</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="6-st.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP_1"></a><b>&#167;.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Detect a dividing sentence</span><span class="named-paragraph-number">.1</span></span><span class="comment-syntax"> =</span>
</p>
@ -255,36 +340,7 @@ source text.
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is never used.</li></ul>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>Structural sentences are defined as follows. (The asterisk notation isn't
known to most Inform users: it increases output to the debugging log.)
</p>
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> For the initial title sentence</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">ROUTINE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Instead of taking something, ..."</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Include (- ... -)</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TABLE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Table 1 - Counties of England"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> "Equation 2 - Newton's Second Law"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRACE_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> A sentence consisting of an asterisk and optional quoted text</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax"> </span><span class="comment-syntax"> Single invocation of a (possibly compound) phrase</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">list_node_type</span><span class="plain-syntax"> </span><span class="constant-syntax">ROUTINE_NT</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">list_entry_node_type</span><span class="plain-syntax"> </span><span class="constant-syntax">INVOCATION_LIST_NT</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </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">SourceText::node_metadata</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">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"BIBLIOGRAPHIC_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="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ROUTINE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"ROUTINE_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INFORM6CODE_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="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TABLE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TABLE_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="identifier-syntax">L2_NCAT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TABBED_CONTENT_NFLAG</span><span class="plain-syntax"> });</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">EQUATION_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"EQUATION_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="identifier-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><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">TRACE_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"TRACE_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="identifier-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><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::md</span><span class="plain-syntax">((</span><span class="identifier-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INVOCATION_LIST_NT</span><span class="plain-syntax">, </span><span class="string-syntax">"INVOCATION_LIST_NT"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFTY</span><span class="plain-syntax">, </span><span class="identifier-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><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b></p>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">&lt;</span><span class="identifier-syntax">structural</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt; ::=</span>
@ -299,7 +355,7 @@ known to most Inform users: it increases output to the debugging log.)
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> ... </span><span class="identifier-syntax">by</span><span class="plain-syntax"> ... | ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">INCLUDE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> (- ... ==&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>Properly speaking, despite the definition above, language modifying sentences
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </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.
@ -310,29 +366,6 @@ sentences. Whereas other nonstructural sentences can wait, these can't.
<span class="plain-syntax"> </span><span class="identifier-syntax">include</span><span class="plain-syntax"> (- ### </span><span class="identifier-syntax">in</span><span class="plain-syntax"> </span><span class="identifier-syntax">the</span><span class="plain-syntax"> </span><span class="identifier-syntax">preform</span><span class="plain-syntax"> </span><span class="identifier-syntax">grammar</span><span class="plain-syntax"> | ==&gt; -2; </span><span class="identifier-syntax">ssnt</span><span class="plain-syntax"> = </span><span class="constant-syntax">INFORM6CODE_NT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">use</span><span class="plain-syntax"> ... </span><span class="identifier-syntax">language</span><span class="plain-syntax"> </span><span class="identifier-syntax">element</span><span class="plain-syntax">/</span><span class="identifier-syntax">elements</span><span class="plain-syntax"> ==&gt; -1</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. Sentence division. </b>Sentence division can happen either early in Inform's run, when the vast bulk
of the source text is read, or at intermittent periods later when fresh text
is generated internally. New sentences need to be parsed as they arise, not
saved up to be parsed later, so we will use the following:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">SENTENCE_ANNOTATION_FUNCTION</span><span class="plain-syntax"> </span><a href="6-st.html#SP10" 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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_loaded_from_source</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">SourceText::declare_source_loaded</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">text_loaded_from_source</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">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>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">text_loaded_from_source</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParseTree::annotate_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">new</span><span class="plain-syntax">, </span><span class="identifier-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><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">Sentences::VPs::seek</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>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NEW_BEGINEND_HANDLER</span><span class="plain-syntax"> </span><a href="6-st.html#SP11" class="function-link"><span class="function-syntax">SourceText::new_beginend</span></a>

View file

@ -333,9 +333,9 @@ as the first.
<p class="commentary">Reading is performed by <a href="5-ps2.html#SP27" class="internal">Projects::read_source_text_for</a> and
<a href="5-es.html#SP6" class="internal">Extensions::read_source_text_for</a>. For extensions this involves reading
only a single file, but for projects it can involve multiple files. Each
such is read by a call to <a href="6-st.html#SP1" class="internal">SourceText::read_file</a>, which then sends out
such is read by a call to <a href="6-st.html#SP3" class="internal">SourceText::read_file</a>, which then sends out
to the <a href="../words-module/index.html" class="internal">words</a> module to break the text file into a stream of words:
see <a href="../words-module/3-tff.html" class="internal">Text From Files (in words)</a>. But it is <a href="6-st.html#SP1" class="internal">SourceText::read_file</a> which
see <a href="../words-module/3-tff.html" class="internal">Text From Files (in words)</a>. But it is <a href="6-st.html#SP3" class="internal">SourceText::read_file</a> which
prints console messages like these:
</p>

View file

@ -325,8 +325,8 @@ names for the node types here, as this is convenient for logging.
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>The bitmap of node flags begins with:
</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_CONTENT_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 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="SP15"></a><b>&#167;15. </b>Various modules conventionally use this global setting to toggle debugging
log output:
@ -343,29 +343,40 @@ log output:
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_tree_node_types</span><span class="plain-syntax">[</span><span class="identifier-syntax">NO_DEFINED_NT_VALUES</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTree::md</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">ParseTree::md</span></span>:<br/><a href="2-pt.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</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-pt.html#SP19" class="function-link"><span class="function-syntax">ParseTree::valid_type</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">.</span><span class="element-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="identifier-syntax">parse_tree_node_types</span><span class="plain-syntax">[</span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">.</span><span class="element-syntax">identity</span><span class="plain-syntax"> - </span><span class="constant-syntax">BASE_OF_ENUMERATED_NTS</span><span class="plain-syntax">] = </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParseTree::md</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">ParseTree::md</span></span>:<br/><a href="2-pt.html#SP17">&#167;17</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="reserved-syntax">char</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-pt.html#SP19" class="function-link"><span class="function-syntax">ParseTree::valid_type</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">parse_tree_node_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ptnt</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">parse_tree_node_types</span><span class="plain-syntax">[</span><span class="identifier-syntax">identity</span><span class="plain-syntax"> - </span><span class="constant-syntax">BASE_OF_ENUMERATED_NTS</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">identity</span><span class="plain-syntax"> = </span><span class="identifier-syntax">identity</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">node_type_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">node_type_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">min_children</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="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">max_children</span><span class="plain-syntax"> = </span><span class="identifier-syntax">max_children</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">category</span><span class="plain-syntax"> = </span><span class="identifier-syntax">category</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">node_flags</span><span class="plain-syntax"> = </span><span class="identifier-syntax">node_flags</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </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">ParseTree::metadata_setup</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">ParseTree::metadata_setup</span></span>:<br/>Syntax Module - <a href="1-sm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INCLUSION_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">INCLUDE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INVALID_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ROOT_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUSION_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">HEADING_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">INCLUDE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">BEGINHERE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">ENDHERE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">SENTENCE_NT</span><span class="plain-syntax">, </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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="constant-syntax">AMBIGUITY_NT</span><span class="plain-syntax">, </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><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">UNKNOWN_NT</span>
<span class="plain-syntax"> </span><a href="2-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">((</span><span class="reserved-syntax">parse_tree_node_type</span><span class="plain-syntax">) { </span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </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="identifier-syntax">L3_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-pt.html#SP16" class="function-link"><span class="function-syntax">ParseTree::md</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">UNKNOWN_NT</span><span class="plain-syntax">, </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="identifier-syntax">L3_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">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">PARSE_TREE_METADATA_SETUP</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PARSE_TREE_METADATA_SETUP</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">SYNTAX_TREE_METADATA_SETUP</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SYNTAX_TREE_METADATA_SETUP</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">SYNTAX_TREE_FURTHER_METADATA_SETUP</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SYNTAX_TREE_FURTHER_METADATA_SETUP</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -120,7 +120,7 @@ the last sentence having been a rule preamble tells us that the current one
is probably a phrase, and so on &mdash; and the following is its state.
</p>
<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">COPY_FILE_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span>
<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">SYNTAX_PROBLEM_REF_TYPE</span><span class="plain-syntax"> </span><span class="reserved-syntax">void</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">source_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sfsm_source_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -128,7 +128,7 @@ is probably a phrase, and so on &mdash; and the following is its state.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sfsm_skipping_material_at_level</span><span class="plain-syntax"> = -1;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sfsm_in_tabbed_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sfsm_main_source_start_wn</span><span class="plain-syntax"> = -1;</span>
<span class="constant-syntax">COPY_FILE_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sfsm_copy</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="constant-syntax">SYNTAX_PROBLEM_REF_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sfsm_copy</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="identifier-syntax">sfsm_project</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">Sentences::set_start_of_source</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax">) {</span>
@ -145,17 +145,17 @@ finite state machine.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::break</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">wording</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-snt.html#SP5" class="function-link"><span class="function-syntax">Sentences::break_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">Sentences::break_into_project_copy</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="constant-syntax">COPY_FILE_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::break_into_project_copy</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="constant-syntax">SYNTAX_PROBLEM_REF_TYPE</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">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">build_project</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-snt.html#SP5" class="function-link"><span class="function-syntax">Sentences::break_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">build_project</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">Sentences::break_into_extension_copy</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="constant-syntax">COPY_FILE_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Sentences::break_into_extension_copy</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="constant-syntax">SYNTAX_PROBLEM_REF_TYPE</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">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">build_project</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-snt.html#SP5" class="function-link"><span class="function-syntax">Sentences::break_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">build_project</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">Sentences::break_inner</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">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">is_extension</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">COPY_FILE_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from_copy</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">build_project</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">SYNTAX_PROBLEM_REF_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from_copy</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">build_project</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">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">))) &amp;&amp; (</span><span class="identifier-syntax">compare_word</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">PARBREAK_V</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::trim_first_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="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="reserved-syntax">return</span><span class="plain-syntax">;</span>
@ -224,7 +224,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"> ((&lt;</span><span class="identifier-syntax">structural</span><span class="plain-syntax">-</span><span class="identifier-syntax">sentence</span><span class="plain-syntax">&gt;(</span><span class="identifier-syntax">Wordings::from</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">sentence_start</span><span class="plain-syntax">))) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-pt.html#SP19" class="function-link"><span class="function-syntax">ParseTree::test_flag</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ssnt</span><span class="plain-syntax">, </span><span class="constant-syntax">TABBED_CONTENT_NFLAG</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> (</span><a href="2-pt.html#SP19" class="function-link"><span class="function-syntax">ParseTree::test_flag</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ssnt</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_in_tabbed_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_in_tabbed_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -367,15 +367,3 @@ subordinate to any switch; we take it as the name of a copy.
void Main::bareword(int id, text_stream *arg, void *state) {
Main::add_file_or_path_as_target(arg, TRUE);
}
@h Interface to Words module.
We use the mighty Preform natural-language parser only a little when
Inbuild runs on its own, but it needs to be told what C type to use when
identifying natural languages.
@d PREFORM_LANGUAGE_TYPE struct inform_language
@h Interface to Syntax module.
Again, we make a fairly light use of |syntax| when Inbuild runs alone.
@d PARSE_TREE_METADATA_SETUP SourceText::node_metadata

View file

@ -64,6 +64,7 @@ int Inform7Skill::inform7_internally(build_skill *skill, build_step *S,
if (project == NULL) internal_error("no project");
if (S->associated_copy->edition->work->genre == project_bundle_genre)
Pathnames::create_in_file_system(Projects::materials_path(project));
SourceText::bulk_of_source_loaded();
#ifdef CORE_MODULE
return Task::carry_out(S);
#endif

View file

@ -3,14 +3,38 @@
Code for reading Inform 7 source text, which Inbuild uses for both extensions
and projects.
@ This short function is a bridge to the lexer, and is used for reading
text files of source into either projects or extensions. Note that it
doesn't attach the fed text to the copy: the copy may need to contain text
from multiple files and indeed from elsewhere.
@h Bridge to the Lexer.
Firstly, we need to tell the //words// module what type to use when referencing
natural languages.
@d PREFORM_LANGUAGE_TYPE struct inform_language
@ Lexical errors -- overly long words, half-open quotations, and such -- are
converted into copy errors and attached to the copy currently being worked on.
The following callback function performs that service.
//words// has no convenient way to keep track of what copy we're working on,
so we will simply store it in a global variable.
@d LEXER_PROBLEM_HANDLER SourceText::lexer_problem_handler
=
inbuild_copy *currently_lexing_into = NULL;
void SourceText::lexer_problem_handler(int err, text_stream *desc, wchar_t *word) {
if (err == MEMORY_OUT_LEXERERROR)
Errors::fatal("Out of memory: unable to create lexer workspace");
if (currently_lexing_into) {
copy_error *CE = CopyErrors::new_WT(LEXER_CE, err, word, desc);
Copies::attach_error(currently_lexing_into, CE);
}
}
@ This next function is our bridge to the lexer (see //words: Text From Files//),
and is used for reading text files of source into either projects or extensions.
Note that it doesn't attach the fed text to the copy: the caller must do that,
perhaps combining our feed with that of others.
=
source_file *SourceText::read_file(inbuild_copy *C, filename *F, text_stream *synopsis,
int documentation_only, int primary) {
currently_lexing_into = C;
@ -39,52 +63,108 @@ source_file *SourceText::read_file(inbuild_copy *C, filename *F, text_stream *sy
= (text as ConsoleText)
I've also read Standard Rules by Graham Nelson, which is 27204 words long.
=
are printed to |stdout| (not |stderr|), in something of an affectionate nod
to TeX's traditional console output, though occasionally I think silence is
are printed to |stdout| (not |stderr|), though occasionally I think silence is
golden and that these messages could go. It's a moot point for almost all users,
though, because the console output is concealed from them by the Inform
application.
though, because the console output is concealed from them by the Inform UI
applications.
@<Tell console output about the file@> =
int wc;
char *message;
char *message = "I've also read %S, which is %d words long.\n";
if (primary) message = "I've now read %S, which is %d words long.\n";
else message = "I've also read %S, which is %d words long.\n";
wc = TextFromFiles::total_word_count(sf);
int wc = TextFromFiles::total_word_count(sf);
WRITE_TO(STDOUT, message, synopsis, wc);
STREAM_FLUSH(STDOUT);
LOG(message, synopsis, wc);
@
@d LEXER_PROBLEM_HANDLER SourceText::lexer_problem_handler
=
void SourceText::lexer_problem_handler(int err, text_stream *desc, wchar_t *word) {
if (err == MEMORY_OUT_LEXERERROR)
Errors::fatal("Out of memory: unable to create lexer workspace");
if (currently_lexing_into) {
copy_error *CE = CopyErrors::new_WT(LEXER_CE, err, word, desc);
Copies::attach_error(currently_lexing_into, CE);
}
}
@
@d COPY_FILE_TYPE inbuild_copy
@
@h Bridge to the syntax analyser.
Similarly, //supervisor// sits on top of the //syntax// module, which forms
up the stream of words from the lexer into syntax trees. This too produces
potential errors, and these will also convert into copy errors, but now we
have a more elegant way to keep track of the copy; //syntax// can be passed
a sort of "your ref" pointer to it.
@d SYNTAX_PROBLEM_REF_TYPE inbuild_copy /* the "your ref" is a pointer to this type */
@d SYNTAX_PROBLEM_HANDLER SourceText::syntax_problem_handler
=
void SourceText::syntax_problem_handler(int err_no, wording W, void *ref, int k) {
inbuild_copy *C = (inbuild_copy *) ref;
void SourceText::syntax_problem_handler(int err_no, wording W,
SYNTAX_PROBLEM_REF_TYPE *C, int k) {
copy_error *CE = CopyErrors::new_N(SYNTAX_CE, err_no, k);
CopyErrors::supply_wording(CE, W);
Copies::attach_error(C, CE);
}
@ The //inform7// compiler will eventually make a much more detailed syntax
tree, extending the one we make here: but we will basically just break the
text into sentences, arrange those under headings, and take action on just a
few so-called "structural sentences" which have to be dealt with early on.
//syntax// allows us to create a callback function which will be called
whenever a new sentence is made. What we use it for reflects that fact that
the vast bulk of the source text is read by //supervisor// early in a run of
//inform7//, with just a few sentences ("inventions") added later. The bulk
part is parsed collectively, but the later inventions have to be marked as
needing to be parsed one by one. So, when //supervisor// has definitely
finished loading the bulk in, it calls:
=
int bulk_of_source_loaded = FALSE;
void SourceText::bulk_of_source_loaded(void) {
bulk_of_source_loaded = TRUE;
}
@ 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_FUNCTION SourceText::annotate_new_sentence
=
void SourceText::annotate_new_sentence(parse_node *new) {
if (bulk_of_source_loaded) {
ParseTree::annotate_int(new, sentence_unparsed_ANNOT, FALSE);
#ifdef CORE_MODULE
Sentences::VPs::seek(new);
#endif
}
}
@ The next tweak to //syntax// is to give it some node metadata. //syntax//
itself places nodes of a small number of basic types into the syntax tree;
we want to expand on those. (And the //core// module will expand on them still
further, so this still isn't everything. Note that we give our own version of
|INVOCATION_LIST_NT| only if //inform7// is not the parent: that's because
there's a slightly different version in //core: Parse Tree Usage//.)
The node types we're adding are for the "structural sentences" which we will
look for below. (The asterisk notation isn't known to most Inform users: it
increases output to the debugging log.)
@d SYNTAX_TREE_METADATA_SETUP SourceText::node_metadata
@e BIBLIOGRAPHIC_NT /* For the initial title sentence */
@e ROUTINE_NT /* "Instead of taking something, ..." */
@e INFORM6CODE_NT /* "Include (- ... -) */
@e TABLE_NT /* "Table 1 - Counties of England" */
@e EQUATION_NT /* "Equation 2 - Newton's Second Law" */
@e TRACE_NT /* A sentence consisting of an asterisk and optional quoted text */
@e INVOCATION_LIST_NT /* Single invocation of a (possibly compound) phrase */
@d list_node_type ROUTINE_NT
@d list_entry_node_type INVOCATION_LIST_NT
=
void SourceText::node_metadata(void) {
ParseTree::md(BIBLIOGRAPHIC_NT, "BIBLIOGRAPHIC_NT", 0, 0, L2_NCAT, 0);
ParseTree::md(ROUTINE_NT, "ROUTINE_NT", 0, INFTY, L2_NCAT, 0);
ParseTree::md(INFORM6CODE_NT, "INFORM6CODE_NT", 0, 0, L2_NCAT, 0);
ParseTree::md(TABLE_NT, "TABLE_NT", 0, 0, L2_NCAT, TABBED_NFLAG);
ParseTree::md(EQUATION_NT, "EQUATION_NT", 0, 0, L2_NCAT, 0);
ParseTree::md(TRACE_NT, "TRACE_NT", 0, 0, L2_NCAT, 0);
#ifndef CORE_MODULE
ParseTree::md(INVOCATION_LIST_NT, "INVOCATION_LIST_NT", 0, INFTY, L2_NCAT, 0);
#endif
}
@ Sentences in the source text are of five categories: dividing sentences,
which divide up the source into segments; structural sentences, which split
the source into different forms (standard text, tables, equations, I6 matter,
@ -153,33 +233,6 @@ source text.
}
}
@ Structural sentences are defined as follows. (The asterisk notation isn't
known to most Inform users: it increases output to the debugging log.)
@e BIBLIOGRAPHIC_NT /* For the initial title sentence */
@e ROUTINE_NT /* "Instead of taking something, ..." */
@e INFORM6CODE_NT /* "Include (- ... -) */
@e TABLE_NT /* "Table 1 - Counties of England" */
@e EQUATION_NT /* "Equation 2 - Newton's Second Law" */
@e TRACE_NT /* A sentence consisting of an asterisk and optional quoted text */
@e INVOCATION_LIST_NT /* Single invocation of a (possibly compound) phrase */
@d list_node_type ROUTINE_NT
@d list_entry_node_type INVOCATION_LIST_NT
@ =
void SourceText::node_metadata(void) {
ParseTree::md((parse_tree_node_type) { BIBLIOGRAPHIC_NT, "BIBLIOGRAPHIC_NT", 0, 0, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { ROUTINE_NT, "ROUTINE_NT", 0, INFTY, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { INFORM6CODE_NT, "INFORM6CODE_NT", 0, 0, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TABLE_NT, "TABLE_NT", 0, 0, L2_NCAT, TABBED_CONTENT_NFLAG });
ParseTree::md((parse_tree_node_type) { EQUATION_NT, "EQUATION_NT", 0, 0, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TRACE_NT, "TRACE_NT", 0, 0, L2_NCAT, 0 });
#ifndef CORE_MODULE
ParseTree::md((parse_tree_node_type) { INVOCATION_LIST_NT, "INVOCATION_LIST_NT", 0, INFTY, L2_NCAT, 0 });
#endif
}
@
=
@ -205,29 +258,6 @@ sentences. Whereas other nonstructural sentences can wait, these can't.
include (- ### in the preform grammar | ==> -2; ssnt = INFORM6CODE_NT;
use ... language element/elements ==> -1
@h Sentence division.
Sentence division can happen either early in Inform's run, when the vast bulk
of the source text is read, or at intermittent periods later when fresh text
is generated internally. New sentences need to be parsed as they arise, not
saved up to be parsed later, so we will use the following:
@d SENTENCE_ANNOTATION_FUNCTION SourceText::annotate_new_sentence
=
int text_loaded_from_source = FALSE;
void SourceText::declare_source_loaded(void) {
text_loaded_from_source = TRUE;
}
void SourceText::annotate_new_sentence(parse_node *new) {
if (text_loaded_from_source) {
ParseTree::annotate_int(new, sentence_unparsed_ANNOT, FALSE);
#ifdef CORE_MODULE
Sentences::VPs::seek(new);
#endif
}
}
@
@d NEW_BEGINEND_HANDLER SourceText::new_beginend

View file

@ -113,7 +113,6 @@ most of these worker functions are in the |core| module, some are not.
BENCH(Sentences::VPs::traverse)
BENCH(Sentences::Rearrangement::tidy_up_ofs_and_froms)
BENCH(Sentences::RuleSubtrees::register_recently_lexed_phrases)
BENCH(SourceText::declare_source_loaded)
BENCH(Kinds::Knowledge::include_templates_for_kinds)
Task::advance_stage_to(SEMANTIC_II_CSEQ, I"Semantic analysis II", -1);

View file

@ -101,57 +101,55 @@ also makes it easier for us to manipulate the results.
@
@d PARSE_TREE_METADATA_SETUP ParseTreeUsage::md
@d SYNTAX_TREE_FURTHER_METADATA_SETUP ParseTreeUsage::md
=
void ParseTreeUsage::md(void) {
/* first, the structural nodes: */
SourceText::node_metadata();
ParseTree::md(ALLOWED_NT, "ALLOWED_NT", 1, 1, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(EVERY_NT, "EVERY_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(COMMON_NOUN_NT, "COMMON_NOUN_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(ACTION_NT, "ACTION_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(ADJECTIVE_NT, "ADJECTIVE_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(PROPERTYCALLED_NT, "PROPERTYCALLED_NT", 2, 2, L3_NCAT, 0);
ParseTree::md(TOKEN_NT, "TOKEN_NT", 0, INFTY, L3_NCAT, 0);
ParseTree::md(X_OF_Y_NT, "X_OF_Y_NT", 2, 2, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(CREATED_NT, "CREATED_NT", 0, 0, L3_NCAT, ASSERT_NFLAG);
ParseTree::md((parse_tree_node_type) { ALLOWED_NT, "ALLOWED_NT", 1, 1, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { EVERY_NT, "EVERY_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { COMMON_NOUN_NT, "COMMON_NOUN_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { ACTION_NT, "ACTION_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { ADJECTIVE_NT, "ADJECTIVE_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { PROPERTYCALLED_NT, "PROPERTYCALLED_NT", 2, 2, L3_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TOKEN_NT, "TOKEN_NT", 0, INFTY, L3_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { X_OF_Y_NT, "X_OF_Y_NT", 2, 2, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { CREATED_NT, "CREATED_NT", 0, 0, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { CODE_BLOCK_NT, "CODE_BLOCK_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { INVOCATION_LIST_NT, "INVOCATION_LIST_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { INVOCATION_LIST_SAY_NT, "INVOCATION_LIST_SAY_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { INVOCATION_NT, "INVOCATION_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { VOID_CONTEXT_NT, "VOID_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { RVALUE_CONTEXT_NT, "RVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LVALUE_CONTEXT_NT, "LVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LVALUE_TR_CONTEXT_NT, "LVALUE_TR_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { SPECIFIC_RVALUE_CONTEXT_NT, "SPECIFIC_RVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { MATCHING_RVALUE_CONTEXT_NT, "MATCHING_RVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { NEW_LOCAL_CONTEXT_NT, "NEW_LOCAL_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LVALUE_LOCAL_CONTEXT_NT, "LVALUE_LOCAL_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { CONDITION_CONTEXT_NT, "CONDITION_CONTEXT_NT", 0, INFTY, L4_NCAT, 0 });
ParseTree::md(CODE_BLOCK_NT, "CODE_BLOCK_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(INVOCATION_LIST_NT, "INVOCATION_LIST_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(INVOCATION_LIST_SAY_NT, "INVOCATION_LIST_SAY_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(INVOCATION_NT, "INVOCATION_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(VOID_CONTEXT_NT, "VOID_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(RVALUE_CONTEXT_NT, "RVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(LVALUE_CONTEXT_NT, "LVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(LVALUE_TR_CONTEXT_NT, "LVALUE_TR_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(SPECIFIC_RVALUE_CONTEXT_NT, "SPECIFIC_RVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(MATCHING_RVALUE_CONTEXT_NT, "MATCHING_RVALUE_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(NEW_LOCAL_CONTEXT_NT, "NEW_LOCAL_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(LVALUE_LOCAL_CONTEXT_NT, "LVALUE_LOCAL_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
ParseTree::md(CONDITION_CONTEXT_NT, "CONDITION_CONTEXT_NT", 0, INFTY, L4_NCAT, 0);
/* now the specification nodes: */
ParseTree::md((parse_tree_node_type) { UNKNOWN_NT, "UNKNOWN_NT", 0, 0, UNKNOWN_NCAT, 0 });
ParseTree::md(UNKNOWN_NT, "UNKNOWN_NT", 0, 0, UNKNOWN_NCAT, 0);
ParseTree::md((parse_tree_node_type) { CONSTANT_NT, "CONSTANT_NT", 0, 0, RVALUE_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { PHRASE_TO_DECIDE_VALUE_NT, "PHRASE_TO_DECIDE_VALUE_NT", 1, 1, RVALUE_NCAT, PHRASAL_NFLAG });
ParseTree::md(CONSTANT_NT, "CONSTANT_NT", 0, 0, RVALUE_NCAT, 0);
ParseTree::md(PHRASE_TO_DECIDE_VALUE_NT, "PHRASE_TO_DECIDE_VALUE_NT", 1, 1, RVALUE_NCAT, PHRASAL_NFLAG);
ParseTree::md((parse_tree_node_type) { LOCAL_VARIABLE_NT, "LOCAL_VARIABLE_NT", 0, 0, LVALUE_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { NONLOCAL_VARIABLE_NT, "NONLOCAL_VARIABLE_NT", 0, 0, LVALUE_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { PROPERTY_VALUE_NT, "PROPERTY_VALUE_NT", 2, 2, LVALUE_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TABLE_ENTRY_NT, "TABLE_ENTRY_NT", 1, 4, LVALUE_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LIST_ENTRY_NT, "LIST_ENTRY_NT", 2, 2, LVALUE_NCAT, 0 });
ParseTree::md(LOCAL_VARIABLE_NT, "LOCAL_VARIABLE_NT", 0, 0, LVALUE_NCAT, 0);
ParseTree::md(NONLOCAL_VARIABLE_NT, "NONLOCAL_VARIABLE_NT", 0, 0, LVALUE_NCAT, 0);
ParseTree::md(PROPERTY_VALUE_NT, "PROPERTY_VALUE_NT", 2, 2, LVALUE_NCAT, 0);
ParseTree::md(TABLE_ENTRY_NT, "TABLE_ENTRY_NT", 1, 4, LVALUE_NCAT, 0);
ParseTree::md(LIST_ENTRY_NT, "LIST_ENTRY_NT", 2, 2, LVALUE_NCAT, 0);
ParseTree::md((parse_tree_node_type) { LOGICAL_NOT_NT, "LOGICAL_NOT_NT", 1, 1, COND_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LOGICAL_TENSE_NT, "LOGICAL_TENSE_NT", 1, 1, COND_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LOGICAL_AND_NT, "LOGICAL_AND_NT", 2, 2, COND_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { LOGICAL_OR_NT, "LOGICAL_OR_NT", 2, 2, COND_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TEST_PROPOSITION_NT, "TEST_PROPOSITION_NT", 0, 0, COND_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TEST_PHRASE_OPTION_NT, "TEST_PHRASE_OPTION_NT", 0, 0, COND_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { TEST_VALUE_NT, "TEST_VALUE_NT", 1, 1, COND_NCAT, 0 });
ParseTree::md(LOGICAL_NOT_NT, "LOGICAL_NOT_NT", 1, 1, COND_NCAT, 0);
ParseTree::md(LOGICAL_TENSE_NT, "LOGICAL_TENSE_NT", 1, 1, COND_NCAT, 0);
ParseTree::md(LOGICAL_AND_NT, "LOGICAL_AND_NT", 2, 2, COND_NCAT, 0);
ParseTree::md(LOGICAL_OR_NT, "LOGICAL_OR_NT", 2, 2, COND_NCAT, 0);
ParseTree::md(TEST_PROPOSITION_NT, "TEST_PROPOSITION_NT", 0, 0, COND_NCAT, 0);
ParseTree::md(TEST_PHRASE_OPTION_NT, "TEST_PHRASE_OPTION_NT", 0, 0, COND_NCAT, 0);
ParseTree::md(TEST_VALUE_NT, "TEST_VALUE_NT", 1, 1, COND_NCAT, 0);
}
@

View file

@ -22,14 +22,14 @@ To construct standard verb-phrase nodes in the parse tree.
=
void Diagrams::setup(void) {
ParseTree::md((parse_tree_node_type) { AVERB_NT, "AVERB_NT", 0, 0, L3_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { RELATIONSHIP_NT, "RELATIONSHIP_NT", 0, 2, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { CALLED_NT, "CALLED_NT", 2, 2, L3_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { WITH_NT, "WITH_NT", 2, 2, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { AND_NT, "AND_NT", 2, 2, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { KIND_NT, "KIND_NT", 0, 1, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { PROPER_NOUN_NT, "PROPER_NOUN_NT", 0, 0, L3_NCAT, ASSERT_NFLAG });
ParseTree::md((parse_tree_node_type) { PROPERTY_LIST_NT, "PROPERTY_LIST_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG });
ParseTree::md(AVERB_NT, "AVERB_NT", 0, 0, L3_NCAT, 0);
ParseTree::md(RELATIONSHIP_NT, "RELATIONSHIP_NT", 0, 2, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(CALLED_NT, "CALLED_NT", 2, 2, L3_NCAT, 0);
ParseTree::md(WITH_NT, "WITH_NT", 2, 2, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(AND_NT, "AND_NT", 2, 2, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(KIND_NT, "KIND_NT", 0, 1, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(PROPER_NOUN_NT, "PROPER_NOUN_NT", 0, 0, L3_NCAT, ASSERT_NFLAG);
ParseTree::md(PROPERTY_LIST_NT, "PROPERTY_LIST_NT", 0, INFTY, L3_NCAT, ASSERT_NFLAG);
ParseTree::allow_annotation(AVERB_NT, verbal_certainty_ANNOT);
ParseTree::allow_annotation(AVERB_NT, sentence_is_existential_ANNOT);
ParseTree::allow_annotation(AVERB_NT, possessive_verb_ANNOT);

View file

@ -58,7 +58,7 @@ int my_first_verb = TRUE;
void Unit::start_diagrams(void) {
trace_sentences = TRUE;
ParseTree::md((parse_tree_node_type) { UNKNOWN_NT, "UNKNOWN_NT", 0, INFTY, L2_NCAT, 0 });
ParseTree::md(UNKNOWN_NT, "UNKNOWN_NT", 0, INFTY, L2_NCAT, 0);
}
parse_node_tree *syntax_tree = NULL;

View file

@ -222,8 +222,8 @@ typedef struct parse_tree_node_type {
@ The bitmap of node flags begins with:
@d DONT_VISIT_NFLAG 0x00000001 /* not visited in traverses */
@d TABBED_CONTENT_NFLAG 0x00000002 /* contains tab-delimited lists */
@d DONT_VISIT_NFLAG 0x00000001 /* not visited in traverses */
@d TABBED_NFLAG 0x00000002 /* contains tab-delimited lists */
@ Various modules conventionally use this global setting to toggle debugging
log output:
@ -239,27 +239,38 @@ Note that the sequence here must exactly match the enumeration above.
=
parse_tree_node_type parse_tree_node_types[NO_DEFINED_NT_VALUES];
void ParseTree::md(parse_tree_node_type ptnt) {
if (ParseTree::valid_type(ptnt.identity) == FALSE) internal_error("set bad metadata");
parse_tree_node_types[ptnt.identity - BASE_OF_ENUMERATED_NTS] = ptnt;
void ParseTree::md(node_type_t identity, char *node_type_name, int min_children,
int max_children, int category, int node_flags) {
if (ParseTree::valid_type(identity) == FALSE) internal_error("set bad metadata");
parse_tree_node_type *ptnt =
&(parse_tree_node_types[identity - BASE_OF_ENUMERATED_NTS]);
ptnt->identity = identity;
ptnt->node_type_name = node_type_name;
ptnt->min_children = min_children;
ptnt->max_children = max_children;
ptnt->category = category;
ptnt->node_flags = node_flags;
}
@ =
void ParseTree::metadata_setup(void) {
ParseTree::md((parse_tree_node_type) { INVALID_NT, "(INVALID_NT)", 0, INFTY, INVALID_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { ROOT_NT, "ROOT_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG });
ParseTree::md((parse_tree_node_type) { INCLUSION_NT, "INCLUSION_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG });
ParseTree::md((parse_tree_node_type) { HEADING_NT, "HEADING_NT", 0, INFTY, L1_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { INCLUDE_NT, "INCLUDE_NT", 0, 0, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { BEGINHERE_NT, "BEGINHERE_NT", 0, 0, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { ENDHERE_NT, "ENDHERE_NT", 0, 0, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { SENTENCE_NT, "SENTENCE_NT", 0, INFTY, L2_NCAT, 0 });
ParseTree::md((parse_tree_node_type) { AMBIGUITY_NT, "AMBIGUITY_NT", 0, INFTY, L1_NCAT, 0 });
ParseTree::md(INVALID_NT, "(INVALID_NT)", 0, INFTY, INVALID_NCAT, 0);
ParseTree::md(ROOT_NT, "ROOT_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG);
ParseTree::md(INCLUSION_NT, "INCLUSION_NT", 0, INFTY, L1_NCAT, DONT_VISIT_NFLAG);
ParseTree::md(HEADING_NT, "HEADING_NT", 0, INFTY, L1_NCAT, 0);
ParseTree::md(INCLUDE_NT, "INCLUDE_NT", 0, 0, L2_NCAT, 0);
ParseTree::md(BEGINHERE_NT, "BEGINHERE_NT", 0, 0, L2_NCAT, 0);
ParseTree::md(ENDHERE_NT, "ENDHERE_NT", 0, 0, L2_NCAT, 0);
ParseTree::md(SENTENCE_NT, "SENTENCE_NT", 0, INFTY, L2_NCAT, 0);
ParseTree::md(AMBIGUITY_NT, "AMBIGUITY_NT", 0, INFTY, L1_NCAT, 0);
#ifdef UNKNOWN_NT
ParseTree::md((parse_tree_node_type) { UNKNOWN_NT, "UNKNOWN_NT", 0, INFTY, L3_NCAT, 0 });
ParseTree::md(UNKNOWN_NT, "UNKNOWN_NT", 0, INFTY, L3_NCAT, 0);
#endif
#ifdef PARSE_TREE_METADATA_SETUP
PARSE_TREE_METADATA_SETUP();
#ifdef SYNTAX_TREE_METADATA_SETUP
SYNTAX_TREE_METADATA_SETUP();
#endif
#ifdef SYNTAX_TREE_FURTHER_METADATA_SETUP
SYNTAX_TREE_FURTHER_METADATA_SETUP();
#endif
}

View file

@ -48,7 +48,7 @@ So we carry out the sentence breaking with a simple finite state machine --
the last sentence having been a rule preamble tells us that the current one
is probably a phrase, and so on -- and the following is its state.
@default COPY_FILE_TYPE void
@default SYNTAX_PROBLEM_REF_TYPE void
=
source_file *sfsm_source_file = NULL;
@ -56,7 +56,7 @@ int sfsm_inside_rule_mode = FALSE;
int sfsm_skipping_material_at_level = -1;
int sfsm_in_tabbed_mode = FALSE;
int sfsm_main_source_start_wn = -1;
COPY_FILE_TYPE *sfsm_copy = NULL;
SYNTAX_PROBLEM_REF_TYPE *sfsm_copy = NULL;
void *sfsm_project = NULL;
void Sentences::set_start_of_source(int wn) {
@ -72,17 +72,17 @@ finite state machine.
void Sentences::break(parse_node_tree *T, wording W) {
Sentences::break_inner(T, W, FALSE, NULL, NULL);
}
void Sentences::break_into_project_copy(parse_node_tree *T, wording W, COPY_FILE_TYPE *C,
void Sentences::break_into_project_copy(parse_node_tree *T, wording W, SYNTAX_PROBLEM_REF_TYPE *C,
void *build_project) {
Sentences::break_inner(T, W, FALSE, C, build_project);
}
void Sentences::break_into_extension_copy(parse_node_tree *T, wording W, COPY_FILE_TYPE *C,
void Sentences::break_into_extension_copy(parse_node_tree *T, wording W, SYNTAX_PROBLEM_REF_TYPE *C,
void *build_project) {
Sentences::break_inner(T, W, TRUE, C, build_project);
}
void Sentences::break_inner(parse_node_tree *T, wording W, int is_extension,
COPY_FILE_TYPE *from_copy, void *build_project) {
SYNTAX_PROBLEM_REF_TYPE *from_copy, void *build_project) {
while (((Wordings::nonempty(W))) && (compare_word(Wordings::first_wn(W), PARBREAK_V)))
W = Wordings::trim_first_word(W);
if (Wordings::empty(W)) return;
@ -142,7 +142,7 @@ since their entries are governed by different lexical and semantic rules.)
@<Go into table sentence mode if necessary@> =
if ((<structural-sentence>(Wordings::from(W, sentence_start))) &&
(ParseTree::test_flag(ssnt, TABBED_CONTENT_NFLAG)))
(ParseTree::test_flag(ssnt, TABBED_NFLAG)))
sfsm_in_tabbed_mode = TRUE;
else
sfsm_in_tabbed_mode = FALSE;