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

Moved some Preform utilities back to words

This commit is contained in:
Graham Nelson 2020-05-22 09:38:17 +01:00
parent 1ed44539c3
commit a77ae3b34b
99 changed files with 659 additions and 1354 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6Q51 'Krypton' (21 May 2020)
v10.1.0-alpha.1+6Q52 'Krypton' (22 May 2020)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 21 May 2020
Build Number: 6Q51
Build Date: 22 May 2020
Build Number: 6Q52

View file

@ -599,7 +599,7 @@ anything including the word "of":
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">vocabulary_entry</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">suppression</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">word_to_suppress_in_phrases</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-function-syntax">&lt;property-of-shape&gt;</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">)) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">property_word_to_suppress</span><span class="Preform-plain-syntax"> == </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">)</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">property_word_to_suppress</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Preform::Nonparsing::word</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;property-of-shape&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">property_word_to_suppress</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">PreformUtilities::word</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;property-of-shape&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">word_to_suppress_in_phrases</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">property_word_to_suppress</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">parse_node</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">p</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">ExParser::parse_excerpt</span><span class="Preform-plain-syntax">(</span><span class="Preform-constant-syntax">VALUE_PHRASE_MC</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">);</span>

View file

@ -115,22 +115,22 @@ equality BP as everything else.
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">QUASINUMERIC_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"greater-than"</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="identifier-syntax">NULL</span><span class="plain-syntax">, </span><a href="12-is.html#SP4" class="function-link"><span class="function-syntax">Calculus::Schemas::new</span></a><span class="plain-syntax">(</span><span class="string-syntax">"*1 &gt; *2"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">GT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">GT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_numerically_less_than</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">QUASINUMERIC_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"less-than"</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="identifier-syntax">NULL</span><span class="plain-syntax">, </span><a href="12-is.html#SP4" class="function-link"><span class="function-syntax">Calculus::Schemas::new</span></a><span class="plain-syntax">(</span><span class="string-syntax">"*1 &lt; *2"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">LT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">LT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_numerically_greater_than_or_equal_to</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">QUASINUMERIC_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"at-least"</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="identifier-syntax">NULL</span><span class="plain-syntax">, </span><a href="12-is.html#SP4" class="function-link"><span class="function-syntax">Calculus::Schemas::new</span></a><span class="plain-syntax">(</span><span class="string-syntax">"*1 &gt;= *2"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">GE_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">GE_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_numerically_less_than_or_equal_to</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">QUASINUMERIC_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">number_term</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"at-most"</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="identifier-syntax">NULL</span><span class="plain-syntax">, </span><a href="12-is.html#SP4" class="function-link"><span class="function-syntax">Calculus::Schemas::new</span></a><span class="plain-syntax">(</span><span class="string-syntax">"*1 &lt;= *2"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">LE_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">LE_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP26" class="function-link"><span class="function-syntax">BinaryPredicates::set_index_details</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R_numerically_greater_than</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"arithmetic value"</span><span class="plain-syntax">, </span><span class="string-syntax">"arithmetic value"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP26" class="function-link"><span class="function-syntax">BinaryPredicates::set_index_details</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R_numerically_less_than</span><span class="plain-syntax">,</span>

View file

@ -101,8 +101,8 @@ since (alone among binary predicates) it has no distinct reversal.
<span class="plain-syntax"> </span><span class="identifier-syntax">R_equality</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP27" class="function-link"><span class="function-syntax">BinaryPredicates::make_equality</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP26" class="function-link"><span class="function-syntax">BinaryPredicates::set_index_details</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R_equality</span><span class="plain-syntax">, </span><span class="string-syntax">"value"</span><span class="plain-syntax">, </span><span class="string-syntax">"value"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-name-formal&gt;</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">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">EQUALITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-name-formal&gt;</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">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">EQUALITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
@ -115,7 +115,7 @@ since (alone among binary predicates) it has no distinct reversal.
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"has"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-had-by"</span><span class="plain-syntax">,</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="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">POSSESSION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">POSSESSION_RELATION_NAME</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

@ -669,7 +669,7 @@ prepositional usages to test property-equality ("the same height as").
<span class="plain-syntax"> </span><span class="identifier-syntax">set_where_created</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_meaning</span><span class="plain-syntax"> </span><span class="identifier-syntax">vm</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VerbMeanings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">root</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">preposition_identity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prep</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Prepositions::make</span><span class="plain-syntax">(</span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;comparative-property-construction&gt;</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">Prepositions::make</span><span class="plain-syntax">(</span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;comparative-property-construction&gt;</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">WordAssemblages::lit_1</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lexer::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">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Verbs::add_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">copular_verb</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">vm</span><span class="plain-syntax">, </span><span class="identifier-syntax">SVO_FS_BIT</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -367,7 +367,7 @@ name in both forms. The following grammar is used to construct this prefix.
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">PROPERTY_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;property-name-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;property-name-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -128,7 +128,7 @@ to make C. J.)
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_meaning</span><span class="plain-syntax"> </span><span class="identifier-syntax">vm</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VerbMeanings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">root</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">preposition_identity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prep</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Prepositions::make</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;same-property-as-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;same-property-as-construction&gt;</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">WordAssemblages::from_wording</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="plain-syntax"> </span><span class="identifier-syntax">Verbs::add_form</span><span class="plain-syntax">(</span><span class="identifier-syntax">copular_verb</span><span class="plain-syntax">, </span><span class="identifier-syntax">prep</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">vm</span><span class="plain-syntax">, </span><span class="identifier-syntax">SVO_FS_BIT</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -92,7 +92,7 @@ grant permission to hold a property within the world model.
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">PROVISION_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"provides"</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="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="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">PROVISION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">PROVISION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP26" class="function-link"><span class="function-syntax">BinaryPredicates::set_index_details</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R_provision</span><span class="plain-syntax">, </span><span class="string-syntax">"value"</span><span class="plain-syntax">, </span><span class="string-syntax">"property"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -571,7 +571,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then:
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">table_no_text</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">TABLES</span><span class="plain-syntax">, </span><span class="string-syntax">"Registering table by number: table %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">table_no_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;table-names-construction&gt;</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">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;table-names-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">table_no_text</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>
@ -581,7 +581,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then:
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">table_name_text</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">TABLES</span><span class="plain-syntax">, </span><span class="string-syntax">"Registering table by name: table of %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">table_name_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;table-names-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;table-names-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">table_name_text</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -142,7 +142,7 @@ of any existing column.
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">TABLE_COLUMN_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_table_column</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tc</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;table-column-name-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;table-column-name-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -346,7 +346,7 @@ We know that this begins with the word "equation", or we wouldn't be here
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">NO</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;equation-names-construction&gt;</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">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;equation-names-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">NO</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>
@ -369,7 +369,7 @@ We know that this begins with the word "equation", or we wouldn't be here
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">EQUATION_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_equation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">eqn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;equation-names-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;equation-names-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">NA</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -283,7 +283,7 @@ noun for it; for example, the "announcing activity".
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">ACTIVITY_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_activity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;activity-name-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;activity-name-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">av</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -353,13 +353,13 @@ built (for instance, scene endings).
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_rulebook</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">RULEBOOK_MC</span><span class="plain-syntax">, </span><a href="14-rv.html#SP1" class="function-link"><span class="function-syntax">Rvalues::from_rulebook</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;rulebook-name-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">rb</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">primary_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -167,7 +167,7 @@ present.
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">Plugins::Manage::wording</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">Plugins::Manage::wording</span></span>:<br/><a href="26-pl.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;plugin-name&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;plugin-name&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. Plugins. </b></p>

View file

@ -188,9 +188,9 @@ this because we need access to it very quickly when parsing text substitutions.)
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_number</span><span class="plain-syntax">(3, &amp;(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">match_number</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Instrumentation::write_ptoken</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="string-syntax">" "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="string-syntax">" "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>

View file

@ -288,7 +288,7 @@ whole thing into a <span class="extract"><span class="extract-syntax">specificat
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_ADAPTIVE_PERSON</span><span class="plain-syntax"> </span><a href="3-nl.html#SP5" class="function-link"><span class="function-syntax">NaturalLanguages::adaptive_person</span></a>
<span class="definition-keyword">define</span> <span class="constant-syntax">MORE_PREFORM_OPTIMISER_WORDS_CALLBACK</span><span class="plain-syntax"> </span><a href="4-its.html#SP8" class="function-link"><span class="function-syntax">Semantics::mark_preform_requirements</span></a>
<span class="definition-keyword">define</span> <span class="constant-syntax">INFLECTIONS_ERROR_HANDLER</span><span class="plain-syntax"> </span><a href="3-nl.html#SP7" class="function-link"><span class="function-syntax">NaturalLanguages::preform_error</span></a>
<span class="definition-keyword">define</span> <span class="constant-syntax">PREFORM_ERROR_WORDS_CALLBACK</span><span class="plain-syntax"> </span><a href="3-nl.html#SP7" class="function-link"><span class="function-syntax">NaturalLanguages::preform_error</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">Semantics::read_preform</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">Semantics::read_preform</span></span>:<br/>Main Routine - <a href="1-mr.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inform_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>

View file

@ -631,7 +631,7 @@ this effect. For now, we give \(EQ\) entirely blank term details.
<span class="plain-syntax"> </span><span class="reserved-syntax">binary_predicate</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><a href="6-bp.html#SP30" class="function-link"><span class="function-syntax">BinaryPredicates::make_single</span></a><span class="plain-syntax">(</span><span class="constant-syntax">EQUALITY_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"is"</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="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">EQUALITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">EQUALITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reversal</span><span class="plain-syntax"> = </span><span class="identifier-syntax">bp</span><span class="plain-syntax">; </span><span class="identifier-syntax">bp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">right_way_round</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax">;</span>
@ -671,7 +671,7 @@ how to compile the BP for the one which is the right way round.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">source_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-name-formal&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">source_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-name-formal&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">source_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax"> + </span><span class="identifier-syntax">PARSE_EXACTLY_NTOPT</span><span class="plain-syntax">,</span>

View file

@ -121,13 +121,13 @@ cleared.)
<span class="Preform-reserved-syntax">void</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">NewVerbs::add_inequalities_inner</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">verb_meaning</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">lt</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">verb_meaning</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">gt</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">verb_meaning</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">le</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">verb_meaning</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">ge</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">set_where_created</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">current_main_verb</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">Preform::Nonparsing::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">PreformUtilities::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">IS_TENSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">ACTIVE_MOOD</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">Verbs::new_operator_verb</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">lt</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">Preform::Nonparsing::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">PreformUtilities::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">IS_TENSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">ACTIVE_MOOD</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">Verbs::new_operator_verb</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">gt</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">Preform::Nonparsing::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">2</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">PreformUtilities::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">2</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">IS_TENSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">ACTIVE_MOOD</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">Verbs::new_operator_verb</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">le</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">Preform::Nonparsing::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">3</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">VerbUsages::register_single_usage</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">PreformUtilities::wording</span><span class="Preform-plain-syntax">(</span><span class="Preform-function-syntax">&lt;inequality-conjugations&gt;</span><span class="Preform-plain-syntax">, </span><span class="Preform-constant-syntax">3</span><span class="Preform-plain-syntax">),</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">IS_TENSE</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">ACTIVE_MOOD</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">Verbs::new_operator_verb</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">ge</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">);</span>
<span class="Preform-plain-syntax">}</span>
@ -800,13 +800,13 @@ foreign verbs (4).
<span class="plain-syntax"> </span><a href="6-nv.html#SP16" class="function-link"><span class="function-syntax">NewVerbs::declare_sm</span></a><span class="plain-syntax">(</span><a href="7-ns.html#SP11" class="function-link"><span class="function-syntax">Sentences::VPs::include_in_SMF</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"include-in"</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-nv.html#SP16" class="function-link"><span class="function-syntax">NewVerbs::declare_sm</span></a><span class="plain-syntax">(</span><a href="7-ns.html#SP11" class="function-link"><span class="function-syntax">Sentences::VPs::omit_from_SMF</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"omit-from"</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">infinitive</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;bootstrap-verb&gt;</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">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">infinitive</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;bootstrap-verb&gt;</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">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Conjugation::conjugate</span><span class="plain-syntax">(</span><span class="identifier-syntax">infinitive</span><span class="plain-syntax">, </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_identity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vi</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Verbs::new_verb</span><span class="plain-syntax">(</span><span class="identifier-syntax">vc</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">vc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">vc_conjugates</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vi</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VerbUsages::register_all_usages_of_verb</span><span class="plain-syntax">(</span><span class="identifier-syntax">vi</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">infinitive</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;bootstrap-verb&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">infinitive</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;bootstrap-verb&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Conjugation::conjugate</span><span class="plain-syntax">(</span><span class="identifier-syntax">infinitive</span><span class="plain-syntax">, </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vi</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Verbs::new_verb</span><span class="plain-syntax">(</span><span class="identifier-syntax">vc</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">vc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">vc_conjugates</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vi</span><span class="plain-syntax">;</span>

View file

@ -721,7 +721,7 @@ omitted from the index.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">pw_wa</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-storage-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-storage-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">RW</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">pw_wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">prn</span><span class="plain-syntax"> = </span><a href="15-vp.html#SP2" class="function-link"><span class="function-syntax">Properties::Valued::obtain_within_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_object</span><span class="plain-syntax">);</span>

View file

@ -85,12 +85,12 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNIVERSAL_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"relates"</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="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="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">UNIVERSAL_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">UNIVERSAL_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_meaning</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP28" class="function-link"><span class="function-syntax">BinaryPredicates::make_pair</span></a><span class="plain-syntax">(</span><span class="constant-syntax">UNIVERSAL_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><a href="6-bp.html#SP18" class="function-link"><span class="function-syntax">BinaryPredicates::new_term</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"means"</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="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="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MEANING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MEANING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. Second stock. </b>There is none, of course.

View file

@ -95,7 +95,7 @@ built in:
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_room</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"adjacent-to"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"adjacent-from"</span><span class="plain-syntax">,</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="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"TestAdjacency(*1,*2)"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADJACENCY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">ADJACENCY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
@ -213,22 +213,22 @@ this to other languages.)
<span class="plain-syntax"> </span><span class="identifier-syntax">bp_term_details</span><span class="plain-syntax"> </span><span class="identifier-syntax">room_term</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">MAP_CONNECTING_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">room_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">room_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">relname</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="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="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-relation-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-relation-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">mpc_form</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;notable-directions&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">mpc_form</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">preposition_identity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prep1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Prepositions::make</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-preposition-construction&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">mpc_form</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-preposition-construction&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">mpc_form</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">preposition_identity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prep2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Prepositions::make</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-preposition-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-preposition-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">preposition_identity</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prep3</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Prepositions::make</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-preposition-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">3</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;mapping-preposition-construction&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">3</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>

View file

@ -294,7 +294,7 @@ messages which would have been less helpful if core Inform had produced them.
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Knowledge::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"region-contains"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"in-region"</span><span class="plain-syntax">,</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="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"TestRegionalContainment(*2,*1)"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">REGIONAL_CONTAINMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::set_index_details</span><span class="plain-syntax">(</span><span class="identifier-syntax">R_regional_containment</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="string-syntax">"room/region"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -126,7 +126,7 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"contains"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-in"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MoveObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONTAINMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONTAINMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_containment</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="string-syntax">"ContainerOf"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_containment</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_ranger</span><span class="plain-syntax"> = </span><span class="string-syntax">"TestContainmentRange"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::set_index_details</span><span class="plain-syntax">(</span><span class="identifier-syntax">R_containment</span><span class="plain-syntax">, </span><span class="string-syntax">"container/room"</span><span class="plain-syntax">, </span><span class="string-syntax">"thing"</span><span class="plain-syntax">);</span>
@ -136,7 +136,7 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"supports"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-on"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MoveObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">SUPPORT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">SUPPORT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_support</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="string-syntax">"SupporterOf"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_incorporation</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
@ -144,14 +144,14 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"incorporates"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-part-of"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MakePart(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">INCORPORATION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">INCORPORATION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_carrying</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::full_new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_person</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"CarrierOf(*1)"</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"carries"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-carried-by"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MoveObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">CARRYING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">CARRYING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_carrying</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="string-syntax">"CarrierOf"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_holding</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
@ -159,7 +159,7 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"holds"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-held-by"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MoveObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">HOLDING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">HOLDING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> can't be optimised, because parts are also held</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_wearing</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
@ -167,7 +167,7 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"wears"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-worn-by"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"WearObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">WEARING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">WEARING_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_wearing</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="string-syntax">"WearerOf"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">a_has_b_predicate</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
@ -175,7 +175,7 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"has"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-had-by"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MoveObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">POSSESSION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">POSSESSION_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">a_has_b_predicate</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="string-syntax">"OwnerOf"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::set_index_details</span><span class="plain-syntax">(</span><span class="identifier-syntax">a_has_b_predicate</span><span class="plain-syntax">, </span><span class="string-syntax">"person"</span><span class="plain-syntax">, </span><span class="string-syntax">"thing"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">room_containment_predicate</span><span class="plain-syntax"> =</span>
@ -184,7 +184,7 @@ a union of the others, and therefore includes incorporation.)
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-room-of"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-in-room"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"MoveObject(*2,*1)"</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">ROOM_CONTAINMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">ROOM_CONTAINMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">room_containment_predicate</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">loop_parent_optimisation_proviso</span><span class="plain-syntax"> = </span><span class="string-syntax">"LocationOf"</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-sr.html#SP3">&#167;3</a>.</li></ul>
@ -202,28 +202,28 @@ can be tested at run-time, but which can't be asserted or made true or false.
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"can-see"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"can-be-seen-by"</span><span class="plain-syntax">,</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="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"TestVisibility(*1,*2)"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">VISIBILITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">VISIBILITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_touchability</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"can-touch"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"can-be-touched-by"</span><span class="plain-syntax">,</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="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"TestTouchability(*1,*2)"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TOUCHABILITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TOUCHABILITY_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_concealment</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs_thing</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"conceals"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-concealed-by"</span><span class="plain-syntax">,</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="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"TestConcealment(*1,*2)"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONCEALMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONCEALMENT_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">R_enclosure</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::make_pair</span><span class="plain-syntax">(</span><span class="identifier-syntax">SPATIAL_KBP</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Knowledge::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">BinaryPredicates::new_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::Knowledge::as_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">K_object</span><span class="plain-syntax">)),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"encloses"</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"is-enclosed-by"</span><span class="plain-syntax">,</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="identifier-syntax">Calculus::Schemas::new</span><span class="plain-syntax">(</span><span class="string-syntax">"IndirectlyContains(*1,*2)"</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">ENCLOSURE_RELATION_NAME</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relation-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">ENCLOSURE_RELATION_NAME</span><span class="plain-syntax">));</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-sr.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. Second stock. </b>There is none &mdash; this is a family of relations which is all built in.

View file

@ -346,7 +346,7 @@ make that explicit: for instance, "taking" becomes "the taking action".
<span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">out_of_world</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">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">an_specification_text_word</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;action-name-construction&gt;</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">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;action-name-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">an</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Nouns::new_proper_noun</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">, </span><span class="identifier-syntax">NEUTER_GENDER</span><span class="plain-syntax">,</span>

View file

@ -278,7 +278,7 @@ for the kinds we inherit from.
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_WORDING</span><span class="plain-syntax">(</span><span class="identifier-syntax">j</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">j</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::replace_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::find_corresponding_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;possessive-second-person&gt;</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;possessive-first-person&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>

View file

@ -301,11 +301,11 @@ on. (Sometimes these will also be listed separately with an adjectival sense.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::enter_lexicon</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;indefinite-article&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MISCELLANEOUS_LEXE</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::enter_lexicon</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;indefinite-article&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MISCELLANEOUS_LEXE</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"indefinite article"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::enter_lexicon</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;definite-article&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MISCELLANEOUS_LEXE</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::enter_lexicon</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;definite-article&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MISCELLANEOUS_LEXE</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"definite article"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Preform::Nonparsing::enter_lexicon</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relative-clause-marker&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MISCELLANEOUS_LEXE</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::enter_lexicon</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;relative-clause-marker&gt;</span><span class="plain-syntax">, </span><span class="constant-syntax">MISCELLANEOUS_LEXE</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"connective"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"used to place a further condition on a description: like 'which' in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'A which is B', or 'A which carries B', for instance."</span><span class="plain-syntax">);</span>

View file

@ -12,6 +12,14 @@
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
@ -139,9 +147,14 @@ in its run.
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">English_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> until created, early in run</span>
<span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="function-syntax">Linguistics::default_nl</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">Linguistics::default_nl</span></span>:<br/>Name Clusters - <a href="2-nc.html#SP4_1_1">&#167;4.1.1</a><br/>Article Inflection - <a href="3-ai.html#SP1">&#167;1</a><br/>Declensions - <a href="3-dcl.html#SP3">&#167;3</a><br/>Pluralisation - <a href="3-plr.html#SP4">&#167;4</a><br/>Grading Adjectives - <a href="3-ga.html#SP2">&#167;2</a>, <a href="3-ga.html#SP3">&#167;3</a><br/>Past Participles - <a href="3-pp.html#SP2">&#167;2</a><br/>Verb Conjugation - <a href="3-vc.html#SP4_2_1">&#167;4.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">nl</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">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="1-im.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">ld</li><li class="progresssection"><a href="2-np.html">np</a></li><li class="progresssection"><a href="2-tai.html">tai</a></li><li class="progresssection"><a href="2-nc.html">nc</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="2-np.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="1-im.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">ld</li><li class="progresssection"><a href="2-tai.html">tai</a></li><li class="progresssection"><a href="2-nc.html">nc</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="2-tai.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -96,7 +96,7 @@ with lingistic roles. For example, the cluster of names for the common noun
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure name_cluster is private to this section.</li><li>The structure individual_name is accessed in 2/np and here.</li></ul>
<ul class="endnotetexts"><li>The structure name_cluster is private to this section.</li><li>The structure individual_name is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>A cluster begins empty.
</p>
@ -221,10 +221,10 @@ through one or two tries.
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">step1</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><a href="2-tai.html#SP2" class="function-link"><span class="function-syntax">Inflections::apply_trie_to_wa</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wa</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">step1</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="identifier-syntax">step1</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">step2</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><a href="2-tai.html#SP2" class="function-link"><span class="function-syntax">Inflections::apply_trie_to_wa</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wa</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">step2</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="identifier-syntax">step2</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">FW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-nc.html#SP4_1">&#167;4.1</a>.</li></ul>
@ -313,7 +313,7 @@ to an <span class="extract"><span class="extract-syntax">excerpt_meaning</span><
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-tai.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ld.html">ld</a></li><li class="progresssection"><a href="2-np.html">np</a></li><li class="progresssection"><a href="2-tai.html">tai</a></li><li class="progresscurrent">nc</li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-ai.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-tai.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ld.html">ld</a></li><li class="progresssection"><a href="2-tai.html">tai</a></li><li class="progresscurrent">nc</li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-ai.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -1,360 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Non-Parsing Preform</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="index.html"><span class="selectedlink">inflections</span></a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Non-Parsing Preform' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">inflections</a></li><li><a href="index.html#2">Chapter 2: Machinery</a></li><li><b>Non-Parsing Preform</b></li></ul></div>
<p class="purpose">Other uses for Preform grammar, including the generation of adaptive text, and word inflection.</p>
<ul class="toc"><li><a href="2-np.html#SP1">&#167;1. Introduction</a></li><li><a href="2-np.html#SP2">&#167;2. (a) Specifying generated text</a></li><li><a href="2-np.html#SP5">&#167;5. (b) Specifying replacements</a></li><li><a href="2-np.html#SP6">&#167;6. (c) Lexicon entry</a></li><li><a href="2-np.html#SP7">&#167;7. (d) Making tries</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Introduction. </b>Looked at more generally, Preform isn't just a parser syntax: it's a general-purpose way to specify
textual patterns, so we may as well take advantage of it for miscellaneous
other needs. There are altogether five non-parsing uses for Preform; in
order of complexity,
</p>
<ul class="items"><li>(a) Specifying text being generated by Inform;
</li><li>(b) Specifying replacements of one set of words by another;
</li><li>(c) Specifying miscellaneous entries for the lexicon in the index;
</li><li>(d) Saying how to build a trie which will detect patterns in a single word and
then modify it;
</li><li>(e) Saying how to conjugate a verb, that is, how to modify the wording of a
verb ("take", say) into all of its different forms (I take, he takes, it was
taken, I am taking, and so on). This we'll leave for later.
</li></ul>
<p class="commentary">Speed is not of the essence in any of these problems.
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. (a) Specifying generated text. </b>Our main operation here is a "merge". This extracts the text from a production,
substituting the ingredient text in place of any <span class="extract"><span class="extract-syntax">...</span></span> it finds. (Other
wildcards and nonterminals are ignored.) For example, merging the production
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">fried</span><span class="plain-syntax"> ... </span><span class="identifier-syntax">tomatoes</span>
</pre>
<p class="commentary">with "orange" results in "fried orange tomatoes".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">Preform::Nonparsing::merge</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">Preform::Nonparsing::merge</span></span>:<br/><a href="2-np.html#SP3">&#167;3</a>, <a href="2-np.html#SP4">&#167;4</a><br/>Grading Adjectives - <a href="3-ga.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pnum</span><span class="plain-syntax">, </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">ingredient</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pnum</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::join</span><span class="plain-syntax">(</span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="identifier-syntax">WordAssemblages::lit_1</span><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MULTIPLE_WILDCARD_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::join</span><span class="plain-syntax">(</span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="identifier-syntax">ingredient</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</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">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">(); </span><span class="comment-syntax"> give up, in other words</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>Thus we can simply extract the wording by performing a merge with the empty
ingredient text:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pnum</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-np.html#SP2" class="function-link"><span class="function-syntax">Preform::Nonparsing::merge</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnum</span><span class="plain-syntax">, </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>And here we take just one word:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">Preform::Nonparsing::word</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pnum</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><a href="2-np.html#SP2" class="function-link"><span class="function-syntax">Preform::Nonparsing::merge</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnum</span><span class="plain-syntax">, </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> **</span><span class="identifier-syntax">words</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">num_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::as_array</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">wa</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">words</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">num_words</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">num_words</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">words</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. (b) Specifying replacements. </b>The following looks for a word in one nonterminal and replaces it with the
corresponding word in another. If the word isn't found, it's left unchanged.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">Preform::Nonparsing::replace_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt_from</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt_to</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl_from</span><span class="plain-syntax">, *</span><span class="identifier-syntax">pl_to</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">pl_from</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pl_to</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr_from</span><span class="plain-syntax">, *</span><span class="identifier-syntax">pr_to</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">pr_from</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pr_to</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt_from</span><span class="plain-syntax">, *</span><span class="identifier-syntax">pt_to</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">pt_from</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pt_to</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pt_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pt_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt_to</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax">; </span><span class="comment-syntax"> no change, in other words</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. (c) Lexicon entry. </b>This is only a convenience for putting particles into the Lexicon:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Preform::Nonparsing::enter_lexicon</span><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt_from</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">category</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gloss</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt_from</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">alt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">alt</span><span class="plain-syntax">; </span><span class="identifier-syntax">alt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">alt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">alternative_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax"> = </span><span class="identifier-syntax">alt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ve</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Index::Lexicon::new_entry_with_details</span><span class="plain-syntax">(</span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::lit_1</span><span class="plain-syntax">(</span><span class="identifier-syntax">ve</span><span class="plain-syntax">), </span><span class="identifier-syntax">category</span><span class="plain-syntax">, </span><span class="identifier-syntax">gloss</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">endif</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. (d) Making tries. </b>Properly speaking, we make "avinues". Note that we expect to make a different
avinue for each natural language; this matters so that we can pluralise words
correctly in both English and French in the same run of Inform, for example.
But we are going to need to use these avinues frequently, so we cache them once
created.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="function-syntax">Preform::Nonparsing::define_trie</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">Preform::Nonparsing::define_trie</span></span>:<br/><a href="2-np.html#SP7_1_1_2">&#167;7.1.1.2</a><br/>Name Clusters - <a href="2-nc.html#SP4_1_1">&#167;4.1.1</a><br/>Article Inflection - <a href="3-ai.html#SP1">&#167;1</a><br/>Declensions - <a href="3-dcl.html#SP3">&#167;3</a><br/>Pluralisation - <a href="3-plr.html#SP4">&#167;4</a><br/>Grading Adjectives - <a href="3-ga.html#SP2">&#167;2</a>, <a href="3-ga.html#SP3">&#167;3</a><br/>Past Participles - <a href="3-pp.html#SP2">&#167;2</a><br/>Verb Conjugation - <a href="3-vc.html#SP4_2_1">&#167;4.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">end</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ave</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_avinue</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_avinue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-np.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Construct a new avinue from this nonterminal</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_avinue</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ave</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ave</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>&#167;7.1. </b>The grammar for this nonterminal is either a "list grammar", meaning that it
lists other nonterminals which each define avinues, and we have to string those
together into one long avinue; or else it contains the actual content of a
single avinue.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Construct a new avinue from this nonterminal</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">list_grammar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">; </span><span class="comment-syntax"> i.e., we don't know yet</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">second</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">second</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">second</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Instrumentation::log_production</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::trie_definition_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="string-syntax">"trie line with more than 2 words"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-np.html#SP7_1_1" class="named-paragraph-link"><span class="named-paragraph">Consider the one- or two-token production in this nonterminal</span><span class="named-paragraph-number">7.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-np.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1_1"></a><b>&#167;7.1.1. </b>Each production contains one or two tokens. There are four possibilities for
the production:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> (1) ... &lt;some-nonterminal&gt;</span>
<span class="plain-syntax"> (2) &lt;some-nonterminal&gt; ...</span>
<span class="plain-syntax"> (3) &lt;some-nonterminal&gt;</span>
<span class="plain-syntax"> (4) pattern-word instructions-word</span>
</pre>
<p class="commentary">Cases (1), (2) and (3) are allowed only in list grammars; case (4) is allowed
only in content grammars. The <span class="extract"><span class="extract-syntax">...</span></span> indicates whether the trie in the named
nonterminal will act on the start or end of a word &mdash; this is needed only to
override the normal convention.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Consider the one- or two-token production in this nonterminal</span><span class="named-paragraph-number">7.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">this_end</span><span class="plain-syntax"> = </span><span class="identifier-syntax">end</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">entry</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">first</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MULTIPLE_WILDCARD_PTC</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">second</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">second</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">entry</span><span class="plain-syntax"> = </span><span class="identifier-syntax">second</span><span class="plain-syntax">; </span><span class="identifier-syntax">this_end</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">first</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">second</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">second</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MULTIPLE_WILDCARD_PTC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">entry</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first</span><span class="plain-syntax">; </span><span class="identifier-syntax">this_end</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRIE_START</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">first</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">second</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">entry</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">entry</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">list_grammar</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="2-np.html#SP7_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Throw problem for a mixed trie nonterminal</span><span class="named-paragraph-number">7.1.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-np.html#SP7_1_1_2" class="named-paragraph-link"><span class="named-paragraph">Recurse to make an avinue from the nonterminal named here, and add it to our result</span><span class="named-paragraph-number">7.1.1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">list_grammar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">list_grammar</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-np.html#SP7_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Throw problem for a mixed trie nonterminal</span><span class="named-paragraph-number">7.1.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">second</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::trie_definition_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"there should be two words here, a pattern and an instruction"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-np.html#SP7_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Add this pattern and instruction to the trie, creating it if we haven't already started one</span><span class="named-paragraph-number">7.1.1.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">list_grammar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-np.html#SP7_1">&#167;7.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1_1_1"></a><b>&#167;7.1.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Throw problem for a mixed trie nonterminal</span><span class="named-paragraph-number">7.1.1.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::trie_definition_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this should either be a list of other nonterminals, or a list of patterns "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"and instructions, but not a mixture"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-np.html#SP7_1_1">&#167;7.1.1</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1_1_2"></a><b>&#167;7.1.1.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Recurse to make an avinue from the nonterminal named here, and add it to our result</span><span class="named-paragraph-number">7.1.1.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_mt</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Tries::duplicate_avinue</span><span class="plain-syntax">(</span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">this_end</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ave</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">ave</span><span class="plain-syntax"> = </span><span class="identifier-syntax">next_mt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">m</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ave</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">m</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) </span><span class="identifier-syntax">m</span><span class="plain-syntax"> = </span><span class="identifier-syntax">m</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">m</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">next_mt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-np.html#SP7_1_1">&#167;7.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1_1_3"></a><b>&#167;7.1.1.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add this pattern and instruction to the trie, creating it if we haven't already started one</span><span class="named-paragraph-number">7.1.1.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ave</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">ave</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Tries::new_avinue</span><span class="plain-syntax">(</span><span class="identifier-syntax">end</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">from</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">from</span><span class="plain-syntax">, </span><span class="string-syntax">"%V"</span><span class="plain-syntax">, </span><span class="identifier-syntax">first</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Tries::add_to_avinue</span><span class="plain-syntax">(</span><span class="identifier-syntax">ave</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">second</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</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">from</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-np.html#SP7_1_1">&#167;7.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>The following may be useful for debugging:
</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">Preform::Nonparsing::log_avinues</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">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_avinue</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n\n%V ($J)\n%a"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nonterminal_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">as_avinue</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-ld.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ld.html">ld</a></li><li class="progresscurrent">np</li><li class="progresssection"><a href="2-tai.html">tai</a></li><li class="progresssection"><a href="2-nc.html">nc</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="2-tai.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -139,7 +139,7 @@ do more than simply fiddle with the final letters.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-np.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ld.html">ld</a></li><li class="progresssection"><a href="2-np.html">np</a></li><li class="progresscurrent">tai</li><li class="progresssection"><a href="2-nc.html">nc</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="2-nc.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-ld.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ld.html">ld</a></li><li class="progresscurrent">tai</li><li class="progresssection"><a href="2-nc.html">nc</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="2-nc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -72,8 +72,9 @@ trickier than they look).
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">indef_trie</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">indef_trie</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;singular-noun-to-its-indefinite-article&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_START</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="function-syntax">&lt;singular-noun-to-its-indefinite-article&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_START</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Tries::search_avinue</span><span class="plain-syntax">(</span><span class="identifier-syntax">indef_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">initial_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="string-syntax">"a"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%w %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">, </span><span class="identifier-syntax">initial_text</span><span class="plain-syntax">);</span>

View file

@ -113,28 +113,28 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">.</span><span class="element-syntax">within_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"line in &lt;noun-declension&gt; malformed"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gender_letter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</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">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gender_letter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gender_letter</span><span class="plain-syntax">[0] == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">gender_letter</span><span class="plain-syntax">[0] == </span><span class="character-syntax">'m'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">gen</span><span class="plain-syntax"> == </span><span class="constant-syntax">MASCULINE_GENDER</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">gender_letter</span><span class="plain-syntax">[0] == </span><span class="character-syntax">'f'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">gen</span><span class="plain-syntax"> == </span><span class="constant-syntax">FEMININE_GENDER</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">gender_letter</span><span class="plain-syntax">[0] == </span><span class="character-syntax">'n'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">gen</span><span class="plain-syntax"> == </span><span class="constant-syntax">NEUTER_GENDER</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">found</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">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::decline_from_irregulars</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">gnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">found</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"this line must end with two nonterminals"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::decline_from_groups</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">gnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">tnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">found</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">found</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
@ -153,14 +153,14 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">.</span><span class="element-syntax">within_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nl</span><span 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::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gnt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stem</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stem</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stem</span><span class="plain-syntax"> == </span><span class="identifier-syntax">Lexer::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="plain-syntax"> *</span><span class="identifier-syntax">found</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">nc</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::no_cases</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"nonterminals are not allowed in irregular declensions"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">nc</span><span class="plain-syntax">)) || ((</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">2</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">nc</span><span class="plain-syntax">))) {</span>
@ -189,7 +189,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">.</span><span class="element-syntax">within_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nl</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">from</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">from</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">group_trie</span><span class="plain-syntax"> = </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">group_trie</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="identifier-syntax">gnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Tries::search_avinue</span><span class="plain-syntax">(</span><span class="identifier-syntax">group_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
@ -199,15 +199,15 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">group</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">[0] - </span><span class="character-syntax">'0'</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">group</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">group</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">9</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension nonterminal result not a group number"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"noun declension nonterminal malformed"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (--</span><span class="identifier-syntax">group</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::decline_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::decline_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -220,19 +220,19 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">nc</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::no_cases</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">.</span><span class="element-syntax">within_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;noun-declension&gt; too complex"</span><span 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"> &lt; </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">)) || ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">num</span><span class="plain-syntax"> == </span><span class="constant-syntax">2</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">stem</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">result</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">stem</span><span class="plain-syntax">, </span><span class="string-syntax">"%+W"</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-tai.html#SP1" class="function-link"><span class="function-syntax">Inflections::follow_suffix_instruction</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">, </span><span class="identifier-syntax">stem</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</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">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</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">D</span><span class="plain-syntax">.</span><span class="element-syntax">name_cased</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">%</span><span class="identifier-syntax">nc</span><span class="plain-syntax">] = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">result</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">stem</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">result</span><span class="plain-syntax">);</span>
@ -255,10 +255,10 @@ function togglePopup(material_id) {
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::no_cases</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">Declensions::no_cases</span></span>:<br/><a href="3-dcl.html#SP2_1">&#167;2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;grammatical-case-names&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</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">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</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">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) </span><span class="identifier-syntax">c</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_GRAMMATICAL_CASES</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;grammatical-case-names&gt; lists too many cases"</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">c</span><span class="plain-syntax">;</span>
@ -271,16 +271,16 @@ function togglePopup(material_id) {
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::writer</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax">, </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">AD</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;grammatical-case-names&gt;</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">nc</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::no_cases</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">D</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">within_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">D</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">within_language</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">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> != </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;grammatical-case-names&gt; too complex"</span><span 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"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">", "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%w: %W %W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%w: %W %W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</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">AD</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_cased</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">], </span><span class="identifier-syntax">D</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_cased</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">c</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">nc</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>

View file

@ -83,11 +83,11 @@ The following does the suffixing:
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">comprised</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comp_trie</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;adjective-to-comparative&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;adjective-to-comparative&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-tai.html#SP1" class="function-link"><span class="function-syntax">Inflections::suffix_inflection</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">, </span><span class="identifier-syntax">comp_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">comprised</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">merged</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP2" class="function-link"><span class="function-syntax">Preform::Nonparsing::merge</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;comparative-construction&gt;</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">PreformUtilities::merge</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;comparative-construction&gt;</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">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::to_wording</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">merged</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTRUCTED_PLURALS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Comparative of %W is %W]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">PW</span><span class="plain-syntax">);</span>
@ -105,7 +105,7 @@ The following does the suffixing:
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">comprised</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comp_trie</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;adjective-to-superlative&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;adjective-to-superlative&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-tai.html#SP1" class="function-link"><span class="function-syntax">Inflections::suffix_inflection</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">, </span><span class="identifier-syntax">comp_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">comprised</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTRUCTED_PLURALS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Superlative of %W is %W]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">PW</span><span class="plain-syntax">);</span>
@ -130,7 +130,7 @@ comparison: for instance, "tallness" for "tall", or "steeliness" for
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">comprised</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">comp_trie</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;adjective-to-quiddity&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;adjective-to-quiddity&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-tai.html#SP1" class="function-link"><span class="function-syntax">Inflections::suffix_inflection</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">, </span><span class="identifier-syntax">comp_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">comprised</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTRUCTED_PLURALS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Quiddity of %W is %W]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">PW</span><span class="plain-syntax">);</span>

View file

@ -171,7 +171,7 @@ has a plural, and modifies it to the plural form.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Pluralisation::regular</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">Pluralisation::regular</span></span>:<br/><a href="3-plr.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">plural_trie</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;singular-noun-to-its-plural&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;singular-noun-to-its-plural&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-tai.html#SP1" class="function-link"><span class="function-syntax">Inflections::suffix_inflection</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -104,7 +104,7 @@ above. It expects only a single word.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PastParticiples::pasturise_text</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">PastParticiples::pasturise_text</span></span>:<br/><a href="3-pp.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">past_trie</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="function-syntax">&lt;pasturise-participle&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_START</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;pasturise-participle&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_START</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><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">return</span><span class="plain-syntax"> </span><a href="2-tai.html#SP1" class="function-link"><span class="function-syntax">Inflections::suffix_inflection</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">past_trie</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -67,7 +67,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">inflections</a></li><li><a href="index.html#3">Chapter 3: Grammatical Uses of Inflection</a></li><li><b>Verb Conjugation</b></li></ul></div>
<p class="purpose">Conjugating verbs into the many different forms they can take.</p>
<ul class="toc"><li><a href="3-vc.html#SP2">&#167;2. Making conjugations</a></li><li><a href="3-vc.html#SP4">&#167;4. Follow instructions</a></li><li><a href="3-vc.html#SP5">&#167;5. Merge verb material</a></li><li><a href="3-vc.html#SP8">&#167;8. Parsing verb form numbers</a></li><li><a href="3-vc.html#SP9">&#167;9. Parsing tense and sense indicators</a></li><li><a href="3-vc.html#SP10">&#167;10. Parsing utilities</a></li><li><a href="3-vc.html#SP12">&#167;12. Errors</a></li><li><a href="3-vc.html#SP15">&#167;15. Testing</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="3-vc.html#SP2">&#167;2. Making conjugations</a></li><li><a href="3-vc.html#SP4">&#167;4. Follow instructions</a></li><li><a href="3-vc.html#SP5">&#167;5. Merge verb material</a></li><li><a href="3-vc.html#SP8">&#167;8. Parsing verb form numbers</a></li><li><a href="3-vc.html#SP9">&#167;9. Parsing tense and sense indicators</a></li><li><a href="3-vc.html#SP10">&#167;10. Parsing utilities</a></li><li><a href="3-vc.html#SP12">&#167;12. Errors</a></li><li><a href="3-vc.html#SP13">&#167;13. Testing</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>We will need to turn a base form of a verb &mdash; in English, this is always the
infinitive &mdash; into up to 123 variants; we manage this with quite an extensive
@ -118,7 +118,7 @@ conjugation to another.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="function-syntax">Conjugation::conjugate</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">Conjugation::conjugate</span></span>:<br/><a href="3-vc.html#SP5_4">&#167;5.4</a>, <a href="3-vc.html#SP15">&#167;15</a>, <a href="3-vc.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">base_text</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="function-syntax">Conjugation::conjugate</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">Conjugation::conjugate</span></span>:<br/><a href="3-vc.html#SP5_4">&#167;5.4</a>, <a href="3-vc.html#SP13">&#167;13</a>, <a href="3-vc.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">base_text</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-vc.html#SP2" class="function-link"><span class="function-syntax">Conjugation::conjugate_with_overrides</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -233,15 +233,15 @@ rest. (The selector is always just a single token.)
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">selector</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">selector</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">selector</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">selector</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">selector</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">selector</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">selector</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">selector</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">line</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP2_3_2_1" class="named-paragraph-link"><span class="named-paragraph">Apply the given tabulation line to the slots selected</span><span class="named-paragraph-number">2.3.2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"tabulation row doesn't consist of a selector and then text"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -290,7 +290,7 @@ and negative senses.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax">[0] == </span><span class="character-syntax">'a'</span><span class="plain-syntax">) </span><span class="identifier-syntax">active_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax">[0] == </span><span class="character-syntax">'p'</span><span class="plain-syntax">) </span><span class="identifier-syntax">active_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">active_set</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"tabulation row doesn't begin with 'a' or 'p'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Characters::isdigit</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">[</span><span class="identifier-syntax">at</span><span class="plain-syntax">])) { </span><span class="identifier-syntax">tense_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">[</span><span class="identifier-syntax">at</span><span class="plain-syntax">++]-</span><span class="character-syntax">'1'</span><span class="plain-syntax">; }</span>
@ -301,7 +301,7 @@ and negative senses.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax">[</span><span class="identifier-syntax">at</span><span class="plain-syntax">] != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"The selector here is: &lt;%w&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">tabulation</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"unrecognised selector in tabulation row"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
@ -355,11 +355,11 @@ participles and then chooses the tabulation <span class="extract"><span class="e
<span class="plain-syntax"> *</span><span class="identifier-syntax">aux_len</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; *</span><span class="identifier-syntax">avo_flag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; *</span><span class="identifier-syntax">niv_flag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Pattern match on the base text to decide which conjugation to use</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">instructions_nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">instructions_nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the instructions here failed to choose a conjugation"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP4_2" class="named-paragraph-link"><span class="named-paragraph">Process the conjugation and determine the tabulation</span><span class="named-paragraph-number">4.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tabulation_nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the conjugation here failed to choose a tabulation"</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">tabulation_nt</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -373,10 +373,10 @@ participles and then chooses the tabulation <span class="extract"><span class="e
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::as_array</span><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="constant-syntax">BASE_FORM_TYPE</span><span class="plain-syntax">]), &amp;</span><span class="identifier-syntax">base_text_words</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">base_text_word_count</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">instructions_nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">instructions_nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Try to match the base text against this production</span><span class="named-paragraph-number">4.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -410,7 +410,7 @@ infinitive" form is set to the part matched by <span class="extract"><span class
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, *</span><span class="identifier-syntax">last</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">len</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">malformed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) { </span><span class="identifier-syntax">last</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">len</span><span class="plain-syntax">++; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) { </span><span class="identifier-syntax">last</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">len</span><span class="plain-syntax">++; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">len</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">1</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">last</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="comment-syntax"> i.e., if we have not yet chosen a conjugation</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">failed_to_match</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">wildcard_from</span><span class="plain-syntax"> = -1;</span>
@ -425,7 +425,7 @@ infinitive" form is set to the part matched by <span class="extract"><span class
<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">malformed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">malformed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="constant-syntax">BASE_FORM_TYPE</span><span class="plain-syntax">], </span><span class="function-syntax">&lt;verb-conjugation-instructions&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="constant-syntax">BASE_FORM_TYPE</span><span class="plain-syntax">], </span><span class="function-syntax">&lt;verb-conjugation-instructions&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"malformed line"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-vc.html#SP4_1">&#167;4.1</a>.</li></ul>
@ -434,7 +434,7 @@ infinitive" form is set to the part matched by <span class="extract"><span class
<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">word_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">last</span><span class="plain-syntax">)); </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">; ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> != </span><span class="identifier-syntax">last</span><span class="plain-syntax">)); </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">word_count</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">base_text_word_count</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="3-vc.html#SP11" class="function-link"><span class="function-syntax">Conjugation::compare_ve_with_tails</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text_words</span><span class="plain-syntax">[</span><span class="identifier-syntax">word_count</span><span class="plain-syntax">], </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">)))</span>
@ -462,22 +462,22 @@ tokens.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</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">len</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">malformed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) </span><span class="identifier-syntax">len</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) </span><span class="identifier-syntax">len</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">len</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;auxiliary-verb-only&gt;</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;auxiliary-verb-only&gt;</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">avo_flag</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="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;not-instance-of-verb-at-run-time&gt;</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax"> == </span><span class="function-syntax">&lt;not-instance-of-verb-at-run-time&gt;</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">niv_flag</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">tabulation_nt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tabulation_nt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</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">malformed</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">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">:</span>
@ -486,7 +486,7 @@ tokens.
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">malformed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">malformed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="constant-syntax">BASE_FORM_TYPE</span><span class="plain-syntax">], </span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP12" class="function-link"><span class="function-syntax">Conjugation::error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="constant-syntax">BASE_FORM_TYPE</span><span class="plain-syntax">], </span><span class="identifier-syntax">conjugation_nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"malformed line"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -507,8 +507,8 @@ example:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">number_token</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content_token</span><span class="plain-syntax"> = </span><span class="identifier-syntax">number_token</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">number_token</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">content_token</span><span class="plain-syntax"> = </span><span class="identifier-syntax">number_token</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP8" class="function-link"><span class="function-syntax">Conjugation::ptoken_to_verb_form_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">number_token</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> &gt; *</span><span class="identifier-syntax">highest_form_written</span><span class="plain-syntax">) { *</span><span class="identifier-syntax">highest_form_written</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">; }</span>
@ -516,7 +516,7 @@ example:
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">] =</span>
<span class="plain-syntax"> </span><a href="2-tai.html#SP2" class="function-link"><span class="function-syntax">Inflections::apply_trie_to_wa</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="constant-syntax">BASE_FORM_TYPE</span><span class="plain-syntax">],</span>
<span class="plain-syntax"> </span><a href="2-np.html#SP7" class="function-link"><span class="function-syntax">Preform::Nonparsing::define_trie</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">content_token</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::define_trie</span><span class="plain-syntax">(</span><span class="identifier-syntax">content_token</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRIE_END</span><span class="plain-syntax">, </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">Linguistics::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nl</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">content_token</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">] =</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP6" class="function-link"><span class="function-syntax">Conjugation::expand_with_endings</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">content_token</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">verb_forms</span><span class="plain-syntax">);</span>
@ -560,7 +560,7 @@ a different verb's conjugation "lifting".
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">verb_form_to_lift</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">row</span><span class="plain-syntax">; </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">; </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">row</span><span class="plain-syntax">; </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">; </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP5_5" class="named-paragraph-link"><span class="named-paragraph">A plus-plus-digit indicates auxiliary modal usage</span><span class="named-paragraph-number">5.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">A form number followed by a bracketed verb lifts the relevant form</span><span class="named-paragraph-number">5.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-vc.html#SP5_4" class="named-paragraph-link"><span class="named-paragraph">A bracketed verb becomes a lift</span><span class="named-paragraph-number">5.4</span></a></span><span class="plain-syntax">;</span>
@ -600,13 +600,13 @@ make use of the same fancy features we're allowing here.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NONTERMINAL_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nt_pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> == </span><span class="identifier-syntax">person</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::join</span><span class="plain-syntax">(</span><span class="identifier-syntax">wa</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP5" class="function-link"><span class="function-syntax">Conjugation::merge</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP5" class="function-link"><span class="function-syntax">Conjugation::merge</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sense</span><span class="plain-syntax">, </span><span class="identifier-syntax">tense</span><span class="plain-syntax">, </span><span class="identifier-syntax">person</span><span class="plain-syntax">, </span><span class="identifier-syntax">num_ingredients</span><span class="plain-syntax">, </span><span class="identifier-syntax">ingredients</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
@ -632,7 +632,7 @@ on the next iteration.
<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">X</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP8" class="function-link"><span class="function-syntax">Conjugation::ptoken_to_verb_form_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">X</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><a href="3-vc.html#SP10" class="function-link"><span class="function-syntax">Conjugation::ptoken_as_bracket</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">X</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><a href="3-vc.html#SP10" class="function-link"><span class="function-syntax">Conjugation::ptoken_as_bracket</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_form_to_lift</span><span class="plain-syntax"> = </span><span class="identifier-syntax">X</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -660,12 +660,12 @@ of the numbered verb forms if we want it to.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-vc.html#SP10" class="function-link"><span class="function-syntax">Conjugation::ptoken_as_bracket</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">; </span><span class="comment-syntax"> move past open bracket</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">; </span><span class="comment-syntax"> move past open bracket</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> if there is a tense/sense indicator, use it, and move forward</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">S</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP9" class="function-link"><span class="function-syntax">Conjugation::ptoken_to_tense_indicator</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">S</span><span class="plain-syntax">) - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">T</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tense</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">T</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tense</span><span 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"> == -1) </span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">sense</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> extract the text of the infinitive</span>
@ -673,10 +673,10 @@ of the numbered verb forms if we want it to.
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">) &amp;&amp; (</span><a href="3-vc.html#SP10" class="function-link"><span class="function-syntax">Conjugation::ptoken_as_bracket</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">) != -1)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_lifted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::join</span><span class="plain-syntax">(</span><span class="identifier-syntax">verb_lifted</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP6" class="function-link"><span class="function-syntax">Conjugation::expand_with_endings</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">ve_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">ingredients</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">chunk</span><span class="plain-syntax"> = </span><span class="identifier-syntax">chunk</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">aux</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP15" class="function-link"><span class="function-syntax">Conjugation::find_by_infinitive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_lifted</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">aux</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::find_by_infinitive</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_lifted</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">aux</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">aux</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP2" class="function-link"><span class="function-syntax">Conjugation::conjugate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">verb_lifted</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">aux</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">"can't conjugate lifted verb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">verb_form_to_lift</span><span class="plain-syntax">) {</span>
@ -900,70 +900,16 @@ as <span class="extract"><span class="extract-syntax">pattern</span></span>.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Errors. </b>People are going to get their conjugations wrong; it's a very hard notation
to learn. No end users of Inform will ever write them at all &mdash; this is a
low-level feature for translators only &mdash; but translators need all the help
they can get, so we'll try to provide good problem messages.
</p>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Errors. </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">Conjugation::trie_definition_error</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Conjugation::trie_definition_error</span></span>:<br/>Non-Parsing Preform - <a href="2-np.html#SP7_1">&#167;7.1</a>, <a href="2-np.html#SP7_1_1">&#167;7.1.1</a>, <a href="2-np.html#SP7_1_1_1">&#167;7.1.1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</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><a href="3-vc.html#SP14" class="function-link"><span class="function-syntax">Conjugation::basic_problem_handler</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">(), </span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>And similarly:
</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">Conjugation::error</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Conjugation::error</span></span>:<br/><a href="3-vc.html#SP2_3_2">&#167;2.3.2</a>, <a href="3-vc.html#SP2_3_2_1_1">&#167;2.3.2.1.1</a>, <a href="3-vc.html#SP4">&#167;4</a>, <a href="3-vc.html#SP4_1_1">&#167;4.1.1</a>, <a href="3-vc.html#SP4_2">&#167;4.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Conjugation::error</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Conjugation::error</span></span>:<br/><a href="3-vc.html#SP2_3_2">&#167;2.3.2</a>, <a href="3-vc.html#SP2_3_2_1_1">&#167;2.3.2.1.1</a>, <a href="3-vc.html#SP4">&#167;4</a>, <a href="3-vc.html#SP4_1_1">&#167;4.1.1</a>, <a href="3-vc.html#SP4_2">&#167;4.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</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><a href="3-vc.html#SP14" class="function-link"><span class="function-syntax">Conjugation::basic_problem_handler</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PreformUtilities::error</span><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exit</span><span class="plain-syntax">(1);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>Some tools using this module will want to push simple error messages out to
the command line; others will want to translate them into elaborate problem
texts in HTML. So the client is allowed to define <span class="extract"><span class="extract-syntax">PROBLEM_SYNTAX_CALLBACK</span></span>
to some routine of her own, gazumping this one.
</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">Conjugation::basic_problem_handler</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Conjugation::basic_problem_handler</span></span>:<br/><a href="3-vc.html#SP12">&#167;12</a>, <a href="3-vc.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</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="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">INFLECTIONS_ERROR_HANDLER</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">INFLECTIONS_ERROR_HANDLER</span><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">INFLECTIONS_ERROR_HANDLER</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"The production at fault is:\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Instrumentation::log_production</span><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">); </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ERM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</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">ERM</span><span class="plain-syntax">, </span><span class="string-syntax">"(no nonterminal)"</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">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">ERM</span><span class="plain-syntax">, </span><span class="string-syntax">"nonterminal %w"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Vocabulary::get_exemplar</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">nonterminal_id</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">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">ERM</span><span class="plain-syntax">, </span><span class="string-syntax">": "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</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">ERM</span><span class="plain-syntax">, </span><span class="string-syntax">"can't conjugate verb '%A': "</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">base_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</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">TEMP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Instrumentation::write_ptoken</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="string-syntax">" "</span><span class="plain-syntax">);</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">ERM</span><span class="plain-syntax">, </span><span class="string-syntax">"line %d ('%S'): "</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">match_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEMP</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">TEMP</span><span class="plain-syntax">);</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">ERM</span><span class="plain-syntax">, </span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::with_text</span><span class="plain-syntax">(</span><span class="string-syntax">"Preform error: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">ERM</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">ERM</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="SP15"></a><b>&#167;15. Testing. </b>Similarly, the following helps translators by giving them unit tests for their
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. Testing. </b>Similarly, the following helps translators by giving them unit tests for their
conjugations:
</p>
@ -976,7 +922,7 @@ conjugations:
<span class="plain-syntax"> </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vc</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP2" class="function-link"><span class="function-syntax">Conjugation::conjugate</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="identifier-syntax">nl</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">vc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Failed test\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP15" class="function-link"><span class="function-syntax">Conjugation::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">vc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">vc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DESTROY</span><span class="plain-syntax">(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">, </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -1008,7 +954,7 @@ conjugations:
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Form passive as to be + %A\n"</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tabulations</span><span class="plain-syntax">[</span><span class="constant-syntax">PASSIVE_MOOD</span><span class="plain-syntax">].</span><span class="element-syntax">to_be_auxiliary</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="function-syntax">Conjugation::find_by_infinitive</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Conjugation::find_by_infinitive</span></span>:<br/><a href="3-vc.html#SP5_4">&#167;5.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">infinitive</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="function-syntax">Conjugation::find_by_infinitive</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Conjugation::find_by_infinitive</span></span>:<br/><a href="3-vc.html#SP5_4">&#167;5.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">infinitive</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">, </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WordAssemblages::compare</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">infinitive</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">infinitive</span><span class="plain-syntax">)))</span>
@ -1043,7 +989,7 @@ conjugations:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. </b>This is for testing English only; it helps with the test suite cases derived
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>This is for testing English only; it helps with the test suite cases derived
from our dictionary of 14,000 or so present and past participles.
</p>
@ -1052,7 +998,7 @@ from our dictionary of 14,000 or so present and past participles.
<span class="plain-syntax"> </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vc</span><span class="plain-syntax"> = </span><a href="3-vc.html#SP2" class="function-link"><span class="function-syntax">Conjugation::conjugate</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">vc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Failed test\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP16" class="function-link"><span class="function-syntax">Conjugation::write_participle</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">vc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-vc.html#SP14" class="function-link"><span class="function-syntax">Conjugation::write_participle</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">vc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DESTROY</span><span class="plain-syntax">(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">, </span><span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -1061,7 +1007,7 @@ from our dictionary of 14,000 or so present and past participles.
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">infinitive</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">present_participle</span><span class="plain-syntax">), &amp;(</span><span class="identifier-syntax">vc</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">past_participle</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </b>As noted above, these nonterminals have no parsing function, and are used only
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. </b>As noted above, these nonterminals have no parsing function, and are used only
as markers in verb conjugations.
</p>

View file

@ -76,11 +76,6 @@
<spon class="sectiontitle">Linguistic Definitions</span></a> -
<span class="sectionpurpose">Some basic linguistic constants are defined.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-np.html">
<spon class="sectiontitle">Non-Parsing Preform</span></a> -
<span class="sectionpurpose">Other uses for Preform grammar, including the generation of adaptive text, and word inflection.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-tai.html">
<spon class="sectiontitle">Tries and Inflections</span></a> -

View file

@ -180,12 +180,12 @@ function togglePopup(material_id) {
<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">++ &lt; </span><span class="constant-syntax">10</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"Verb %W --&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-vc.html#SP15" class="function-link"><span class="function-syntax">Conjugation::test</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">English_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-vc.html#SP13" class="function-link"><span class="function-syntax">Conjugation::test</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">English_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../../../inweb/docs/foundation-module/4-pm.html#SP14" class="function-link"><span class="function-syntax">Regexp::replace</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"%^"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"\n"</span><span class="plain-syntax">, </span><span class="constant-syntax">REP_REPEATING</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"%S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-vc.html#SP16" class="function-link"><span class="function-syntax">Conjugation::test_participle</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-vc.html#SP14" class="function-link"><span class="function-syntax">Conjugation::test_participle</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>

View file

@ -462,7 +462,7 @@ options open.
<span class="reserved-syntax">determiner</span><span class="plain-syntax"> *</span><span class="function-syntax">Quantifiers::det_new</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">Quantifiers::det_new</span></span>:<br/><a href="3-daq.html#SP18_1">&#167;18.1</a>, <a href="3-daq.html#SP18_2">&#167;18.2</a>, <a href="3-daq.html#SP18_3">&#167;18.3</a>, <a href="3-daq.html#SP18_4">&#167;18.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">not</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</span><span class="plain-syntax">, </span><span class="reserved-syntax">quantifier</span><span class="plain-syntax"> *</span><span class="identifier-syntax">quant</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">WordAssemblages::lit_0</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">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Preform::Nonparsing::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;determiner-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</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">wa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PreformUtilities::wording</span><span class="plain-syntax">(</span><span class="function-syntax">&lt;determiner-names&gt;</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">determiner</span><span class="plain-syntax"> *</span><span class="identifier-syntax">det</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">determiner</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">det</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_of_det</span><span class="plain-syntax"> = </span><span class="identifier-syntax">wa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">det</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">takes_number</span><span class="plain-syntax"> = </span><span class="identifier-syntax">num</span><span class="plain-syntax">;</span>

View file

@ -265,7 +265,7 @@ structure:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="function-syntax">Vocabulary::get_exemplar</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Vocabulary::get_exemplar</span></span>:<br/>Loading Preform - <a href="4-lp.html#SP16">&#167;16</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">raw</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="function-syntax">Vocabulary::get_exemplar</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Vocabulary::get_exemplar</span></span>:<br/>Loading Preform - <a href="4-lp.html#SP16">&#167;16</a><br/>Preform Utilities - <a href="4-pu.html#SP6_1_1_3">&#167;6.1.1.3</a>, <a href="4-pu.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">raw</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">raw</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">raw_exemplar</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">ve</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">exemplar</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -116,11 +116,11 @@ together from arbitrary vocabulary.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::lit_0</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::lit_0</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">WordAssemblages::lit_0</span></span>:<br/>Preform Utilities - <a href="4-pu.html#SP1">&#167;1</a>, <a href="4-pu.html#SP2">&#167;2</a>, <a href="4-pu.html#SP3">&#167;3</a>, <a href="4-pu.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-wa.html#SP3" class="function-link"><span class="function-syntax">WordAssemblages::new_assemblage</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::lit_1</span><span class="plain-syntax">(</span><span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve1</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::lit_1</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">WordAssemblages::lit_1</span></span>:<br/>Preform Utilities - <a href="4-pu.html#SP1">&#167;1</a>, <a href="4-pu.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ve1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><a href="2-wa.html#SP3" class="function-link"><span class="function-syntax">WordAssemblages::new_assemblage</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ve1</span><span class="plain-syntax">) </span><span class="identifier-syntax">wa</span><span class="plain-syntax">.</span><span class="element-syntax">indiv_words</span><span class="plain-syntax">[</span><span class="identifier-syntax">wa</span><span class="plain-syntax">.</span><span class="element-syntax">no_indiv_words</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">ve1</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">wa</span><span class="plain-syntax">;</span>
@ -130,7 +130,7 @@ together from arbitrary vocabulary.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::join</span><span class="plain-syntax">(</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa1</span><span class="plain-syntax">, </span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa2</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::join</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">WordAssemblages::join</span></span>:<br/>Preform Utilities - <a href="4-pu.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa1</span><span class="plain-syntax">, </span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wa1</span><span class="plain-syntax">.</span><span class="element-syntax">no_indiv_words</span><span class="plain-syntax"> + </span><span class="identifier-syntax">wa2</span><span class="plain-syntax">.</span><span class="identifier-syntax">no_indiv_words</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">MAX_WORDS_IN_ASSEMBLAGE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"assemblage overflow"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">sum</span><span class="plain-syntax"> = </span><a href="2-wa.html#SP3" class="function-link"><span class="function-syntax">WordAssemblages::new_assemblage</span></a><span class="plain-syntax">();</span>
@ -180,12 +180,12 @@ frequently, since it consumes memory:
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. Miscellaneous readings. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa1</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::nonempty</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">WordAssemblages::nonempty</span></span>:<br/>Preform Utilities - <a href="4-pu.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wa1</span><span class="plain-syntax">.</span><span class="element-syntax">no_indiv_words</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::writer</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">WordAssemblages::writer</span></span>:<br/>Words Module - <a href="1-wm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format_string</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vW</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::writer</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">WordAssemblages::writer</span></span>:<br/>Words Module - <a href="1-wm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format_string</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vW</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">vW</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wa</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;wa-&gt;</span><span class="element-syntax">no_indiv_words</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
@ -209,7 +209,7 @@ frequently, since it consumes memory:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><a href="3-wrd.html#SP8" class="function-link"><span class="function-syntax">Wordings::first_wn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::as_array</span><span class="plain-syntax">(</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> ***</span><span class="identifier-syntax">array</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">len</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::as_array</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">WordAssemblages::as_array</span></span>:<br/>Preform Utilities - <a href="4-pu.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> ***</span><span class="identifier-syntax">array</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">len</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">array</span><span class="plain-syntax"> = </span><span class="identifier-syntax">wa</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">indiv_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">len</span><span class="plain-syntax"> = </span><span class="identifier-syntax">wa</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_indiv_words</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -298,7 +298,7 @@ frequently, since it consumes memory:
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </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">WordAssemblages::log</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">WordAssemblages::log</span></span>:<br/>Words Module - <a href="1-wm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vwa</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">WordAssemblages::log</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">WordAssemblages::log</span></span>:<br/>Words Module - <a href="1-wm.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vwa</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">word_assemblage</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">vwa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wa</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;null-words&gt;"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">sp</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -12,11 +12,6 @@
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script src="http://code.jquery.com/jquery-1.12.4.min.js"
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
<script src="../docs-assets/Bigfoot.js"></script>
<link href="../docs-assets/Bigfoot.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
@ -64,9 +59,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">words</a></li><li><a href="index.html#4">Chapter 4: Parsing</a></li><li><b>About Preform</b></li></ul></div>
<p class="purpose">A brief guide to Preform and how to use it.</p>
<ul class="toc"><li><a href="4-ap.html#SP1">&#167;1. A Manual for Preform</a></li><li><a href="4-ap.html#SP10">&#167;10. Implementation notes</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. A Manual for Preform. </b>Preform is a meta-language for writing a simple grammar: it's in some sense
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>Preform is a meta-language for writing a simple grammar: it's in some sense
pre-Inform, because it defines the Inform language itself, and has to be read
by the <a href="index.html" class="internal">words</a> module (on behalf of Inform) before Inform can parse anything.
For example,
@ -200,54 +193,7 @@ with result 2.
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;race-jersey&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">yellow</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">polkadot</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">green</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">white</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>The material to the right of the <span class="extract"><span class="Preform-extract-syntax">==&gt;</span></span> is actually regular C code, and can
do more than simply evaluate one expression. For example, it can also set
the pointer result of the nonterminal; here, let's suppose, that will be a
pointer to a <span class="extract"><span class="Preform-extract-syntax">text_stream</span></span>.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;competitor&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">pacemaker</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> 1; *XP = I"unnumbered";</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;ordinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">runner</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; *XP = I"numbered";</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">runner</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">no</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; *XP = I"numbered";</span>
</pre>
<p class="commentary">It can also, if it wants to, kill off a line:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;competitor&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">pacemaker</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;ordinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">runner</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> 0; return FALSE;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">runner</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">no</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]</span>
</pre>
<p class="commentary">Here a match against <span class="extract"><span class="Preform-extract-syntax">&lt;ordinal-number&gt; runner</span></span> is forced to fail at the last
hurdle, just as it was about the succeed; it's as if the second row wasn't
there. (This is not useful unconditionally, but with an <span class="extract"><span class="Preform-extract-syntax">if</span></span> statement,
it can be.) More extremely:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;competitor&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">the</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">pacemaker</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> 1</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;ordinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">runner</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">runner</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">no</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]</span>
</pre>
<p class="commentary">causes any successful match against <span class="extract"><span class="Preform-extract-syntax">&lt;ordinal-number&gt; runner</span></span> not only to be
failed, but to prevent any tries against the rows below it. (This is useful
when issuing problem messages, or to put exceptional syntaxes into the grammar,
since it can make subsequent productions only available in some cases.)
</p>
<p class="commentary">Finally, returning <span class="extract"><span class="Preform-extract-syntax">FAIL_NONTERMINAL + Q</span></span>, where <span class="extract"><span class="Preform-extract-syntax">Q</span></span> is a number between 1
and, currently, 999, performs a fail but applies a "quantum" to the lookahead
going on when Preform is trying to work out what's happening in a difficult
production using the one being referred to. This allows us to nudge past
potential ambiguities; it's not done much in Inform, but see for example
<a href="../if-module/4-anl.html" class="internal">Action Name Lists (in if)</a>.
</p>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>As a convenient abbreviation, a slash character can be used to divide
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>As a convenient abbreviation, a slash character can be used to divide
alternative possibilities for a single word. For example:
</p>
@ -292,7 +238,7 @@ any word which is neither "cat" nor "dog".
be used to escape them. Thus <span class="extract"><span class="Preform-extract-syntax">\_green</span></span> actually matches <span class="extract"><span class="Preform-extract-syntax">_green</span></span>.
</p>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>So far, the only ingredients of Preform syntax have been nonterminals and
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>So far, the only ingredients of Preform syntax have been nonterminals and
fixed words, but Preform also has "wildcards". For example, in
</p>
@ -349,7 +295,7 @@ need not even be a wildcard inside the braces:
<p class="commentary">Once again, literal brace characters can be achieved using the <span class="extract"><span class="Preform-extract-syntax">\</span></span> escape.
</p>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>The alternative lines (or "productions", as they're called) in a regular
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>The alternative lines (or "productions", as they're called) in a regular
definition are normally given the internal numbers 0, 1, 2, 3... in the
order in which they appear. For example, in
</p>
@ -420,7 +366,7 @@ labelling runs <span class="extract"><span class="Preform-extract-syntax">/a/</s
..., <span class="extract"><span class="Preform-extract-syntax">/zz/</span></span>, thus allowing for up to 52 productions to be remapped in this way.
</p>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>A similar form if remapping is allowed with word ranges, using a special
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>A similar form if remapping is allowed with word ranges, using a special
notation. Suppose the Inform source contained:
</p>
@ -446,132 +392,24 @@ notation. Suppose the Inform source contained:
colour.
</p>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. Implementation notes. </b>Most organs of the human body are located in a single place &mdash; the heart, the
appendix, the brain &mdash; but others, like the blood vessels or the nervous
system, are distributed throughout. So also with compilers, but Inform is
unusual in having its syntax analyser be one of these distributed organs.
This was a choice, and it was made in the interests of clarity of the
Inform source code to readers.
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>Preform turns out to be a useful notation for patterns of wording, and can
be put to other uses besides parsing source text. For these other uses, see
<a href="4-pu.html" class="internal">Preform Utilities</a>. Specifically, and in rough order of complexity:
</p>
<p class="commentary">In any case, it is only the Preform grammar and the connections to it &mdash;
compositor functions, calls to single named nonterminals, and so on &mdash; which
are dispersed throughout the body of Inform. The code to manage, internally
store and parse against Preform is all here in <a href="index.html" class="internal">words</a>, and the code to
represent the meaning of the result makes up <a href="../syntax-module/index.html" class="internal">syntax</a>.
</p>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>The Preform parser which occupies the entire <a href="4-prf.html" class="internal">Preform</a> section is a
complex or even ingenious algorithm, which is always suspect. The main points
of difficulty are:
</p>
<ul class="items"><li>(a) The grammar must not be hard-coded since users need to change it, for
translation or other purposes, so it has to be read in from a file. But it
must also be explicitly referred to in the Inform source code. This is achieved
with a sort of symbiotic relationship between the Inform source code and the
pre-processor for it in <a href="../../../inweb/docs/index.html" class="internal">inweb</a>, which takes action at compile time to
build the syntax file <span class="extract"><span class="Preform-extract-syntax">Syntax.preform</span></span> read in, by default, at run time. The
arrangement works well in practice, but needs careful explanation. See
<a href="4-lp.html" class="internal">Loading Preform</a> for how <span class="extract"><span class="Preform-extract-syntax">Syntax.preform</span></span> is read in.
</li><li>(b) The Preform parser has two design goals: to avoid unpredictable spikes on
time or memory when given very long texts to match, and to be as simple as it
can be, consistent with consuming, in aggregate, no more than 5-10% of the
compiler's running time. It is a non-goal to be a fully general natural
language parser &mdash; if it can cope with Inform's needs, then that is enough.
<ul class="items"><li>&#9679; Specifying text being generated by Inform &mdash; see <a href="4-pu.html#SP1" class="internal">PreformUtilities::merge</a>.
</li><li>&#9679; Specifying replacements of one set of words by another &mdash; see
<a href="4-pu.html#SP4" class="internal">PreformUtilities::find_corresponding_word</a>.
</li><li>&#9679; Specifying miscellaneous entries for the lexicon in the Inform index &mdash; see
<a href="4-pu.html#SP5" class="internal">PreformUtilities::enter_lexicon</a>.
</li><li>&#9679; Saying how to build a trie which will detect patterns in a single word and
then modify it &mdash; see <a href="4-pu.html#SP6" class="internal">PreformUtilities::define_trie</a>.
</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>So, then, <a href="4-lp.html#SP1" class="internal">LoadPreform::load</a> loads the Preform grammar for a given
natural language from a file. This becomes a collection of <a href="4-nnt.html#SP5" class="internal">nonterminal</a>
objects, each of which is either "internal" or "regular". Regular NTs have
a list of <a href="4-lp.html#SP8" class="internal">production_list</a> objects, one for each natural language in
which they are defined. (The same NT can have one definition in English and
another in, say, French.)
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>Finally, syntax errors in Preform are reported by <a href="4-pu.html#SP8" class="internal">PreformUtilities::production_error</a>.
</p>
<p class="commentary">What production lists list is <a href="4-lp.html#SP11" class="internal">production</a> objects, and each of those is
in turn a list of <a href="4-lp.html#SP12" class="internal">ptoken</a> objects.<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> These can also be marked as
negated or can have alternatives supplied. Ptokens come in three varieties:
fixed words, uses of other nonterminals, and wildcards.
</p>
<p class="commentary">For example,
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;product-specification&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">weight</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">kg</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">height</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">cm</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">colour/color</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span>
</pre>
<p class="commentary">would be read into objects in memory as follows:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="element-syntax">nonterminal</span><span class="plain-syntax"> </span><span class="function-syntax">REGULAR</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">production_list</span><span class="plain-syntax"> </span><span class="element-syntax">for</span><span class="plain-syntax"> </span><span class="element-syntax">its</span><span class="plain-syntax"> </span><span class="element-syntax">English</span><span class="plain-syntax"> </span><span class="element-syntax">definition</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">production</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">FIXED</span><span class="plain-syntax"> </span><span class="function-syntax">WORD</span><span class="plain-syntax"> </span><span class="element-syntax">weight</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">USAGE</span><span class="plain-syntax"> &lt;</span><span class="element-syntax">cardinal</span><span class="plain-syntax">-</span><span class="element-syntax">number</span><span class="plain-syntax">&gt;</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">FIXED</span><span class="plain-syntax"> </span><span class="function-syntax">WORD</span><span class="plain-syntax"> </span><span class="element-syntax">kg</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">production</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">FIXED</span><span class="plain-syntax"> </span><span class="function-syntax">WORD</span><span class="plain-syntax"> </span><span class="element-syntax">height</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">USAGE</span><span class="plain-syntax"> &lt;</span><span class="element-syntax">cardinal</span><span class="plain-syntax">-</span><span class="element-syntax">number</span><span class="plain-syntax">&gt;</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">FIXED</span><span class="plain-syntax"> </span><span class="function-syntax">WORD</span><span class="plain-syntax"> </span><span class="element-syntax">cm</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">production</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">FIXED</span><span class="plain-syntax"> </span><span class="function-syntax">WORD</span><span class="plain-syntax"> </span><span class="element-syntax">colour</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">FIXED</span><span class="plain-syntax"> </span><span class="function-syntax">WORD</span><span class="plain-syntax"> </span><span class="element-syntax">color</span>
<span class="plain-syntax"> -&gt; </span><span class="element-syntax">ptoken</span><span class="plain-syntax"> </span><span class="function-syntax">WILDCARD</span><span class="plain-syntax"> ...</span>
</pre>
<p class="commentary">The above grammar fell under the English production list because that was
the current language when it was read in. The current language can be
changed, e.g.,
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">language</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">French</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;product-specification&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">poids</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">kg</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">hauteur</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">cm</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">couleur</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">language</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">English</span>
</pre>
<p class="commentary">changes the language to French, supplies a French version, then changes back
to English. There would then be two production lists for &lt;product-specification&gt;.
</p>
<ul class="footnotetexts"><li class="footnote" id="fn:1"><p class="inwebfootnote"><sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> The "p" is silent.
<a href="#fnref:1" title="return to text"> &#x21A9;</a></p></li></ul>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>The most technically difficult code occurs in <a href="4-to.html" class="internal">The Optimiser</a>, which
precomputes &mdash;
</p>
<ul class="items"><li>&#9679; <a href="4-le.html" class="internal">Length Extremes</a> to constrain the number of words in any match;
</li><li>&#9679; <a href="4-ni.html" class="internal">Nonterminal Incidences</a> to constrain the type of words in any match;
</li><li>&#9679; "positions" of tokens and "struts" (runs of dividing words) inside productions.
</li></ul>
<p class="commentary">These are all devices to enable non-matching text to be rejected quickly.
For example, "fox" cannot match <span class="extract"><span class="Preform-extract-syntax">&lt;s-literal&gt; &lt;s-instance-name&gt;</span></span> because it
is too short (such a match would need at least two words), and "the fox"
cannot match <span class="extract"><span class="Preform-extract-syntax">&lt;s-adjective&gt; &lt;s-nounphrase&gt;</span></span> because it does not contain any
words which are in some contexts adjectives.
</p>
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>It will be evident that Inform doesn't use parser-generators such as <span class="extract"><span class="Preform-extract-syntax">yacc</span></span>,
<span class="extract"><span class="Preform-extract-syntax">bison</span></span> or <span class="extract"><span class="Preform-extract-syntax">antlr</span></span>. One reason is that they need the grammar to be fixed and
known at (the compiler's) compile time. Then, too, folk wisdom has it that
<span class="extract"><span class="Preform-extract-syntax">yacc</span></span> parsers are typically half as fast as a shrewdly hand-coded equivalent.<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>
In any case the elegant theory of LALR parsing, though ideal for token-based
programming languages, does not specify natural language well.<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup>
</p>
<ul class="footnotetexts"><li class="footnote" id="fn:2"><p class="inwebfootnote"><sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> The <span class="extract"><span class="Preform-extract-syntax">gcc</span></span> C compiler abandoned the use of <span class="extract"><span class="Preform-extract-syntax">bison</span></span> for exactly this reason.
<a href="#fnref:2" title="return to text"> &#x21A9;</a></p></li><li class="footnote" id="fn:3"><p class="inwebfootnote"><sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> Which is perhaps ironic, considering that the relevant computer science
was strongly influenced by generative linguistics.
<a href="#fnref:3" title="return to text"> &#x21A9;</a></p></li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-idn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">ap</li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-nnt.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-idn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">ap</li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-nnt.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -183,7 +183,7 @@ of text <span class="extract"><span class="Preform-extract-syntax">""</span></sp
</pre>
<ul class="endnotetexts"><li>This is <a href="4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-prf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresscurrent">bn</li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-ins.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-prf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresscurrent">bn</li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-ins.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -189,8 +189,8 @@ matches it.)
<span class="plain-syntax"> </span><a href="4-ins.html#SP9" class="function-link"><span class="function-syntax">Instrumentation::log_extremes</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">nt_extremes</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-ins.html#SP10" class="function-link"><span class="function-syntax">Instrumentation::log_production_list</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="identifier-syntax">detailed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_OUTDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -241,7 +241,7 @@ matches it.)
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Instrumentation::log_production_list</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Instrumentation::log_production_list</span></span>:<br/><a href="4-ins.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">detailed</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%J:\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">definition_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG_INDENT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-ins.html#SP11" class="function-link"><span class="function-syntax">Instrumentation::log_production</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="identifier-syntax">detailed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ins</span><span class="plain-syntax">.</span><span class="element-syntax">production_tries</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
@ -262,9 +262,9 @@ matches it.)
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </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">Instrumentation::log_production</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Instrumentation::log_production</span></span>:<br/><a href="4-ins.html#SP10">&#167;10</a><br/>Preform - <a href="4-prf.html#SP1_3_2_1_1">&#167;1.3.2.1.1</a>, <a href="4-prf.html#SP1_3_2_1_2">&#167;1.3.2.1.2</a>, <a href="4-prf.html#SP1_3_2_1_3">&#167;1.3.2.1.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">detailed</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;empty-production&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Instrumentation::log_production</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Instrumentation::log_production</span></span>:<br/><a href="4-ins.html#SP10">&#167;10</a><br/>Preform - <a href="4-prf.html#SP1_3_2_1_1">&#167;1.3.2.1.1</a>, <a href="4-prf.html#SP1_3_2_1_2">&#167;1.3.2.1.2</a>, <a href="4-prf.html#SP1_3_2_1_3">&#167;1.3.2.1.3</a><br/>Preform Utilities - <a href="4-pu.html#SP6_1">&#167;6.1</a>, <a href="4-pu.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">detailed</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;empty-production&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-ins.html#SP12" class="function-link"><span class="function-syntax">Instrumentation::log_ptoken</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">detailed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">" "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -301,7 +301,7 @@ matches it.)
</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">Instrumentation::write_ptoken</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Instrumentation::write_ptoken</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Instrumentation::write_ptoken</span></span>:<br/>Preform Utilities - <a href="4-pu.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">disallow_unexpected_upper</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"_"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">negated_ptoken</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"^"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">range_starts</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"{"</span><span class="plain-syntax">);</span>
@ -317,7 +317,7 @@ matches it.)
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-bn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresscurrent">ins</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-bn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresscurrent">ins</li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-pu.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -164,8 +164,8 @@ minimum match lengths of its tokens.
<span class="reserved-syntax">length_extremes</span><span class="plain-syntax"> </span><span class="function-syntax">LengthExtremes::calculate_for_nt</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">LengthExtremes::calculate_for_nt</span></span>:<br/>The Optimiser - <a href="4-to.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">length_extremes</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="4-le.html#SP4" class="function-link"><span class="function-syntax">LengthExtremes::no_words_at_all</span></a><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">first</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_extremes</span><span class="plain-syntax"> = </span><a href="4-le.html#SP8" class="function-link"><span class="function-syntax">LengthExtremes::calculate_for_pr</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first</span><span class="plain-syntax">) { </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_extremes</span><span class="plain-syntax">; </span><span class="identifier-syntax">first</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="4-le.html#SP7" class="function-link"><span class="function-syntax">LengthExtremes::union</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_extremes</span><span class="plain-syntax">); }</span>
@ -175,7 +175,7 @@ minimum match lengths of its tokens.
<span class="reserved-syntax">length_extremes</span><span class="plain-syntax"> </span><span class="function-syntax">LengthExtremes::calculate_for_pr</span><span class="plain-syntax">(</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">length_extremes</span><span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="4-le.html#SP4" class="function-link"><span class="function-syntax">LengthExtremes::no_words_at_all</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><a href="4-le.html#SP6" class="function-link"><span class="function-syntax">LengthExtremes::concatenate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><a href="4-le.html#SP9" class="function-link"><span class="function-syntax">LengthExtremes::calculate_for_pt</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</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">E</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -208,7 +208,7 @@ infinity.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-to.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresscurrent">le</li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-ni.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-to.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresscurrent">le</li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-ni.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -193,8 +193,8 @@ has already removed any such.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-lp.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Parse an internal nonterminal declaration</span><span class="named-paragraph-number">7.2</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="3-wrd.html#SP8" class="function-link"><span class="function-syntax">Wordings::last_wn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">) &gt;= </span><span class="identifier-syntax">wn</span><span class="plain-syntax">+2) &amp;&amp; (</span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">+1) == </span><span class="identifier-syntax">COLONCOLONEQUALS_V</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-lp.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Parse a regular nonterminal declaration</span><span class="named-paragraph-number">7.3</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"syntax error in Preform declarations"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><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="string-syntax">"syntax error in Preform declarations"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="4-to.html#SP7" class="function-link"><span class="function-syntax">Optimiser::optimise_counts</span></a><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">declarations</span><span class="plain-syntax">;</span>
@ -215,7 +215,8 @@ has already removed any such.
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Missing: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to define for missing language"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><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="string-syntax">"tried to define for missing language"</span><span class="plain-syntax">);</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">lname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_natural_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nl</span><span class="plain-syntax">;</span>
@ -230,8 +231,9 @@ has already removed any such.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><a href="4-nnt.html#SP8" class="function-link"><span class="function-syntax">Nonterminals::find</span></a><span class="plain-syntax">(</span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"nonterminal internal in one definition and regular in another"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"nonterminal internal in one definition and regular in another"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">marked_internal</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">wn</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">declarations</span><span class="plain-syntax">++;</span>
@ -254,7 +256,8 @@ and could be rejected as such, but it does no harm.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax"> = </span><a href="4-nnt.html#SP8" class="function-link"><span class="function-syntax">Nonterminals::find</span></a><span class="plain-syntax">(</span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">marked_internal</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"nonterminal internal in one definition and regular in another"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"nonterminal internal in one definition and regular in another"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><a href="4-lp.html#SP9" class="function-link"><span class="function-syntax">LoadPreform::find_list_for_language</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_natural_language</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax"> += </span><span class="constant-syntax">2</span><span class="plain-syntax">; </span><span class="comment-syntax"> advance past the ID word and the </span><span class="extract"><span class="extract-syntax">::=</span></span><span class="comment-syntax"> word</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
@ -287,26 +290,26 @@ independent <a href="4-lp.html#SP8" class="internal">production_list</a> object.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">definition_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax">; </span><span class="comment-syntax"> in the list of PLs for a NT</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_production</span><span class="plain-syntax">; </span><span class="comment-syntax"> start of linked list of productions</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax">; </span><span class="comment-syntax"> in the list of PLs for a NT</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">; </span><span class="comment-syntax"> start of linked list of productions</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">as_avinue</span><span class="plain-syntax">; </span><span class="comment-syntax"> when compiled to a trie rather than for Preform</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">production_list</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure production_list is accessed in 4/to, 4/le, 4/ni, 4/prf, 4/ins and here.</li></ul>
<ul class="endnotetexts"><li>The structure production_list is accessed in 4/to, 4/le, 4/ni, 4/prf, 4/ins, 4/pu and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="function-syntax">LoadPreform::find_list_for_language</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">LoadPreform::find_list_for_language</span></span>:<br/><a href="4-lp.html#SP7_3">&#167;7.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">definition_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">L</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">production_list</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">definition_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_avinue</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-lp.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Place the new production list within the nonterminal</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -317,11 +320,11 @@ independent <a href="4-lp.html#SP8" class="internal">production_list</a> object.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_production_list</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">p</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">)) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production_list</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_pl</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">p</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">)) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-lp.html#SP9">&#167;9</a>.</li></ul>
@ -333,11 +336,11 @@ to minimise overhead.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LoadPreform::add_production</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">LoadPreform::add_production</span></span>:<br/><a href="4-lp.html#SP7_3">&#167;7.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</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">p</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">)) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_production</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</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">p</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">)) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
@ -365,7 +368,7 @@ only confuses the picture here.
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="comment-syntax"> the linked list of ptokens</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_pt</span><span class="plain-syntax">; </span><span class="comment-syntax"> the linked list of ptokens</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">match_number</span><span class="plain-syntax">; </span><span class="comment-syntax"> 0 for </span><span class="extract"><span class="extract-syntax">/a/</span></span><span class="comment-syntax">, 1 for </span><span class="extract"><span class="extract-syntax">/b/</span></span><span class="comment-syntax"> and so on: see </span><a href="4-ap.html" class="internal">About Preform</a>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_ranges</span><span class="plain-syntax">; </span><span class="comment-syntax"> actually one more, since range 0 is reserved</span>
@ -373,11 +376,11 @@ only confuses the picture here.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_optimisation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">opt</span><span class="plain-syntax">; </span><span class="comment-syntax"> see </span><a href="4-to.html" class="internal">The Optimiser</a>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_instrumentation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">ins</span><span class="plain-syntax">; </span><span class="comment-syntax"> see </span><a href="4-ins.html" class="internal">Instrumentation</a>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_production</span><span class="plain-syntax">; </span><span class="comment-syntax"> within its production list</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_pr</span><span class="plain-syntax">; </span><span class="comment-syntax"> within its production list</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">production</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure production is accessed in 4/nnt, 4/to, 4/le, 4/ni, 4/prf, 4/ins and here.</li></ul>
<ul class="endnotetexts"><li>The structure production is accessed in 4/nnt, 4/to, 4/le, 4/ni, 4/prf, 4/ins, 4/pu and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>And at the bottom of God's great chain, the lowly ptoken. Even this can spawn
another list, though: the token <span class="extract"><span class="extract-syntax">fried/green/tomatoes</span></span> is a list of three ptokens
joined by the <span class="extract"><span class="extract-syntax">alternative_ptoken</span></span> links.
@ -415,11 +418,11 @@ the <span class="extract"><span class="extract-syntax">balanced_wildcard</span><
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ptoken_optimisation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">opt</span><span class="plain-syntax">; </span><span class="comment-syntax"> see </span><a href="4-to.html" class="internal">The Optimiser</a>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ptoken_instrumentation_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">ins</span><span class="plain-syntax">; </span><span class="comment-syntax"> see </span><a href="4-ins.html" class="internal">Instrumentation</a>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_ptoken</span><span class="plain-syntax">; </span><span class="comment-syntax"> within its production list</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_pt</span><span class="plain-syntax">; </span><span class="comment-syntax"> within its production list</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure ptoken is accessed in 4/nnt, 4/to, 4/le, 4/ni, 4/prf, 4/ins and here.</li></ul>
<ul class="endnotetexts"><li>The structure ptoken is accessed in 4/nnt, 4/to, 4/le, 4/ni, 4/prf, 4/ins, 4/pu and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>Each ptoken has a <span class="extract"><span class="extract-syntax">range_starts</span></span> and <span class="extract"><span class="extract-syntax">range_ends</span></span> number. This is either -1,
or marks that the ptoken occurs as the first or last in a range (or both). For
example, in the production
@ -442,7 +445,7 @@ and so on.
<span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="function-syntax">LoadPreform::new_production</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">LoadPreform::new_production</span></span>:<br/><a href="4-lp.html#SP7_3">&#167;7.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">production</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">match_number</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pc</span><span class="plain-syntax">; </span><span class="comment-syntax"> "production count": 0 for first in defn, and so on</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_ranges</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="comment-syntax"> so that they count from 1; range 0 is unused</span>
@ -451,7 +454,7 @@ and so on.
<span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">head</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">tail</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-lp.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">Parse the row of production tokens into a linked list of ptokens</span><span class="named-paragraph-number">14.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">head</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">head</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">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -532,8 +535,11 @@ than the next number counting upwards; see <a href="4-ap.html" class="internal">
<span class="plain-syntax"> </span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> = </span><a href="2-vcb.html#SP8" class="function-link"><span class="function-syntax">Vocabulary::get_literal_number_value</span></a><span class="plain-syntax">(</span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">+2));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> += </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_RANGES_PER_PRODUCTION</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"range number out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_RANGES_PER_PRODUCTION</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"range number out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bracing_begins_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">range_starts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rnum</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tail</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">range_ends</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rnum</span><span class="plain-syntax">;</span>
</pre>
@ -555,8 +561,11 @@ than the next number counting upwards; see <a href="4-ap.html" class="internal">
<span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-syntax">MULTIPLE_WILDCARD_PTC</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-syntax">POSSIBLY_EMPTY_WILDCARD_PTC</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">rnum</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_ranges</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_RANGES_PER_PRODUCTION</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"range number out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_RANGES_PER_PRODUCTION</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"range number out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rnum</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">range_starts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rnum</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">range_ends</span><span class="plain-syntax"> = </span><span class="identifier-syntax">rnum</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -580,14 +589,21 @@ rather than the next number counting upwards; see <a href="4-ap.html" class="int
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">i</span><span class="plain-syntax">+2 &lt;= </span><a href="3-wrd.html#SP8" class="function-link"><span class="function-syntax">Wordings::last_wn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) &amp;&amp; (</span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">+1) == </span><span class="identifier-syntax">QUESTIONMARK_V</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="2-vcb.html#SP10" class="function-link"><span class="function-syntax">Vocabulary::test_flags</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">+2, </span><span class="constant-syntax">NUMBER_MC</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> = </span><a href="2-vcb.html#SP8" class="function-link"><span class="function-syntax">Vocabulary::get_literal_number_value</span></a><span class="plain-syntax">(</span><a href="3-lxr.html#SP20" class="function-link"><span class="function-syntax">Lexer::word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">+2));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_RESULTS_PER_PRODUCTION</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"result number out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_RESULTS_PER_PRODUCTION</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"result number out of range"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> += </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">result_index</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result_count</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result_count</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too many nonterminals for one production to hold"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"too many nonterminals for one production to hold"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-lp.html#SP14_1">&#167;14.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP14_1_4"></a><b>&#167;14.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add the new ptoken to the production</span><span class="named-paragraph-number">14.1.4</span></span><span class="comment-syntax"> =</span>
@ -595,9 +611,12 @@ rather than the next number counting upwards; see <a href="4-ap.html" class="int
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">token_count</span><span class="plain-syntax">++ &lt; </span><span class="constant-syntax">MAX_PTOKENS_PER_PRODUCTION</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">head</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">head</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">tail</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">head</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">head</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">tail</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tail</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"too many tokens on production for nonterminal"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="4-pu.html#SP8" class="function-link"><span class="function-syntax">PreformUtilities::production_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"too many tokens on production for nonterminal"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-lp.html#SP14_1">&#167;14.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. </b>Here we porse what is, to the Lexer, a single word (at word number <span class="extract"><span class="extract-syntax">wn</span></span>),
@ -702,7 +721,7 @@ becomes a fixed word; otherwise it could be any of the five categories.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ptoken_category</span><span class="plain-syntax"> = </span><span class="constant-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">balanced_wildcard</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -750,7 +769,7 @@ never returns <span class="extract"><span class="extract-syntax">NULL</span></sp
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-lp.html#SP16">&#167;16</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-nnt.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresscurrent">lp</li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-to.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-nnt.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresscurrent">lp</li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-to.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -597,9 +597,9 @@ So we give <span class="extract"><span class="extract-syntax">ntic</span></span>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">NTI::simplify_nt</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">NTI::simplify_nt</span></span>:<br/>The Optimiser - <a href="4-to.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">nti_constraint</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prev_req</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="4-ni.html#SP23" class="function-link"><span class="function-syntax">NTI::simplify_pair</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_ntic</span><span class="plain-syntax">), </span><span class="identifier-syntax">prev_req</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">prev_req</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr_ntic</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -620,9 +620,9 @@ So we give <span class="extract"><span class="extract-syntax">ntic</span></span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">negated_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">alt</span><span class="plain-syntax">; </span><span class="identifier-syntax">alt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">alt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">alternative_ptoken</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-ni.html#SP3" class="function-link"><span class="function-syntax">NTI::mark_vocabulary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">alt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ve_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
@ -636,13 +636,13 @@ So we give <span class="extract"><span class="extract-syntax">ntic</span></span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">nti_constraint</span><span class="plain-syntax"> </span><span class="identifier-syntax">nnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="identifier-syntax">nt_ntic</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">first_production</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</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">first_pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ni.html#SP25_2_1" class="named-paragraph-link"><span class="named-paragraph">Calculate requirement for production</span><span class="named-paragraph-number">25.2.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">first_production</span><span class="plain-syntax">) </span><span class="identifier-syntax">nnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_ntic</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first_pr</span><span class="plain-syntax">) </span><span class="identifier-syntax">nnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_ntic</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-ni.html#SP17" class="function-link"><span class="function-syntax">NTI::disjoin_rreq</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">nnt</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">pr_ntic</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">first_production</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">first_pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">nt_ntic</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nnt</span><span class="plain-syntax">;</span>
@ -658,7 +658,7 @@ ptokens.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">nti_constraint</span><span class="plain-syntax"> </span><span class="identifier-syntax">prt</span><span class="plain-syntax"> = </span><a href="4-ni.html#SP9" class="function-link"><span class="function-syntax">NTI::unconstrained</span></a><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">first</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</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">empty</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">nti_constraint</span><span class="plain-syntax"> </span><span class="identifier-syntax">tok_ntic</span><span class="plain-syntax"> = </span><a href="4-ni.html#SP9" class="function-link"><span class="function-syntax">NTI::unconstrained</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-ni.html#SP25_2_1_1" class="named-paragraph-link"><span class="named-paragraph">Calculate requirement for ptoken</span><span class="named-paragraph-number">25.2.1.1</span></a></span><span class="plain-syntax">;</span>
@ -781,7 +781,7 @@ following functions.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-le.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresscurrent">ni</li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-prf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-le.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresscurrent">ni</li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-prf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -199,7 +199,7 @@ textual name is referred to as an "ID".
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">voracious</span><span class="plain-syntax">; </span><span class="comment-syntax"> if true, scans whole rest of word range</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> For regular nonterminals</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="comment-syntax"> if not internal, this defines it</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_pl</span><span class="plain-syntax">; </span><span class="comment-syntax"> if not internal, this defines it</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">compositor_fn</span><span class="plain-syntax">)(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">r</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> **</span><span class="identifier-syntax">rp</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i_s</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> **</span><span class="identifier-syntax">i_ps</span><span class="plain-syntax">, </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">i_W</span><span class="plain-syntax">, </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">multiplicitous</span><span class="plain-syntax">; </span><span class="comment-syntax"> if true, matches are alternative syntax tree readings</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number_words_by_production</span><span class="plain-syntax">; </span><span class="comment-syntax"> this parses names for numbers, like "huit" or "zwei"</span>
@ -214,7 +214,7 @@ textual name is referred to as an "ID".
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure nonterminal is accessed in 4/lp, 4/to, 4/le, 4/ni, 4/prf, 4/ins and here.</li></ul>
<ul class="endnotetexts"><li>The structure nonterminal is accessed in 4/lp, 4/to, 4/le, 4/ni, 4/prf, 4/ins, 4/pu and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>A few notes on this are in order:
</p>
@ -269,7 +269,7 @@ when Preform grammar is parsed, not when Inform text is parsed.
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">internal_definition</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">voracious</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">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">compositor_fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">multiplicitous</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">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">number_words_by_production</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="comment-syntax"> i.e., don't</span>
@ -368,7 +368,7 @@ is read as part of a production with match number <span class="extract"><span cl
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-ap.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresscurrent">nnt</li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-lp.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-ap.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresscurrent">nnt</li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-lp.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -211,11 +211,11 @@ an internal NT, or try all possible productions for a regular one.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">unoptimised</span><span class="plain-syntax">) || (</span><a href="4-ni.html#SP8" class="function-link"><span class="function-syntax">NTI::nt_bitmap_violates</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">nt_ntic</span><span class="plain-syntax">)) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">acc_result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">definition_language</span><span 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_Preform_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">primary_Preform_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</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">ditto_result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-prf.html#SP1_3_2_1" class="named-paragraph-link"><span class="named-paragraph">Try to match to a production</span><span class="named-paragraph-number">1.3.2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -462,7 +462,7 @@ are in those positions.
<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">wn</span><span class="plain-syntax"> = -1, </span><span class="identifier-syntax">tc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">, </span><span class="identifier-syntax">tc</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">tc</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">ptoken_is_fast</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">p</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">ptoken_position</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">wn</span><span class="plain-syntax"> = </span><a href="3-wrd.html#SP8" class="function-link"><span class="function-syntax">Wordings::first_wn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)+</span><span class="identifier-syntax">p</span><span class="plain-syntax">-1;</span>
@ -581,13 +581,13 @@ ptokens.
<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><a href="3-wrd.html#SP8" class="function-link"><span class="function-syntax">Wordings::first_wn</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="identifier-syntax">tc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, *</span><span class="identifier-syntax">nextpt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">backtrack_token</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">backtrack_token</span><span class="plain-syntax">; </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">backtrack_token</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">backtrack_token</span><span class="plain-syntax">; </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">backtrack_token</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tc</span><span class="plain-syntax"> = </span><span class="identifier-syntax">backtrack_tc</span><span class="plain-syntax">; </span><span class="identifier-syntax">wn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">backtrack_to</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">goto</span><span class="plain-syntax"> </span><span class="identifier-syntax">Reenter</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">, </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">tc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">tc</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">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">tc</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax">, </span><span class="identifier-syntax">nextpt</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">)?(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">tc</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Reenter:</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">known_pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">checked</span><span class="plain-syntax">[</span><span class="identifier-syntax">tc</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">known_pos</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
@ -789,7 +789,7 @@ last word in the input text.
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">last_legal_position</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</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">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">from</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">start</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">start</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-prf.html#SP3" class="function-link"><span class="function-syntax">Preform::parse_fixed_word_ptoken</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">pt</span><span class="plain-syntax">)) </span><span class="identifier-syntax">pos</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
@ -824,7 +824,7 @@ last word in the input text.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-ni.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresscurrent">prf</li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-bn.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-ni.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresssection"><a href="4-to.html">to</a></li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresscurrent">prf</li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-bn.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -224,8 +224,8 @@ there are only finitely many NTs and hangs are therefore impossible.
<span class="plain-syntax"> </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">optimised_in_this_pass</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">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">nt_extremes</span><span class="plain-syntax"> = </span><a href="4-le.html#SP8" class="function-link"><span class="function-syntax">LengthExtremes::calculate_for_nt</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production_list</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production_list</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_production</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_production</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax">; </span><span class="identifier-syntax">pl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pl</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">production</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pr</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-to.html#SP8" class="function-link"><span class="function-syntax">Optimiser::optimise_production</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-ni.html#SP25" class="function-link"><span class="function-syntax">NTI::calculate_constraint</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -260,7 +260,7 @@ starts and finishes; it's not enough just to know where it starts.
<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">posn</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">last</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</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><a href="4-to.html#SP9" class="function-link"><span class="function-syntax">Optimiser::ptoken_width</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">posn</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> != </span><span class="constant-syntax">PTOKEN_ELASTIC</span><span class="plain-syntax">)) {</span>
@ -297,8 +297,8 @@ production, but this is never larger than about 10.
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prevt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prevt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">prevt</span><span class="plain-syntax">; </span><span class="identifier-syntax">prevt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prevt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prevt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prevt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">prevt</span><span class="plain-syntax">; </span><span class="identifier-syntax">prevt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prevt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prevt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">pt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prevt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -315,7 +315,7 @@ position then all of them have, but we're in no hurry so we don't exploit that.)
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">no_struts</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">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">ptoken_position</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="4-to.html#SP9" class="function-link"><span class="function-syntax">Optimiser::ptoken_width</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">) != </span><span class="constant-syntax">PTOKEN_ELASTIC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">no_struts</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_STRUTS_PER_PRODUCTION</span><span class="plain-syntax">) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
@ -325,8 +325,8 @@ position then all of them have, but we're in no hurry so we don't exploit that.)
<span class="plain-syntax"> (</span><a href="4-to.html#SP9" class="function-link"><span class="function-syntax">Optimiser::ptoken_width</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">) != </span><span class="constant-syntax">PTOKEN_ELASTIC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">strut_number</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">no_struts</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">strut_lengths</span><span class="plain-syntax">[</span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">no_struts</span><span class="plain-syntax">] += </span><a href="4-to.html#SP9" class="function-link"><span class="function-syntax">Optimiser::ptoken_width</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">; </span><span class="comment-syntax"> should be impossible</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">; </span><span class="comment-syntax"> should be impossible</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">no_struts</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
@ -338,7 +338,7 @@ position then all of them have, but we're in no hurry so we don't exploit that.)
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">ptoken</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_ptoken</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_ptoken</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax">; </span><span class="identifier-syntax">pt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_pt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-syntax">FIXED_WORD_PTC</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">ptoken_position</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">range_starts</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">range_ends</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">opt</span><span class="plain-syntax">.</span><span class="element-syntax">ptoken_is_fast</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
@ -358,7 +358,7 @@ then it is said to be "elastic" and has no width as such.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-lp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresscurrent">to</li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progressnext"><a href="4-le.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="4-lp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-wm.html">1</a></li><li class="progresschapter"><a href="2-vcb.html">2</a></li><li class="progresschapter"><a href="3-lxr.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-ap.html">ap</a></li><li class="progresssection"><a href="4-nnt.html">nnt</a></li><li class="progresssection"><a href="4-lp.html">lp</a></li><li class="progresscurrent">to</li><li class="progresssection"><a href="4-le.html">le</a></li><li class="progresssection"><a href="4-ni.html">ni</a></li><li class="progresssection"><a href="4-prf.html">prf</a></li><li class="progresssection"><a href="4-bn.html">bn</a></li><li class="progresssection"><a href="4-ins.html">ins</a></li><li class="progresssection"><a href="4-pu.html">pu</a></li><li class="progressnext"><a href="4-le.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -117,6 +117,9 @@ following alphabetical list has references to fuller explanations:
<ul class="items"><li>&#9679; <span class="extract"><span class="extract-syntax">MORE_PREFORM_OPTIMISER_WORDS_CALLBACK</span></span> and <span class="extract"><span class="extract-syntax">PREFORM_OPTIMISER_WORDS_CALLBACK</span></span>
have the opportunity to flag certain Preform nonterminals in ways which will
help <a href="4-to.html" class="internal">The Optimiser</a>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">PREFORM_ERROR_WORDS_CALLBACK</span></span> allows the parent to issue errors about
Preform definitions in its own way; they will otherwise by default be standard
command-line error message written to <span class="extract"><span class="extract-syntax">STDERR</span></span>.
</li><li>&#9679; <span class="extract"><span class="extract-syntax">PROBLEM_WORDS_CALLBACK</span></span> is called when a lexical error is found, and can
prevent this from being issued to the terminal as an error message: see
<a href="3-lxr.html#SP31" class="internal">Lexer::lexer_problem_handler</a>.

View file

@ -187,6 +187,11 @@
<spon class="sectiontitle">Instrumentation</span></a> -
<span class="sectionpurpose">To provide debugging and tuning data on the Preform parser's performance.</span></p>
</li>
<li>
<p class="sectionentry"><a href="4-pu.html">
<spon class="sectiontitle">Preform Utilities</span></a> -
<span class="sectionpurpose">Other uses for Preform grammar, including the generation of adaptive text, and word inflection.</span></p>
</li>
</ul>
</li>
</ul>

View file

@ -413,7 +413,7 @@ vocabulary_entry *property_word_to_suppress = NULL;
vocabulary_entry *suppression = word_to_suppress_in_phrases;
if (<property-of-shape>(W)) {
if (property_word_to_suppress == NULL)
property_word_to_suppress = Preform::Nonparsing::word(<property-of-shape>, 0);
property_word_to_suppress = PreformUtilities::word(<property-of-shape>, 0);
word_to_suppress_in_phrases = property_word_to_suppress;
}
parse_node *p = ExParser::parse_excerpt(VALUE_PHRASE_MC, W);

View file

@ -33,22 +33,22 @@ void Calculus::QuasinumericRelations::REL_create_initial_stock(void) {
BinaryPredicates::make_pair(QUASINUMERIC_KBP,
number_term, number_term,
I"greater-than", NULL, NULL, NULL, Calculus::Schemas::new("*1 > *2"),
Preform::Nonparsing::wording(<relation-names>, GT_RELATION_NAME));
PreformUtilities::wording(<relation-names>, GT_RELATION_NAME));
R_numerically_less_than =
BinaryPredicates::make_pair(QUASINUMERIC_KBP,
number_term, number_term,
I"less-than", NULL, NULL, NULL, Calculus::Schemas::new("*1 < *2"),
Preform::Nonparsing::wording(<relation-names>, LT_RELATION_NAME));
PreformUtilities::wording(<relation-names>, LT_RELATION_NAME));
R_numerically_greater_than_or_equal_to =
BinaryPredicates::make_pair(QUASINUMERIC_KBP,
number_term, number_term,
I"at-least", NULL, NULL, NULL, Calculus::Schemas::new("*1 >= *2"),
Preform::Nonparsing::wording(<relation-names>, GE_RELATION_NAME));
PreformUtilities::wording(<relation-names>, GE_RELATION_NAME));
R_numerically_less_than_or_equal_to =
BinaryPredicates::make_pair(QUASINUMERIC_KBP,
number_term, number_term,
I"at-most", NULL, NULL, NULL, Calculus::Schemas::new("*1 <= *2"),
Preform::Nonparsing::wording(<relation-names>, LE_RELATION_NAME));
PreformUtilities::wording(<relation-names>, LE_RELATION_NAME));
BinaryPredicates::set_index_details(R_numerically_greater_than,
"arithmetic value", "arithmetic value");
BinaryPredicates::set_index_details(R_numerically_less_than,

View file

@ -20,8 +20,8 @@ void Calculus::Equality::REL_create_initial_stock(void) {
R_equality = BinaryPredicates::make_equality();
BinaryPredicates::set_index_details(R_equality, "value", "value");
word_assemblage wa = Preform::Nonparsing::merge(<relation-name-formal>, 0,
Preform::Nonparsing::wording(<relation-names>, EQUALITY_RELATION_NAME));
word_assemblage wa = PreformUtilities::merge(<relation-name-formal>, 0,
PreformUtilities::wording(<relation-names>, EQUALITY_RELATION_NAME));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
@ -34,7 +34,7 @@ void Calculus::Equality::REL_create_initial_stock(void) {
BinaryPredicates::new_term(NULL),
I"has", I"is-had-by",
NULL, NULL, NULL,
Preform::Nonparsing::wording(<relation-names>, POSSESSION_RELATION_NAME));
PreformUtilities::wording(<relation-names>, POSSESSION_RELATION_NAME));
#endif
}

View file

@ -500,7 +500,7 @@ void Properties::Measurement::register_comparative(wording W, binary_predicate *
set_where_created = current_sentence;
verb_meaning vm = VerbMeanings::new(root, NULL);
preposition_identity *prep =
Prepositions::make(Preform::Nonparsing::merge(<comparative-property-construction>, 0,
Prepositions::make(PreformUtilities::merge(<comparative-property-construction>, 0,
WordAssemblages::lit_1(Lexer::word(Wordings::first_wn(W)))), FALSE);
Verbs::add_form(copular_verb, prep, NULL, vm, SVO_FS_BIT);
}

View file

@ -267,7 +267,7 @@ name in both forms. The following grammar is used to construct this prefix.
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
PROPERTY_MC, Rvalues::from_property(prn));
word_assemblage wa =
Preform::Nonparsing::merge(<property-name-construction>, 0,
PreformUtilities::merge(<property-name-construction>, 0,
WordAssemblages::from_wording(W));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -57,7 +57,7 @@ void Properties::SameRelations::register_same_property_as(binary_predicate *root
verb_meaning vm = VerbMeanings::new(root, NULL);
preposition_identity *prep =
Prepositions::make(
Preform::Nonparsing::merge(<same-property-as-construction>, 0,
PreformUtilities::merge(<same-property-as-construction>, 0,
WordAssemblages::from_wording(W)), FALSE);
Verbs::add_form(copular_verb, prep, NULL, vm, SVO_FS_BIT);
}

View file

@ -25,7 +25,7 @@ void Properties::ProvisionRelation::REL_create_initial_stock(void) {
BinaryPredicates::make_pair(PROVISION_KBP,
BinaryPredicates::new_term(NULL), BinaryPredicates::new_term(NULL),
I"provides", NULL, NULL, NULL, NULL,
Preform::Nonparsing::wording(<relation-names>, PROVISION_RELATION_NAME));
PreformUtilities::wording(<relation-names>, PROVISION_RELATION_NAME));
BinaryPredicates::set_index_details(R_provision, "value", "property");
}

View file

@ -66,7 +66,7 @@ table_column *Tables::Columns::new_table_column(wording W) {
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
TABLE_COLUMN_MC, Rvalues::from_table_column(tc));
word_assemblage wa =
Preform::Nonparsing::merge(<table-column-name-construction>, 0,
PreformUtilities::merge(<table-column-name-construction>, 0,
WordAssemblages::from_wording(W));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -445,7 +445,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then:
if (Wordings::nonempty(t->table_no_text)) {
LOGIF(TABLES, "Registering table by number: table %W\n", t->table_no_text);
word_assemblage wa = Preform::Nonparsing::merge(<table-names-construction>, 0,
word_assemblage wa = PreformUtilities::merge(<table-names-construction>, 0,
WordAssemblages::from_wording(t->table_no_text));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,
@ -455,7 +455,7 @@ number only, that must. Suppose that "Table 2 - Trees" already exists. Then:
if (Wordings::nonempty(t->table_name_text)) {
LOGIF(TABLES, "Registering table by name: table of %W\n", t->table_name_text);
word_assemblage wa = Preform::Nonparsing::merge(<table-names-construction>, 1,
word_assemblage wa = PreformUtilities::merge(<table-names-construction>, 1,
WordAssemblages::from_wording(t->table_name_text));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -228,7 +228,7 @@ could be referred to elsewhere in the text by any of three names:
@<Register any names for this equation@> =
if (Wordings::nonempty(NO)) {
word_assemblage wa = Preform::Nonparsing::merge(<equation-names-construction>, 0,
word_assemblage wa = PreformUtilities::merge(<equation-names-construction>, 0,
WordAssemblages::from_wording(NO));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,
@ -251,7 +251,7 @@ could be referred to elsewhere in the text by any of three names:
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
EQUATION_MC, Rvalues::from_equation(eqn));
word_assemblage wa =
Preform::Nonparsing::merge(<equation-names-construction>, 0,
PreformUtilities::merge(<equation-names-construction>, 0,
WordAssemblages::from_wording(NA));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -208,7 +208,7 @@ activity *Activities::new(kind *creation_kind, wording W) {
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
ACTIVITY_MC, Rvalues::from_activity(av));
word_assemblage wa =
Preform::Nonparsing::merge(<activity-name-construction>, 0,
PreformUtilities::merge(<activity-name-construction>, 0,
WordAssemblages::from_wording(av->name));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -253,13 +253,13 @@ rulebook *Rulebooks::new(kind *create_as, wording W, package_request *R) {
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
RULEBOOK_MC, Rvalues::from_rulebook(rb));
word_assemblage wa =
Preform::Nonparsing::merge(<rulebook-name-construction>, 0,
PreformUtilities::merge(<rulebook-name-construction>, 0,
WordAssemblages::from_wording(rb->primary_name));
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,
RULEBOOK_MC, Rvalues::from_rulebook(rb));
wa = Preform::Nonparsing::merge(<rulebook-name-construction>, 1,
wa = PreformUtilities::merge(<rulebook-name-construction>, 1,
WordAssemblages::from_wording(rb->primary_name));
AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -92,7 +92,7 @@ present.
@ =
word_assemblage Plugins::Manage::wording(int N) {
return Preform::Nonparsing::wording(<plugin-name>, N);
return PreformUtilities::wording(<plugin-name>, N);
}
@h Plugins.

View file

@ -119,9 +119,9 @@ void NaturalLanguages::preform_error(word_assemblage base_text, nonterminal *nt,
if (pr) {
Problems::quote_number(3, &(pr->match_number));
ptoken *pt;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
for (pt = pr->first_pt; pt; pt = pt->next_pt) {
Instrumentation::write_ptoken(TEMP, pt);
if (pt->next_ptoken) WRITE_TO(TEMP, " ");
if (pt->next_pt) WRITE_TO(TEMP, " ");
}
Problems::quote_stream(4, TEMP);
Problems::issue_problem_segment(

View file

@ -202,7 +202,7 @@ whole thing into a |specification| for the rest of Inform to use.
@d PREFORM_ADAPTIVE_PERSON NaturalLanguages::adaptive_person
@d MORE_PREFORM_OPTIMISER_WORDS_CALLBACK Semantics::mark_preform_requirements
@d INFLECTIONS_ERROR_HANDLER NaturalLanguages::preform_error
@d PREFORM_ERROR_WORDS_CALLBACK NaturalLanguages::preform_error
=
void Semantics::read_preform(inform_language *L) {

View file

@ -475,7 +475,7 @@ binary_predicate *BinaryPredicates::make_equality(void) {
binary_predicate *bp = BinaryPredicates::make_single(EQUALITY_KBP,
BinaryPredicates::new_term(NULL), BinaryPredicates::new_term(NULL),
I"is", NULL, NULL, NULL,
Preform::Nonparsing::wording(<relation-names>, EQUALITY_RELATION_NAME));
PreformUtilities::wording(<relation-names>, EQUALITY_RELATION_NAME));
bp->reversal = bp; bp->right_way_round = TRUE;
return bp;
@ -514,7 +514,7 @@ binary_predicate *BinaryPredicates::make_pair(int family,
if (WordAssemblages::nonempty(source_name)) {
word_assemblage wa =
Preform::Nonparsing::merge(<relation-name-formal>, 0, source_name);
PreformUtilities::merge(<relation-name-formal>, 0, source_name);
wording AW = WordAssemblages::to_wording(&wa);
Nouns::new_proper_noun(AW, NEUTER_GENDER,
REGISTER_SINGULAR_NTOPT + PARSE_EXACTLY_NTOPT,

View file

@ -52,13 +52,13 @@ void NewVerbs::add_inequalities(void) {
void NewVerbs::add_inequalities_inner(verb_meaning lt, verb_meaning gt, verb_meaning le, verb_meaning ge) {
set_where_created = NULL;
current_main_verb = NULL;
VerbUsages::register_single_usage(Preform::Nonparsing::wording(<inequality-conjugations>, 0),
VerbUsages::register_single_usage(PreformUtilities::wording(<inequality-conjugations>, 0),
FALSE, IS_TENSE, ACTIVE_MOOD, Verbs::new_operator_verb(lt), FALSE);
VerbUsages::register_single_usage(Preform::Nonparsing::wording(<inequality-conjugations>, 1),
VerbUsages::register_single_usage(PreformUtilities::wording(<inequality-conjugations>, 1),
FALSE, IS_TENSE, ACTIVE_MOOD, Verbs::new_operator_verb(gt), FALSE);
VerbUsages::register_single_usage(Preform::Nonparsing::wording(<inequality-conjugations>, 2),
VerbUsages::register_single_usage(PreformUtilities::wording(<inequality-conjugations>, 2),
FALSE, IS_TENSE, ACTIVE_MOOD, Verbs::new_operator_verb(le), FALSE);
VerbUsages::register_single_usage(Preform::Nonparsing::wording(<inequality-conjugations>, 3),
VerbUsages::register_single_usage(PreformUtilities::wording(<inequality-conjugations>, 3),
FALSE, IS_TENSE, ACTIVE_MOOD, Verbs::new_operator_verb(ge), FALSE);
}
@ -633,13 +633,13 @@ void NewVerbs::bootstrap(void) {
NewVerbs::declare_sm(Sentences::VPs::include_in_SMF, I"include-in", 4);
NewVerbs::declare_sm(Sentences::VPs::omit_from_SMF, I"omit-from", 4);
word_assemblage infinitive = Preform::Nonparsing::wording(<bootstrap-verb>, 0);
word_assemblage infinitive = PreformUtilities::wording(<bootstrap-verb>, 0);
verb_conjugation *vc = Conjugation::conjugate(infinitive, English_language);
verb_identity *vi = Verbs::new_verb(vc, TRUE);
vc->vc_conjugates = vi;
VerbUsages::register_all_usages_of_verb(vi, FALSE, 2);
infinitive = Preform::Nonparsing::wording(<bootstrap-verb>, 1);
infinitive = PreformUtilities::wording(<bootstrap-verb>, 1);
vc = Conjugation::conjugate(infinitive, English_language);
vi = Verbs::new_verb(vc, FALSE);
vc->vc_conjugates = vi;

View file

@ -568,7 +568,7 @@ omitted from the index.
if (prn == NULL) return;
} else {
word_assemblage pw_wa =
Preform::Nonparsing::merge(<relation-storage-construction>, 0,
PreformUtilities::merge(<relation-storage-construction>, 0,
WordAssemblages::from_wording(RW));
wording PW = WordAssemblages::to_wording(&pw_wa);
prn = Properties::Valued::obtain_within_kind(PW, K_object);

View file

@ -20,12 +20,12 @@ void Relations::Universal::REL_create_initial_stock(void) {
BinaryPredicates::make_pair(UNIVERSAL_KBP,
BinaryPredicates::new_term(NULL), BinaryPredicates::new_term(NULL),
I"relates", NULL, NULL, NULL, NULL,
Preform::Nonparsing::wording(<relation-names>, UNIVERSAL_RELATION_NAME));
PreformUtilities::wording(<relation-names>, UNIVERSAL_RELATION_NAME));
R_meaning =
BinaryPredicates::make_pair(UNIVERSAL_KBP,
BinaryPredicates::new_term(NULL), BinaryPredicates::new_term(NULL),
I"means", NULL, NULL, NULL, NULL,
Preform::Nonparsing::wording(<relation-names>, MEANING_RELATION_NAME));
PreformUtilities::wording(<relation-names>, MEANING_RELATION_NAME));
}
@h Second stock.

View file

@ -27,7 +27,7 @@ void PL::MapDirections::create_relations(void) {
BinaryPredicates::new_term(infs_room),
I"adjacent-to", I"adjacent-from",
NULL, NULL, Calculus::Schemas::new("TestAdjacency(*1,*2)"),
Preform::Nonparsing::wording(<relation-names>, ADJACENCY_RELATION_NAME));
PreformUtilities::wording(<relation-names>, ADJACENCY_RELATION_NAME));
}
@ -126,22 +126,22 @@ this to other languages.)
bp_term_details room_term = BinaryPredicates::new_term(NULL);
bp = BinaryPredicates::make_pair(MAP_CONNECTING_KBP,
room_term, room_term, relname, NULL, NULL, NULL, NULL,
Preform::Nonparsing::merge(<mapping-relation-construction>, 0,
PreformUtilities::merge(<mapping-relation-construction>, 0,
WordAssemblages::from_wording(W)));
int mpc_form = 0;
if (<notable-directions>(W)) mpc_form = 1;
preposition_identity *prep1 = Prepositions::make(
Preform::Nonparsing::merge(<mapping-preposition-construction>, mpc_form,
PreformUtilities::merge(<mapping-preposition-construction>, mpc_form,
WordAssemblages::from_wording(W)),
FALSE);
preposition_identity *prep2 = Prepositions::make(
Preform::Nonparsing::merge(<mapping-preposition-construction>, 2,
PreformUtilities::merge(<mapping-preposition-construction>, 2,
WordAssemblages::from_wording(W)),
FALSE);
preposition_identity *prep3 = Prepositions::make(
Preform::Nonparsing::merge(<mapping-preposition-construction>, 3,
PreformUtilities::merge(<mapping-preposition-construction>, 3,
WordAssemblages::from_wording(W)),
FALSE);

View file

@ -210,7 +210,7 @@ void PL::Regions::create_relations(void) {
BinaryPredicates::new_term(Kinds::Knowledge::as_subject(K_object)),
I"region-contains", I"in-region",
NULL, NULL, Calculus::Schemas::new("TestRegionalContainment(*2,*1)"),
Preform::Nonparsing::wording(<relation-names>,
PreformUtilities::wording(<relation-names>,
REGIONAL_CONTAINMENT_RELATION_NAME));
BinaryPredicates::set_index_details(R_regional_containment, NULL, "room/region");
}

View file

@ -50,7 +50,7 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(NULL),
I"contains", I"is-in",
NULL, Calculus::Schemas::new("MoveObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, CONTAINMENT_RELATION_NAME));
PreformUtilities::wording(<relation-names>, CONTAINMENT_RELATION_NAME));
R_containment->loop_parent_optimisation_proviso = "ContainerOf";
R_containment->loop_parent_optimisation_ranger = "TestContainmentRange";
BinaryPredicates::set_index_details(R_containment, "container/room", "thing");
@ -60,7 +60,7 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(infs_thing),
I"supports", I"is-on",
NULL, Calculus::Schemas::new("MoveObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, SUPPORT_RELATION_NAME));
PreformUtilities::wording(<relation-names>, SUPPORT_RELATION_NAME));
R_support->loop_parent_optimisation_proviso = "SupporterOf";
R_incorporation =
BinaryPredicates::make_pair(SPATIAL_KBP,
@ -68,14 +68,14 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(infs_thing),
I"incorporates", I"is-part-of",
NULL, Calculus::Schemas::new("MakePart(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, INCORPORATION_RELATION_NAME));
PreformUtilities::wording(<relation-names>, INCORPORATION_RELATION_NAME));
R_carrying =
BinaryPredicates::make_pair(SPATIAL_KBP,
BinaryPredicates::full_new_term(infs_person, NULL, EMPTY_WORDING, Calculus::Schemas::new("CarrierOf(*1)")),
BinaryPredicates::new_term(infs_thing),
I"carries", I"is-carried-by",
NULL, Calculus::Schemas::new("MoveObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, CARRYING_RELATION_NAME));
PreformUtilities::wording(<relation-names>, CARRYING_RELATION_NAME));
R_carrying->loop_parent_optimisation_proviso = "CarrierOf";
R_holding =
BinaryPredicates::make_pair(SPATIAL_KBP,
@ -83,7 +83,7 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(infs_thing),
I"holds", I"is-held-by",
NULL, Calculus::Schemas::new("MoveObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, HOLDING_RELATION_NAME));
PreformUtilities::wording(<relation-names>, HOLDING_RELATION_NAME));
/* can't be optimised, because parts are also held */
R_wearing =
BinaryPredicates::make_pair(SPATIAL_KBP,
@ -91,7 +91,7 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(infs_thing),
I"wears", I"is-worn-by",
NULL, Calculus::Schemas::new("WearObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, WEARING_RELATION_NAME));
PreformUtilities::wording(<relation-names>, WEARING_RELATION_NAME));
R_wearing->loop_parent_optimisation_proviso = "WearerOf";
a_has_b_predicate =
BinaryPredicates::make_pair(SPATIAL_KBP,
@ -99,7 +99,7 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(NULL),
I"has", I"is-had-by",
NULL, Calculus::Schemas::new("MoveObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, POSSESSION_RELATION_NAME));
PreformUtilities::wording(<relation-names>, POSSESSION_RELATION_NAME));
a_has_b_predicate->loop_parent_optimisation_proviso = "OwnerOf";
BinaryPredicates::set_index_details(a_has_b_predicate, "person", "thing");
room_containment_predicate =
@ -108,7 +108,7 @@ a union of the others, and therefore includes incorporation.)
BinaryPredicates::new_term(infs_thing),
I"is-room-of", I"is-in-room",
NULL, Calculus::Schemas::new("MoveObject(*2,*1)"), NULL,
Preform::Nonparsing::wording(<relation-names>, ROOM_CONTAINMENT_RELATION_NAME));
PreformUtilities::wording(<relation-names>, ROOM_CONTAINMENT_RELATION_NAME));
room_containment_predicate->loop_parent_optimisation_proviso = "LocationOf";
@ Visibility, touchability, concealment and enclosure: all relations which
@ -121,28 +121,28 @@ can be tested at run-time, but which can't be asserted or made true or false.
BinaryPredicates::new_term(infs_thing),
I"can-see", I"can-be-seen-by",
NULL, NULL, Calculus::Schemas::new("TestVisibility(*1,*2)"),
Preform::Nonparsing::wording(<relation-names>, VISIBILITY_RELATION_NAME));
PreformUtilities::wording(<relation-names>, VISIBILITY_RELATION_NAME));
R_touchability =
BinaryPredicates::make_pair(SPATIAL_KBP,
BinaryPredicates::new_term(infs_thing),
BinaryPredicates::new_term(infs_thing),
I"can-touch", I"can-be-touched-by",
NULL, NULL, Calculus::Schemas::new("TestTouchability(*1,*2)"),
Preform::Nonparsing::wording(<relation-names>, TOUCHABILITY_RELATION_NAME));
PreformUtilities::wording(<relation-names>, TOUCHABILITY_RELATION_NAME));
R_concealment =
BinaryPredicates::make_pair(SPATIAL_KBP,
BinaryPredicates::new_term(infs_thing),
BinaryPredicates::new_term(infs_thing),
I"conceals", I"is-concealed-by",
NULL, NULL, Calculus::Schemas::new("TestConcealment(*1,*2)"),
Preform::Nonparsing::wording(<relation-names>, CONCEALMENT_RELATION_NAME));
PreformUtilities::wording(<relation-names>, CONCEALMENT_RELATION_NAME));
R_enclosure =
BinaryPredicates::make_pair(SPATIAL_KBP,
BinaryPredicates::new_term(Kinds::Knowledge::as_subject(K_object)),
BinaryPredicates::new_term(Kinds::Knowledge::as_subject(K_object)),
I"encloses", I"is-enclosed-by",
NULL, NULL, Calculus::Schemas::new("IndirectlyContains(*1,*2)"),
Preform::Nonparsing::wording(<relation-names>, ENCLOSURE_RELATION_NAME));
PreformUtilities::wording(<relation-names>, ENCLOSURE_RELATION_NAME));
@h Second stock.
There is none -- this is a family of relations which is all built in.

View file

@ -253,7 +253,7 @@ action_name *PL::Actions::act_new(wording W, int implemented_by_I7) {
an->out_of_world = FALSE;
an->an_specification_text_word = -1;
word_assemblage wa = Preform::Nonparsing::merge(<action-name-construction>, 0,
word_assemblage wa = PreformUtilities::merge(<action-name-construction>, 0,
WordAssemblages::from_wording(W));
wording AW = WordAssemblages::to_wording(&wa);
an->name = Nouns::new_proper_noun(AW, NEUTER_GENDER,

View file

@ -197,7 +197,7 @@ for the kinds we inherit from.
LOOP_THROUGH_WORDING(j, W) {
vocabulary_entry *ve = Lexer::word(j);
ve = Preform::Nonparsing::replace_word(ve,
ve = PreformUtilities::find_corresponding_word(ve,
<possessive-second-person>,
<possessive-first-person>);
wchar_t *p = Vocabulary::get_exemplar(ve, FALSE);

View file

@ -205,11 +205,11 @@ on. (Sometimes these will also be listed separately with an adjectival sense.)
"which" or "who".
@<Stock the lexicon with miscellaneous bits and pieces@> =
Preform::Nonparsing::enter_lexicon(<indefinite-article>, MISCELLANEOUS_LEXE,
PreformUtilities::enter_lexicon(<indefinite-article>, MISCELLANEOUS_LEXE,
"indefinite article", NULL);
Preform::Nonparsing::enter_lexicon(<definite-article>, MISCELLANEOUS_LEXE,
PreformUtilities::enter_lexicon(<definite-article>, MISCELLANEOUS_LEXE,
"definite article", NULL);
Preform::Nonparsing::enter_lexicon(<relative-clause-marker>, MISCELLANEOUS_LEXE,
PreformUtilities::enter_lexicon(<relative-clause-marker>, MISCELLANEOUS_LEXE,
"connective",
"used to place a further condition on a description: like 'which' in "
"'A which is B', or 'A which carries B', for instance.");

View file

@ -75,3 +75,8 @@ in its run.
=
NATURAL_LANGUAGE_WORDS_TYPE *English_language = NULL; /* until created, early in run */
NATURAL_LANGUAGE_WORDS_TYPE *Linguistics::default_nl(NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl) return nl;
return English_language;
}

View file

@ -134,10 +134,10 @@ through one or two tries.
word_assemblage wa = WordAssemblages::from_wording(W);
if (step1)
wa = Inflections::apply_trie_to_wa(wa,
Preform::Nonparsing::define_trie(step1, TRIE_END, nl));
PreformUtilities::define_trie(step1, TRIE_END, Linguistics::default_nl(nl)));
if (step2)
wa = Inflections::apply_trie_to_wa(wa,
Preform::Nonparsing::define_trie(step2, TRIE_END, nl));
PreformUtilities::define_trie(step2, TRIE_END, Linguistics::default_nl(nl)));
FW = WordAssemblages::to_wording(&wa);
@h Plural fixing.

View file

@ -14,8 +14,9 @@ void ArticleInflection::preface_by_article(OUTPUT_STREAM, text_stream *initial_t
NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (indef_trie == NULL)
indef_trie =
Preform::Nonparsing::define_trie(
<singular-noun-to-its-indefinite-article>, TRIE_START, NULL);
PreformUtilities::define_trie(
<singular-noun-to-its-indefinite-article>, TRIE_START,
Linguistics::default_nl(NULL));
wchar_t *result = Tries::search_avinue(indef_trie, initial_text);
if (result == NULL) result = L"a";
WRITE("%w %S", result, initial_text);

View file

@ -39,28 +39,28 @@ declension Declensions::decline_inner(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl
if (nl == NULL) nl = English_language;
declension D;
D.within_language = nl;
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
if ((pl->definition_language == NULL) || (pl->definition_language == nl)) {
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
if ((pr->first_ptoken == NULL) ||
(pr->first_ptoken->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_ptoken->next_ptoken == NULL) ||
(pr->first_ptoken->next_ptoken->ptoken_category != NONTERMINAL_PTC))
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_pt->next_pt == NULL) ||
(pr->first_pt->next_pt->ptoken_category != NONTERMINAL_PTC))
internal_error("line in <noun-declension> malformed");
wchar_t *gender_letter = Vocabulary::get_exemplar(pr->first_ptoken->ve_pt, FALSE);
wchar_t *gender_letter = Vocabulary::get_exemplar(pr->first_pt->ve_pt, FALSE);
if ((gender_letter[0] == '*') ||
((gender_letter[0] == 'm') && (gen == MASCULINE_GENDER)) ||
((gender_letter[0] == 'f') && (gen == FEMININE_GENDER)) ||
((gender_letter[0] == 'n') && (gen == NEUTER_GENDER))) {
int found = FALSE;
nonterminal *gnt = pr->first_ptoken->next_ptoken->nt_pt;
if (pr->first_ptoken->next_ptoken->next_ptoken == NULL) {
nonterminal *gnt = pr->first_pt->next_pt->nt_pt;
if (pr->first_pt->next_pt->next_pt == NULL) {
D = Declensions::decline_from_irregulars(W, nl, gnt, num, &found);
} else {
if ((pr->first_ptoken->next_ptoken->next_ptoken->ptoken_category != NONTERMINAL_PTC) ||
(pr->first_ptoken->next_ptoken->next_ptoken->next_ptoken != NULL))
if ((pr->first_pt->next_pt->next_pt->ptoken_category != NONTERMINAL_PTC) ||
(pr->first_pt->next_pt->next_pt->next_pt != NULL))
internal_error("this line must end with two nonterminals");
nonterminal *tnt = pr->first_ptoken->next_ptoken->next_ptoken->nt_pt;
nonterminal *tnt = pr->first_pt->next_pt->next_pt->nt_pt;
D = Declensions::decline_from_groups(W, nl, gnt, tnt, num, &found);
}
if (found) return D;
@ -79,14 +79,14 @@ declension Declensions::decline_from_irregulars(wording W, NATURAL_LANGUAGE_WORD
declension D;
D.within_language = nl;
if (Wordings::length(W) == 1)
for (production_list *pl = gnt->first_production_list; pl; pl = pl->next_production_list)
for (production_list *pl = gnt->first_pl; pl; pl = pl->next_pl)
if ((pl->definition_language == NULL) || (pl->definition_language == nl))
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
vocabulary_entry *stem = pr->first_ptoken->ve_pt;
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
vocabulary_entry *stem = pr->first_pt->ve_pt;
if (stem == Lexer::word(Wordings::first_wn(W))) {
*found = TRUE;
int c = 0, nc = Declensions::no_cases(nl);
for (ptoken *pt = pr->first_ptoken->next_ptoken; pt; pt = pt->next_ptoken) {
for (ptoken *pt = pr->first_pt->next_pt; pt; pt = pt->next_pt) {
if (pt->ptoken_category != FIXED_WORD_PTC)
internal_error("nonterminals are not allowed in irregular declensions");
if (((num == 1) && (c < nc)) || ((num == 2) && (c >= nc))) {
@ -115,7 +115,7 @@ declension Declensions::decline_from_groups(wording W, NATURAL_LANGUAGE_WORDS_TY
D.within_language = nl;
TEMPORARY_TEXT(from);
WRITE_TO(from, "%+W", W);
match_avinue *group_trie = Preform::Nonparsing::define_trie(gnt, TRIE_END, nl);
match_avinue *group_trie = PreformUtilities::define_trie(gnt, TRIE_END, Linguistics::default_nl(nl));
wchar_t *result = Tries::search_avinue(group_trie, from);
DISCARD_TEXT(from);
if (result == NULL) {
@ -125,15 +125,15 @@ declension Declensions::decline_from_groups(wording W, NATURAL_LANGUAGE_WORDS_TY
int group = result[0] - '0';
if ((group <= 0) || (group > 9))
internal_error("noun declension nonterminal result not a group number");
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
if ((pl->definition_language == NULL) || (pl->definition_language == nl)) {
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
if ((pr->first_ptoken == NULL) ||
(pr->first_ptoken->ptoken_category != NONTERMINAL_PTC) ||
(pr->first_ptoken->next_ptoken != NULL))
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != NONTERMINAL_PTC) ||
(pr->first_pt->next_pt != NULL))
internal_error("noun declension nonterminal malformed");
if (--group == 0)
return Declensions::decline_from(W, nl, pr->first_ptoken->nt_pt, num);
return Declensions::decline_from(W, nl, pr->first_pt->nt_pt, num);
}
}
}
@ -146,19 +146,19 @@ declension Declensions::decline_from(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl,
int c = 0, nc = Declensions::no_cases(nl);
declension D;
D.within_language = nl;
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
if ((pl->definition_language == NULL) || (pl->definition_language == nl)) {
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
if ((pr->first_ptoken == NULL) ||
(pr->first_ptoken->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_ptoken->next_ptoken != NULL))
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_pt->next_pt != NULL))
internal_error("<noun-declension> too complex");
if (((c < nc) && (num == 1)) || ((c >= nc) && (num == 2))) {
TEMPORARY_TEXT(stem);
TEMPORARY_TEXT(result);
WRITE_TO(stem, "%+W", W);
Inflections::follow_suffix_instruction(result, stem,
Vocabulary::get_exemplar(pr->first_ptoken->ve_pt, TRUE));
Vocabulary::get_exemplar(pr->first_pt->ve_pt, TRUE));
D.name_cased[c%nc] = Feeds::feed_text(result);
DISCARD_TEXT(stem);
DISCARD_TEXT(result);
@ -181,10 +181,10 @@ wording Declensions::in_case(declension *D, int c) {
int Declensions::no_cases(NATURAL_LANGUAGE_WORDS_TYPE *nl) {
nonterminal *nt = <grammatical-case-names>;
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
if ((pl->definition_language == NULL) || (pl->definition_language == nl)) {
int c = 0;
for (production *pr = pl->first_production; pr; pr = pr->next_production) c++;
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) c++;
if (c >= MAX_GRAMMATICAL_CASES)
internal_error("<grammatical-case-names> lists too many cases");
return c;
@ -197,16 +197,16 @@ int Declensions::no_cases(NATURAL_LANGUAGE_WORDS_TYPE *nl) {
void Declensions::writer(OUTPUT_STREAM, declension *D, declension *AD) {
nonterminal *nt = <grammatical-case-names>;
int nc = Declensions::no_cases(D->within_language);
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
if ((pl->definition_language == NULL) || (pl->definition_language == D->within_language)) {
int c = 0;
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
if ((pr->first_ptoken == NULL) ||
(pr->first_ptoken->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_ptoken->next_ptoken != NULL))
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
if ((pr->first_pt == NULL) ||
(pr->first_pt->ptoken_category != FIXED_WORD_PTC) ||
(pr->first_pt->next_pt != NULL))
internal_error("<grammatical-case-names> too complex");
if (c > 0) WRITE(", ");
WRITE("%w: %W %W", Vocabulary::get_exemplar(pr->first_ptoken->ve_pt, TRUE),
WRITE("%w: %W %W", Vocabulary::get_exemplar(pr->first_pt->ve_pt, TRUE),
AD->name_cased[c], D->name_cased[c]);
c++;
if (c >= nc) break;

View file

@ -21,11 +21,11 @@ wording Grading::make_comparative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
WRITE_TO(comprised, "%N", Wordings::first_wn(W));
if (nl == NULL) nl = English_language;
match_avinue *comp_trie =
Preform::Nonparsing::define_trie(<adjective-to-comparative>, TRIE_END, nl);
PreformUtilities::define_trie(<adjective-to-comparative>, TRIE_END, Linguistics::default_nl(nl));
Inflections::suffix_inflection(transformed, comp_trie, comprised);
wording PW = Feeds::feed_text(transformed);
word_assemblage merged =
Preform::Nonparsing::merge(<comparative-construction>, 0,
PreformUtilities::merge(<comparative-construction>, 0,
WordAssemblages::from_wording(PW));
PW = WordAssemblages::to_wording(&merged);
LOGIF(CONSTRUCTED_PLURALS, "[Comparative of %W is %W]\n", W, PW);
@ -43,7 +43,7 @@ wording Grading::make_superlative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
WRITE_TO(comprised, "%N", Wordings::first_wn(W));
if (nl == NULL) nl = English_language;
match_avinue *comp_trie =
Preform::Nonparsing::define_trie(<adjective-to-superlative>, TRIE_END, nl);
PreformUtilities::define_trie(<adjective-to-superlative>, TRIE_END, Linguistics::default_nl(nl));
Inflections::suffix_inflection(transformed, comp_trie, comprised);
wording PW = Feeds::feed_text(transformed);
LOGIF(CONSTRUCTED_PLURALS, "[Superlative of %W is %W]\n", W, PW);
@ -67,7 +67,7 @@ wording Grading::make_quiddity(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
WRITE_TO(comprised, "%N", Wordings::first_wn(W));
if (nl == NULL) nl = English_language;
match_avinue *comp_trie =
Preform::Nonparsing::define_trie(<adjective-to-quiddity>, TRIE_END, nl);
PreformUtilities::define_trie(<adjective-to-quiddity>, TRIE_END, Linguistics::default_nl(nl));
Inflections::suffix_inflection(transformed, comp_trie, comprised);
wording PW = Feeds::feed_text(transformed);
LOGIF(CONSTRUCTED_PLURALS, "[Quiddity of %W is %W]\n", W, PW);

View file

@ -38,6 +38,6 @@ above. It expects only a single word.
=
int PastParticiples::pasturise_text(OUTPUT_STREAM, text_stream *from) {
match_avinue *past_trie =
Preform::Nonparsing::define_trie(<pasturise-participle>, TRIE_START, NULL);
PreformUtilities::define_trie(<pasturise-participle>, TRIE_START, Linguistics::default_nl(NULL));
return Inflections::suffix_inflection(OUT, past_trie, from);
}

View file

@ -97,6 +97,6 @@ has a plural, and modifies it to the plural form.
int Pluralisation::regular(OUTPUT_STREAM, text_stream *from, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl == NULL) nl = English_language;
match_avinue *plural_trie =
Preform::Nonparsing::define_trie(<singular-noun-to-its-plural>, TRIE_END, nl);
PreformUtilities::define_trie(<singular-noun-to-its-plural>, TRIE_END, Linguistics::default_nl(nl));
return Inflections::suffix_inflection(OUT, plural_trie, from);
}

View file

@ -135,12 +135,12 @@ rest. (The selector is always just a single token.)
@<Work through the supplied tabulation, filling in slots as directed@> =
production_list *pl;
for (pl = tabulation->first_production_list; pl; pl = pl->next_production_list) {
for (pl = tabulation->first_pl; pl; pl = pl->next_pl) {
if (nl == pl->definition_language) {
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
ptoken *selector = pr->first_ptoken;
ptoken *line = (selector)?(selector->next_ptoken):NULL;
for (pr = pl->first_pr; pr; pr = pr->next_pr) {
ptoken *selector = pr->first_pt;
ptoken *line = (selector)?(selector->next_pt):NULL;
if ((selector) && (selector->ptoken_category == FIXED_WORD_PTC) && (line)) {
@<Apply the given tabulation line to the slots selected@>;
} else Conjugation::error(base_text, tabulation, pr,
@ -259,10 +259,10 @@ nonterminal *Conjugation::follow_instructions(word_assemblage *verb_forms, int *
WordAssemblages::as_array(&(verb_forms[BASE_FORM_TYPE]), &base_text_words, &base_text_word_count);
production_list *pl;
for (pl = instructions_nt->first_production_list; pl; pl = pl->next_production_list) {
for (pl = instructions_nt->first_pl; pl; pl = pl->next_pl) {
if (nl == pl->definition_language) {
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
for (pr = pl->first_pr; pr; pr = pr->next_pr) {
@<Try to match the base text against this production@>;
}
}
@ -287,7 +287,7 @@ infinitive" form is set to the part matched by |...|: for example,
@<Try to match the base text against this production@> =
ptoken *pt, *last = NULL;
int len = 0, malformed = FALSE;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) { last = pt; len++; }
for (pt = pr->first_pt; pt; pt = pt->next_pt) { last = pt; len++; }
if ((len >= 1) && (last->ptoken_category == NONTERMINAL_PTC)) {
if (conjugation_nt == NULL) { /* i.e., if we have not yet chosen a conjugation */
int failed_to_match = FALSE, wildcard_from = -1;
@ -307,7 +307,7 @@ infinitive" form is set to the part matched by |...|: for example,
@<Try to match the base text against the pattern part of the production@> =
int word_count = 0;
for (pt = pr->first_ptoken; ((pt) && (pt != last)); pt = pt->next_ptoken) {
for (pt = pr->first_pt; ((pt) && (pt != last)); pt = pt->next_pt) {
if (pt->ptoken_category == FIXED_WORD_PTC) {
if ((word_count < base_text_word_count) &&
(Conjugation::compare_ve_with_tails(base_text_words[word_count], pt->ve_pt)))
@ -330,22 +330,22 @@ tokens.
@<Process the conjugation and determine the tabulation@> =
production_list *pl;
for (pl = conjugation_nt->first_production_list; pl; pl = pl->next_production_list) {
for (pl = conjugation_nt->first_pl; pl; pl = pl->next_pl) {
if (nl == pl->definition_language) {
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
for (pr = pl->first_pr; pr; pr = pr->next_pr) {
ptoken *pt;
int len = 0, malformed = FALSE;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) len++;
for (pt = pr->first_pt; pt; pt = pt->next_pt) len++;
switch (len) {
case 1:
if (pr->first_ptoken->ptoken_category == NONTERMINAL_PTC) {
if (pr->first_ptoken->nt_pt == <auxiliary-verb-only>)
if (pr->first_pt->ptoken_category == NONTERMINAL_PTC) {
if (pr->first_pt->nt_pt == <auxiliary-verb-only>)
*avo_flag = TRUE;
else if (pr->first_ptoken->nt_pt == <not-instance-of-verb-at-run-time>)
else if (pr->first_pt->nt_pt == <not-instance-of-verb-at-run-time>)
*niv_flag = TRUE;
else
tabulation_nt = pr->first_ptoken->nt_pt;
tabulation_nt = pr->first_pt->nt_pt;
} else malformed = TRUE;
break;
case 2:
@ -369,8 +369,8 @@ example:
|3 <en-trie-past-participle>| run this trie on the base text and take the result
@<Set a verb form from the conjugation line@> =
ptoken *number_token = pr->first_ptoken;
ptoken *content_token = number_token->next_ptoken;
ptoken *number_token = pr->first_pt;
ptoken *content_token = number_token->next_pt;
int n = Conjugation::ptoken_to_verb_form_number(number_token);
if (n >= 0) {
if (n > *highest_form_written) { *highest_form_written = n; }
@ -378,7 +378,7 @@ example:
verb_forms[n] =
Inflections::apply_trie_to_wa(
verb_forms[BASE_FORM_TYPE],
Preform::Nonparsing::define_trie(content_token->nt_pt, TRIE_END, nl));
PreformUtilities::define_trie(content_token->nt_pt, TRIE_END, Linguistics::default_nl(nl)));
else if (content_token->ptoken_category == FIXED_WORD_PTC)
verb_forms[n] =
Conjugation::expand_with_endings(content_token->ve_pt, verb_forms);
@ -415,7 +415,7 @@ word_assemblage Conjugation::merge(ptoken *row,
word_assemblage wa = WordAssemblages::lit_0();
int verb_form_to_lift = -1;
ptoken *chunk;
for (chunk = row; chunk; chunk = chunk->next_ptoken) {
for (chunk = row; chunk; chunk = chunk->next_pt) {
@<A plus-plus-digit indicates auxiliary modal usage@>;
@<A form number followed by a bracketed verb lifts the relevant form@>;
@<A bracketed verb becomes a lift@>;
@ -446,13 +446,13 @@ make use of the same fancy features we're allowing here.
@<A nonterminal is a table of persons@> =
if (chunk->ptoken_category == NONTERMINAL_PTC) {
production_list *pl;
for (pl = chunk->nt_pt->first_production_list; pl; pl = pl->next_production_list) {
for (pl = chunk->nt_pt->first_pl; pl; pl = pl->next_pl) {
int N = 0;
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
for (pr = pl->first_pr; pr; pr = pr->next_pr) {
if (N == person)
wa = WordAssemblages::join(wa,
Conjugation::merge(pr->first_ptoken,
Conjugation::merge(pr->first_pt,
sense, tense, person, num_ingredients, ingredients, nl, NULL));
N++;
}
@ -471,7 +471,7 @@ on the next iteration.
@<A form number followed by a bracketed verb lifts the relevant form@> =
int X = Conjugation::ptoken_to_verb_form_number(chunk);
if ((X >= 0) && (Conjugation::ptoken_as_bracket(chunk->next_ptoken))) {
if ((X >= 0) && (Conjugation::ptoken_as_bracket(chunk->next_pt))) {
verb_form_to_lift = X;
continue;
}
@ -492,12 +492,12 @@ of the numbered verb forms if we want it to.
@<A bracketed verb becomes a lift@> =
if (Conjugation::ptoken_as_bracket(chunk) == 1) {
chunk = chunk->next_ptoken; /* move past open bracket */
chunk = chunk->next_pt; /* move past open bracket */
/* if there is a tense/sense indicator, use it, and move forward */
int S = -1;
int T = Conjugation::ptoken_to_tense_indicator(chunk, &S) - 1;
if (T >= 0) chunk = chunk->next_ptoken; else T = tense;
if (T >= 0) chunk = chunk->next_pt; else T = tense;
if (S == -1) S = sense;
/* extract the text of the infinitive */
@ -505,7 +505,7 @@ of the numbered verb forms if we want it to.
while ((chunk) && (Conjugation::ptoken_as_bracket(chunk) != -1)) {
verb_lifted = WordAssemblages::join(verb_lifted,
Conjugation::expand_with_endings(chunk->ve_pt, ingredients));
chunk = chunk->next_ptoken;
chunk = chunk->next_pt;
}
verb_conjugation *aux = Conjugation::find_by_infinitive(verb_lifted);
@ -712,66 +712,14 @@ int Conjugation::compare_ve_with_tails(vocabulary_entry *ve, vocabulary_entry *p
}
@h Errors.
People are going to get their conjugations wrong; it's a very hard notation
to learn. No end users of Inform will ever write them at all -- this is a
low-level feature for translators only -- but translators need all the help
they can get, so we'll try to provide good problem messages.
=
void Conjugation::trie_definition_error(nonterminal *nt, production *pr, char *message) {
Conjugation::basic_problem_handler(WordAssemblages::lit_0(), nt, pr, message);
}
@ And similarly:
=
void Conjugation::error(word_assemblage base_text, nonterminal *nt,
production *pr, char *message) {
Conjugation::basic_problem_handler(base_text, nt, pr, message);
PreformUtilities::error(base_text, nt, pr, message);
exit(1);
}
@ Some tools using this module will want to push simple error messages out to
the command line; others will want to translate them into elaborate problem
texts in HTML. So the client is allowed to define |PROBLEM_SYNTAX_CALLBACK|
to some routine of her own, gazumping this one.
=
void Conjugation::basic_problem_handler(word_assemblage base_text, nonterminal *nt,
production *pr, char *message) {
#ifdef INFLECTIONS_ERROR_HANDLER
INFLECTIONS_ERROR_HANDLER(base_text, nt, pr, message);
#endif
#ifndef INFLECTIONS_ERROR_HANDLER
if (pr) {
LOG("The production at fault is:\n");
Instrumentation::log_production(pr, FALSE); LOG("\n");
}
TEMPORARY_TEXT(ERM);
if (nt == NULL)
WRITE_TO(ERM, "(no nonterminal)");
else
WRITE_TO(ERM, "nonterminal %w", Vocabulary::get_exemplar(nt->nonterminal_id, FALSE));
WRITE_TO(ERM, ": ");
if (WordAssemblages::nonempty(base_text))
WRITE_TO(ERM, "can't conjugate verb '%A': ", &base_text);
if (pr) {
TEMPORARY_TEXT(TEMP);
for (ptoken *pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
Instrumentation::write_ptoken(TEMP, pt);
if (pt->next_ptoken) WRITE_TO(TEMP, " ");
}
WRITE_TO(ERM, "line %d ('%S'): ", pr->match_number, TEMP);
DISCARD_TEXT(TEMP);
}
WRITE_TO(ERM, "%s", message);
Errors::with_text("Preform error: %S", ERM);
DISCARD_TEXT(ERM);
#endif
}
@h Testing.
Similarly, the following helps translators by giving them unit tests for their
conjugations:

View file

@ -9,7 +9,6 @@ Chapter 1: Starting Up
Chapter 2: Machinery
Linguistic Definitions
Non-Parsing Preform
Tries and Inflections
Name Clusters

View file

@ -347,7 +347,7 @@ options open.
determiner *Quantifiers::det_new(int not, int pr, int num, quantifier *quant, char *text) {
word_assemblage wa;
if (pr < 0) wa = WordAssemblages::lit_0();
else wa = Preform::Nonparsing::wording(<determiner-names>, pr);
else wa = PreformUtilities::wording(<determiner-names>, pr);
determiner *det = CREATE(determiner);
det->text_of_det = wa;
det->takes_number = num;

View file

@ -2,8 +2,7 @@
A brief guide to Preform and how to use it.
@h A Manual for Preform.
Preform is a meta-language for writing a simple grammar: it's in some sense
@ Preform is a meta-language for writing a simple grammar: it's in some sense
pre-Inform, because it defines the Inform language itself, and has to be read
by the //words// module (on behalf of Inform) before Inform can parse anything.
For example,
@ -114,45 +113,6 @@ with result 2.
yellow | polkadot | green | white
=
@ The material to the right of the |==>| is actually regular C code, and can
do more than simply evaluate one expression. For example, it can also set
the pointer result of the nonterminal; here, let's suppose, that will be a
pointer to a |text_stream|.
= (text as Preform)
<competitor> ::=
the pacemaker | ==> 1; *XP = I"unnumbered";
<ordinal-number> runner | ==> R[1]; *XP = I"numbered";
runner no <cardinal-number> ==> R[1]; *XP = I"numbered";
=
It can also, if it wants to, kill off a line:
= (text as Preform)
<competitor> ::=
the pacemaker | ==> 1
<ordinal-number> runner | ==> 0; return FALSE;
runner no <cardinal-number> ==> R[1]
=
Here a match against |<ordinal-number> runner| is forced to fail at the last
hurdle, just as it was about the succeed; it's as if the second row wasn't
there. (This is not useful unconditionally, but with an |if| statement,
it can be.) More extremely:
= (text as Preform)
<competitor> ::=
the pacemaker | ==> 1
<ordinal-number> runner | ==> 0; return FAIL_NONTERMINAL;
runner no <cardinal-number> ==> R[1]
=
causes any successful match against |<ordinal-number> runner| not only to be
failed, but to prevent any tries against the rows below it. (This is useful
when issuing problem messages, or to put exceptional syntaxes into the grammar,
since it can make subsequent productions only available in some cases.)
Finally, returning |FAIL_NONTERMINAL + Q|, where |Q| is a number between 1
and, currently, 999, performs a fail but applies a "quantum" to the lookahead
going on when Preform is trying to work out what's happening in a difficult
production using the one being referred to. This allows us to nudge past
potential ambiguities; it's not done much in Inform, but see for example
//if: Action Name Lists//.
@ As a convenient abbreviation, a slash character can be used to divide
alternative possibilities for a single word. For example:
= (text as Preform)
@ -309,114 +269,19 @@ wouldn't work -- it would set the word ranges the wrong way around. Instead:
says that word range 2 is to be the article of clothing, and word range 1 the
colour.
@h Implementation notes.
Most organs of the human body are located in a single place -- the heart, the
appendix, the brain -- but others, like the blood vessels or the nervous
system, are distributed throughout. So also with compilers, but Inform is
unusual in having its syntax analyser be one of these distributed organs.
This was a choice, and it was made in the interests of clarity of the
Inform source code to readers.
@ Preform turns out to be a useful notation for patterns of wording, and can
be put to other uses besides parsing source text. For these other uses, see
//Preform Utilities//. Specifically, and in rough order of complexity:
In any case, it is only the Preform grammar and the connections to it --
compositor functions, calls to single named nonterminals, and so on -- which
are dispersed throughout the body of Inform. The code to manage, internally
store and parse against Preform is all here in //words//, and the code to
represent the meaning of the result makes up //syntax//.
(*) Specifying text being generated by Inform -- see //PreformUtilities::merge//.
@ The Preform parser which occupies the entire //Preform// section is a
complex or even ingenious algorithm, which is always suspect. The main points
of difficulty are:
(*) Specifying replacements of one set of words by another -- see
//PreformUtilities::find_corresponding_word//.
(a) The grammar must not be hard-coded since users need to change it, for
translation or other purposes, so it has to be read in from a file. But it
must also be explicitly referred to in the Inform source code. This is achieved
with a sort of symbiotic relationship between the Inform source code and the
pre-processor for it in //inweb//, which takes action at compile time to
build the syntax file |Syntax.preform| read in, by default, at run time. The
arrangement works well in practice, but needs careful explanation. See
//Loading Preform// for how |Syntax.preform| is read in.
(*) Specifying miscellaneous entries for the lexicon in the Inform index -- see
//PreformUtilities::enter_lexicon//.
(b) The Preform parser has two design goals: to avoid unpredictable spikes on
time or memory when given very long texts to match, and to be as simple as it
can be, consistent with consuming, in aggregate, no more than 5-10% of the
compiler's running time. It is a non-goal to be a fully general natural
language parser -- if it can cope with Inform's needs, then that is enough.
(*) Saying how to build a trie which will detect patterns in a single word and
then modify it -- see //PreformUtilities::define_trie//.
@ So, then, //LoadPreform::load// loads the Preform grammar for a given
natural language from a file. This becomes a collection of //nonterminal//
objects, each of which is either "internal" or "regular". Regular NTs have
a list of //production_list// objects, one for each natural language in
which they are defined. (The same NT can have one definition in English and
another in, say, French.)
What production lists list is //production// objects, and each of those is
in turn a list of //ptoken// objects.[1] These can also be marked as
negated or can have alternatives supplied. Ptokens come in three varieties:
fixed words, uses of other nonterminals, and wildcards.
For example,
= (text as Preform)
<product-specification> ::=
weight <cardinal-number> kg |
height <cardinal-number> cm |
colour/color ...
=
would be read into objects in memory as follows:
= (text as BoxArt)
nonterminal REGULAR
-> production_list for its English definition
-> production
-> ptoken FIXED WORD weight
-> ptoken USAGE <cardinal-number>
-> ptoken FIXED WORD kg
-> production
-> ptoken FIXED WORD height
-> ptoken USAGE <cardinal-number>
-> ptoken FIXED WORD cm
-> production
-> ptoken FIXED WORD colour
-> ptoken FIXED WORD color
-> ptoken WILDCARD ...
=
The above grammar fell under the English production list because that was
the current language when it was read in. The current language can be
changed, e.g.,
= (text as Preform)
language French
<product-specification> ::=
poids <cardinal-number> kg |
hauteur <cardinal-number> cm |
couleur ...
language English
=
changes the language to French, supplies a French version, then changes back
to English. There would then be two production lists for <product-specification>.
[1] The "p" is silent.
@ The most technically difficult code occurs in //The Optimiser//, which
precomputes --
(*) //Length Extremes// to constrain the number of words in any match;
(*) //Nonterminal Incidences// to constrain the type of words in any match;
(*) "positions" of tokens and "struts" (runs of dividing words) inside productions.
These are all devices to enable non-matching text to be rejected quickly.
For example, "fox" cannot match |<s-literal> <s-instance-name>| because it
is too short (such a match would need at least two words), and "the fox"
cannot match |<s-adjective> <s-nounphrase>| because it does not contain any
words which are in some contexts adjectives.
@ It will be evident that Inform doesn't use parser-generators such as |yacc|,
|bison| or |antlr|. One reason is that they need the grammar to be fixed and
known at (the compiler's) compile time. Then, too, folk wisdom has it that
|yacc| parsers are typically half as fast as a shrewdly hand-coded equivalent.[1]
In any case the elegant theory of LALR parsing, though ideal for token-based
programming languages, does not specify natural language well.[2]
[1] The |gcc| C compiler abandoned the use of |bison| for exactly this reason.
[2] Which is perhaps ironic, considering that the relevant computer science
was strongly influenced by generative linguistics.
@ Finally, syntax errors in Preform are reported by //PreformUtilities::production_error//.

View file

@ -110,8 +110,8 @@ void Instrumentation::log_nt(nonterminal *nt, int detailed) {
Instrumentation::log_extremes(&(nt->opt.nt_extremes));
LOG("\n");
LOG_INDENT;
for (production_list *pl = nt->first_production_list; pl;
pl = pl->next_production_list)
for (production_list *pl = nt->first_pl; pl;
pl = pl->next_pl)
Instrumentation::log_production_list(pl, detailed);
LOG_OUTDENT;
}
@ -158,7 +158,7 @@ void Instrumentation::log_extremes(length_extremes *E) {
void Instrumentation::log_production_list(production_list *pl, int detailed) {
LOG("%J:\n", pl->definition_language);
LOG_INDENT;
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
Instrumentation::log_production(pr, detailed);
LOG("\n ");
if (pr->ins.production_tries > 0)
@ -178,8 +178,8 @@ void Instrumentation::log_production_list(production_list *pl, int detailed) {
@ =
void Instrumentation::log_production(production *pr, int detailed) {
if (pr->first_ptoken == NULL) LOG("<empty-production>");
for (ptoken *pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
if (pr->first_pt == NULL) LOG("<empty-production>");
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt) {
Instrumentation::log_ptoken(pt, detailed);
LOG(" ");
}

View file

@ -90,8 +90,8 @@ minimum match lengths of its tokens.
length_extremes LengthExtremes::calculate_for_nt(nonterminal *nt) {
length_extremes E = LengthExtremes::no_words_at_all();
int first = TRUE;
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list)
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl)
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
pr->opt.pr_extremes = LengthExtremes::calculate_for_pr(pr);
if (first) { E = pr->opt.pr_extremes; first = FALSE; }
else { E = LengthExtremes::union(E, pr->opt.pr_extremes); }
@ -101,7 +101,7 @@ length_extremes LengthExtremes::calculate_for_nt(nonterminal *nt) {
length_extremes LengthExtremes::calculate_for_pr(production *pr) {
length_extremes E = LengthExtremes::no_words_at_all();
for (ptoken *pt = pr->first_ptoken; pt; pt = pt->next_ptoken)
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt)
E = LengthExtremes::concatenate(E, LengthExtremes::calculate_for_pt(pt));
return E;
}

View file

@ -120,8 +120,8 @@ int LoadPreform::parse(wording W, NATURAL_LANGUAGE_WORDS_TYPE *L) {
@<Parse an internal nonterminal declaration@>
else if ((Wordings::last_wn(W) >= wn+2) && (Lexer::word(wn+1) == COLONCOLONEQUALS_V))
@<Parse a regular nonterminal declaration@>
else
internal_error("syntax error in Preform declarations");
else PreformUtilities::production_error(NULL, NULL,
"syntax error in Preform declarations");
}
Optimiser::optimise_counts();
return declarations;
@ -138,7 +138,8 @@ int LoadPreform::parse(wording W, NATURAL_LANGUAGE_WORDS_TYPE *L) {
#endif
if (nl == NULL) {
LOG("Missing: %S\n", lname);
internal_error("tried to define for missing language");
PreformUtilities::production_error(NULL, NULL,
"tried to define for missing language");
}
DISCARD_TEXT(lname);
current_natural_language = nl;
@ -148,8 +149,9 @@ int LoadPreform::parse(wording W, NATURAL_LANGUAGE_WORDS_TYPE *L) {
@<Parse an internal nonterminal declaration@> =
nonterminal *nt = Nonterminals::find(Lexer::word(wn));
if (nt->first_production_list)
internal_error("nonterminal internal in one definition and regular in another");
if (nt->first_pl)
PreformUtilities::production_error(nt, NULL,
"nonterminal internal in one definition and regular in another");
nt->marked_internal = TRUE;
wn++;
declarations++;
@ -166,7 +168,8 @@ and could be rejected as such, but it does no harm.
@<Parse a regular nonterminal declaration@> =
nonterminal *nt = Nonterminals::find(Lexer::word(wn));
if (nt->marked_internal)
internal_error("nonterminal internal in one definition and regular in another");
PreformUtilities::production_error(nt, NULL,
"nonterminal internal in one definition and regular in another");
production_list *pl = LoadPreform::find_list_for_language(nt, current_natural_language);
wn += 2; /* advance past the ID word and the |::=| word */
int pc = 0;
@ -197,8 +200,8 @@ independent //production_list// object.
=
typedef struct production_list {
NATURAL_LANGUAGE_WORDS_TYPE *definition_language;
struct production_list *next_production_list; /* in the list of PLs for a NT */
struct production *first_production; /* start of linked list of productions */
struct production_list *next_pl; /* in the list of PLs for a NT */
struct production *first_pr; /* start of linked list of productions */
struct match_avinue *as_avinue; /* when compiled to a trie rather than for Preform */
CLASS_DEFINITION
} production_list;
@ -207,13 +210,13 @@ typedef struct production_list {
production_list *LoadPreform::find_list_for_language(nonterminal *nt,
NATURAL_LANGUAGE_WORDS_TYPE *L) {
production_list *pl;
for (pl = nt->first_production_list; pl; pl = pl->next_production_list)
for (pl = nt->first_pl; pl; pl = pl->next_pl)
if (pl->definition_language == L)
break;
if (pl == NULL) {
pl = CREATE(production_list);
pl->definition_language = L;
pl->first_production = NULL;
pl->first_pr = NULL;
pl->as_avinue = NULL;
@<Place the new production list within the nonterminal@>;
}
@ -221,11 +224,11 @@ production_list *LoadPreform::find_list_for_language(nonterminal *nt,
}
@<Place the new production list within the nonterminal@> =
if (nt->first_production_list == NULL) nt->first_production_list = pl;
if (nt->first_pl == NULL) nt->first_pl = pl;
else {
production_list *p = nt->first_production_list;
while ((p) && (p->next_production_list)) p = p->next_production_list;
p->next_production_list = pl;
production_list *p = nt->first_pl;
while ((p) && (p->next_pl)) p = p->next_pl;
p->next_pl = pl;
}
@ It is undeniably clumsy that the linked list of PLs, and also of productions
@ -235,11 +238,11 @@ to minimise overhead.
=
void LoadPreform::add_production(production *pr, production_list *pl) {
if (pl->first_production == NULL) pl->first_production = pr;
if (pl->first_pr == NULL) pl->first_pr = pr;
else {
production *p = pl->first_production;
while ((p) && (p->next_production)) p = p->next_production;
p->next_production = pr;
production *p = pl->first_pr;
while ((p) && (p->next_pr)) p = p->next_pr;
p->next_pr = pr;
}
}
@ -264,7 +267,7 @@ only confuses the picture here.
=
typedef struct production {
struct ptoken *first_ptoken; /* the linked list of ptokens */
struct ptoken *first_pt; /* the linked list of ptokens */
int match_number; /* 0 for |/a/|, 1 for |/b/| and so on: see //About Preform// */
int no_ranges; /* actually one more, since range 0 is reserved */
@ -272,7 +275,7 @@ typedef struct production {
struct production_optimisation_data opt; /* see //The Optimiser// */
struct production_instrumentation_data ins; /* see //Instrumentation// */
struct production *next_production; /* within its production list */
struct production *next_pr; /* within its production list */
CLASS_DEFINITION
} production;
@ -311,7 +314,7 @@ typedef struct ptoken {
struct ptoken_optimisation_data opt; /* see //The Optimiser// */
struct ptoken_instrumentation_data ins; /* see //Instrumentation// */
struct ptoken *next_ptoken; /* within its production list */
struct ptoken *next_pt; /* within its production list */
CLASS_DEFINITION
} ptoken;
@ -334,7 +337,7 @@ and so on.
production *LoadPreform::new_production(wording W, nonterminal *nt, int pc) {
production *pr = CREATE(production);
pr->match_number = pc; /* "production count": 0 for first in defn, and so on */
pr->next_production = NULL;
pr->next_pr = NULL;
pr->no_ranges = 1; /* so that they count from 1; range 0 is unused */
@ -343,7 +346,7 @@ production *LoadPreform::new_production(wording W, nonterminal *nt, int pc) {
ptoken *head = NULL, *tail = NULL;
@<Parse the row of production tokens into a linked list of ptokens@>;
pr->first_ptoken = head;
pr->first_pt = head;
return pr;
}
@ -408,8 +411,11 @@ than the next number counting upwards; see //About Preform//.
rnum = Vocabulary::get_literal_number_value(Lexer::word(i+2));
i += 2;
}
if ((rnum < 1) || (rnum >= MAX_RANGES_PER_PRODUCTION))
internal_error("range number out of range");
if ((rnum < 1) || (rnum >= MAX_RANGES_PER_PRODUCTION)) {
PreformUtilities::production_error(nt, pr,
"range number out of range");
rnum = 1;
}
bracing_begins_at->range_starts = rnum;
tail->range_ends = rnum;
@ -427,8 +433,11 @@ than the next number counting upwards; see //About Preform//.
(pt->ptoken_category == MULTIPLE_WILDCARD_PTC) ||
(pt->ptoken_category == POSSIBLY_EMPTY_WILDCARD_PTC)) {
int rnum = pr->no_ranges++;
if ((rnum < 1) || (rnum >= MAX_RANGES_PER_PRODUCTION))
internal_error("range number out of range");
if ((rnum < 1) || (rnum >= MAX_RANGES_PER_PRODUCTION)) {
PreformUtilities::production_error(nt, pr,
"range number out of range");
rnum = 1;
}
pt->range_starts = rnum;
pt->range_ends = rnum;
}
@ -447,20 +456,30 @@ rather than the next number counting upwards; see //About Preform//.
if ((i+2 <= Wordings::last_wn(W)) && (Lexer::word(i+1) == QUESTIONMARK_V) &&
(Vocabulary::test_flags(i+2, NUMBER_MC))) {
pt->result_index = Vocabulary::get_literal_number_value(Lexer::word(i+2));
if ((pt->result_index < 0) || (pt->result_index >= MAX_RESULTS_PER_PRODUCTION))
internal_error("result number out of range");
if ((pt->result_index < 0) ||
(pt->result_index >= MAX_RESULTS_PER_PRODUCTION)) {
PreformUtilities::production_error(nt, pr,
"result number out of range");
pt->result_index = 1;
}
i += 2;
} else {
pt->result_index = result_count;
}
result_count++;
} else internal_error("too many nonterminals for one production to hold");
} else {
PreformUtilities::production_error(nt, pr,
"too many nonterminals for one production to hold");
}
@<Add the new ptoken to the production@> =
if (token_count++ < MAX_PTOKENS_PER_PRODUCTION) {
if (head == NULL) head = pt; else tail->next_ptoken = pt;
if (head == NULL) head = pt; else tail->next_pt = pt;
tail = pt;
} else internal_error("too many tokens on production for nonterminal");
} else {
PreformUtilities::production_error(nt, pr,
"too many tokens on production for nonterminal");
}
@ Here we porse what is, to the Lexer, a single word (at word number |wn|),
but which might actually be a row of possibilities divided by slashes:
@ -543,7 +562,7 @@ ptoken *LoadPreform::new_ptoken(vocabulary_entry *ve, int unescaped, nonterminal
}
@<Begin with a blank ptoken@> =
pt->next_ptoken = NULL;
pt->next_pt = NULL;
pt->ptoken_category = FIXED_WORD_PTC;
pt->balanced_wildcard = FALSE;

View file

@ -461,9 +461,9 @@ void NTI::simplify_pair(nti_constraint *ntic, nti_constraint *prev) {
=
void NTI::simplify_nt(nonterminal *nt) {
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
nti_constraint *prev_req = NULL;
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
NTI::simplify_pair(&(pr->opt.pr_ntic), prev_req);
prev_req = &(pr->opt.pr_ntic);
}
@ -481,9 +481,9 @@ void NTI::calculate_constraint(nonterminal *nt) {
}
@<Mark up fixed wording in the grammar for NT with the NT's incidence bit@> =
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list)
for (production *pr = pl->first_production; pr; pr = pr->next_production)
for (ptoken *pt = pr->first_ptoken; pt; pt = pt->next_ptoken)
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl)
for (production *pr = pl->first_pr; pr; pr = pr->next_pr)
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt)
if ((pt->ptoken_category == FIXED_WORD_PTC) && (pt->negated_ptoken == FALSE))
for (ptoken *alt = pt; alt; alt = alt->alternative_ptoken)
NTI::mark_vocabulary(alt->ve_pt, nt);
@ -492,13 +492,13 @@ void NTI::calculate_constraint(nonterminal *nt) {
@<Calculate requirement for NT@> =
nti_constraint nnt = nt->opt.nt_ntic;
int first_production = TRUE;
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production *pr = pl->first_production; pr; pr = pr->next_production) {
int first_pr = TRUE;
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
@<Calculate requirement for production@>;
if (first_production) nnt = pr->opt.pr_ntic;
if (first_pr) nnt = pr->opt.pr_ntic;
else NTI::disjoin_rreq(&nnt, &(pr->opt.pr_ntic));
first_production = FALSE;
first_pr = FALSE;
}
}
nt->opt.nt_ntic = nnt;
@ -509,7 +509,7 @@ ptokens.
@<Calculate requirement for production@> =
nti_constraint prt = NTI::unconstrained();
int first = TRUE;
for (ptoken *pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt) {
int empty = FALSE;
nti_constraint tok_ntic = NTI::unconstrained();
@<Calculate requirement for ptoken@>;

View file

@ -113,7 +113,7 @@ typedef struct nonterminal {
int voracious; /* if true, scans whole rest of word range */
/* For regular nonterminals */
struct production_list *first_production_list; /* if not internal, this defines it */
struct production_list *first_pl; /* if not internal, this defines it */
int (*compositor_fn)(int *r, void **rp, int *i_s, void **i_ps, wording *i_W, wording W);
int multiplicitous; /* if true, matches are alternative syntax tree readings */
int number_words_by_production; /* this parses names for numbers, like "huit" or "zwei" */
@ -183,7 +183,7 @@ nonterminal *Nonterminals::find(vocabulary_entry *name_word) {
nt->internal_definition = NULL;
nt->voracious = FALSE;
nt->first_production_list = NULL;
nt->first_pl = NULL;
nt->compositor_fn = NULL;
nt->multiplicitous = FALSE;
nt->number_words_by_production = FALSE; /* i.e., don't */

View file

@ -1,49 +1,27 @@
[Preform::Nonparsing::] Non-Parsing Preform.
[PreformUtilities::] Preform Utilities.
Other uses for Preform grammar, including the generation of adaptive
text, and word inflection.
@h Introduction.
Looked at more generally, Preform isn't just a parser syntax: it's a general-purpose way to specify
textual patterns, so we may as well take advantage of it for miscellaneous
other needs. There are altogether five non-parsing uses for Preform; in
order of complexity,
(a) Specifying text being generated by Inform;
(b) Specifying replacements of one set of words by another;
(c) Specifying miscellaneous entries for the lexicon in the index;
(d) Saying how to build a trie which will detect patterns in a single word and
then modify it;
(e) Saying how to conjugate a verb, that is, how to modify the wording of a
verb ("take", say) into all of its different forms (I take, he takes, it was
taken, I am taking, and so on). This we'll leave for later.
Speed is not of the essence in any of these problems.
@h (a) Specifying generated text.
@h Specifying generated text.
Our main operation here is a "merge". This extracts the text from a production,
substituting the ingredient text in place of any |...| it finds. (Other
wildcards and nonterminals are ignored.) For example, merging the production
= (text as InC)
= (text as Preform)
fried ... tomatoes
=
with "orange" results in "fried orange tomatoes".
=
word_assemblage Preform::Nonparsing::merge(nonterminal *nt, int pnum, word_assemblage ingredient) {
production_list *pl;
for (pl = nt->first_production_list; pl; pl = pl->next_production_list) {
word_assemblage PreformUtilities::merge(nonterminal *nt, int pnum,
word_assemblage ingredient) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
int N = 0;
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
if (N == pnum) {
word_assemblage wa = WordAssemblages::lit_0();
ptoken *pt;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
for (pt = pr->first_pt; pt; pt = pt->next_pt) {
if (pt->ptoken_category == FIXED_WORD_PTC) {
wa = WordAssemblages::join(wa, WordAssemblages::lit_1(pt->ve_pt));
} else if (pt->ptoken_category == MULTIPLE_WILDCARD_PTC) {
@ -62,15 +40,15 @@ word_assemblage Preform::Nonparsing::merge(nonterminal *nt, int pnum, word_assem
ingredient text:
=
word_assemblage Preform::Nonparsing::wording(nonterminal *nt, int pnum) {
return Preform::Nonparsing::merge(nt, pnum, WordAssemblages::lit_0());
word_assemblage PreformUtilities::wording(nonterminal *nt, int pnum) {
return PreformUtilities::merge(nt, pnum, WordAssemblages::lit_0());
}
@ And here we take just one word:
=
vocabulary_entry *Preform::Nonparsing::word(nonterminal *nt, int pnum) {
word_assemblage wa = Preform::Nonparsing::merge(nt, pnum, WordAssemblages::lit_0());
vocabulary_entry *PreformUtilities::word(nonterminal *nt, int pnum) {
word_assemblage wa = PreformUtilities::merge(nt, pnum, WordAssemblages::lit_0());
vocabulary_entry **words;
int num_words;
WordAssemblages::as_array(&wa, &words, &num_words);
@ -78,68 +56,46 @@ vocabulary_entry *Preform::Nonparsing::word(nonterminal *nt, int pnum) {
return NULL;
}
@h (b) Specifying replacements.
The following looks for a word in one nonterminal and replaces it with the
@h Specifying replacements.
The following looks for a word in one nonterminal and returns the
corresponding word in another. If the word isn't found, it's left unchanged.
=
vocabulary_entry *Preform::Nonparsing::replace_word(vocabulary_entry *ve,
vocabulary_entry *PreformUtilities::find_corresponding_word(vocabulary_entry *ve,
nonterminal *nt_from, nonterminal *nt_to) {
production_list *pl_from, *pl_to;
for (pl_from = nt_from->first_production_list,
pl_to = nt_to->first_production_list;
for (production_list *pl_from = nt_from->first_pl, *pl_to = nt_to->first_pl;
((pl_from) && (pl_to));
pl_from = pl_from->next_production_list,
pl_to = pl_to->next_production_list) {
production *pr_from, *pr_to;
for (pr_from = pl_from->first_production,
pr_to = pl_to->first_production;
pl_from = pl_from->next_pl, pl_to = pl_to->next_pl)
for (production *pr_from = pl_from->first_pr, *pr_to = pl_to->first_pr;
((pr_from) && (pr_to));
pr_from = pr_from->next_production,
pr_to = pr_to->next_production) {
ptoken *pt_from, *pt_to;
for (pt_from = pr_from->first_ptoken,
pt_to = pr_to->first_ptoken;
pr_from = pr_from->next_pr, pr_to = pr_to->next_pr)
for (ptoken *pt_from = pr_from->first_pt, *pt_to = pr_to->first_pt;
((pt_from) && (pt_to));
pt_from = pt_from->next_ptoken,
pt_to = pt_to->next_ptoken) {
pt_from = pt_from->next_pt, pt_to = pt_to->next_pt)
if ((pt_from->ptoken_category == FIXED_WORD_PTC) &&
(pt_to->ptoken_category == FIXED_WORD_PTC)) {
if (ve == pt_from->ve_pt) return pt_to->ve_pt;
}
}
}
}
(pt_to->ptoken_category == FIXED_WORD_PTC))
if (ve == pt_from->ve_pt)
return pt_to->ve_pt;
return ve; /* no change, in other words */
}
@h (c) Lexicon entry.
@h Lexicon entry.
This is only a convenience for putting particles into the Lexicon:
=
#ifdef CORE_MODULE
void Preform::Nonparsing::enter_lexicon(nonterminal *nt_from, int pos, char *category, char *gloss) {
production_list *pl;
for (pl = nt_from->first_production_list; pl; pl = pl->next_production_list) {
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
ptoken *pt;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
ptoken *alt;
for (alt = pt; alt; alt = alt->alternative_ptoken) {
vocabulary_entry *ve = alt->ve_pt;
if (ve) {
void PreformUtilities::enter_lexicon(nonterminal *nt, int pos, char *category, char *gloss) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl)
for (production *pr = pl->first_pr; pr; pr = pr->next_pr)
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt)
for (ptoken *alt = pt; alt; alt = alt->alternative_ptoken)
if (alt->ve_pt)
Index::Lexicon::new_entry_with_details(EMPTY_WORDING, pos,
WordAssemblages::lit_1(ve), category, gloss);
}
}
}
}
}
WordAssemblages::lit_1(alt->ve_pt), category, gloss);
}
#endif
@h (d) Making tries.
@h Making tries.
Properly speaking, we make "avinues". Note that we expect to make a different
avinue for each natural language; this matters so that we can pluralise words
correctly in both English and French in the same run of Inform, for example.
@ -147,17 +103,15 @@ But we are going to need to use these avinues frequently, so we cache them once
created.
=
match_avinue *Preform::Nonparsing::define_trie(nonterminal *nt, int end, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl == NULL) nl = English_language;
match_avinue *PreformUtilities::define_trie(nonterminal *nt, int end,
NATURAL_LANGUAGE_WORDS_TYPE *nl) {
match_avinue *ave = NULL;
production_list *pl;
for (pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl)
if (pl->definition_language == nl) {
if (pl->as_avinue) return pl->as_avinue;
@<Construct a new avinue from this nonterminal@>;
pl->as_avinue = ave;
}
}
return ave;
}
@ -168,14 +122,14 @@ single avinue.
@<Construct a new avinue from this nonterminal@> =
int list_grammar = NOT_APPLICABLE; /* i.e., we don't know yet */
production *pr;
for (pr = pl->first_production; pr; pr = pr->next_production) {
ptoken *first = pr->first_ptoken;
for (production *pr = pl->first_pr; pr; pr = pr->next_pr) {
ptoken *first = pr->first_pt;
if (first == NULL) continue;
ptoken *second = first->next_ptoken;
if ((second) && (second->next_ptoken)) {
ptoken *second = first->next_pt;
if ((second) && (second->next_pt)) {
Instrumentation::log_production(pr, FALSE);
Conjugation::trie_definition_error(nt, pr, "trie line with more than 2 words");
PreformUtilities::production_error(nt, pr,
"trie line with more than 2 words");
}
@<Consider the one- or two-token production in this nonterminal@>;
}
@ -215,20 +169,20 @@ override the normal convention.
} else {
if (list_grammar == TRUE) @<Throw problem for a mixed trie nonterminal@>;
if (second == NULL)
Conjugation::trie_definition_error(nt, pr,
PreformUtilities::production_error(nt, pr,
"there should be two words here, a pattern and an instruction");
@<Add this pattern and instruction to the trie, creating it if we haven't already started one@>;
@<Add this pattern and instruction to the trie, creating it if necessary@>;
list_grammar = FALSE;
}
@<Throw problem for a mixed trie nonterminal@> =
Conjugation::trie_definition_error(nt, pr,
PreformUtilities::production_error(nt, pr,
"this should either be a list of other nonterminals, or a list of patterns "
"and instructions, but not a mixture");
@<Recurse to make an avinue from the nonterminal named here, and add it to our result@> =
match_avinue *next_mt =
Tries::duplicate_avinue(Preform::Nonparsing::define_trie(entry->nt_pt, this_end, nl));
Tries::duplicate_avinue(PreformUtilities::define_trie(entry->nt_pt, this_end, nl));
if (ave == NULL) ave = next_mt;
else {
match_avinue *m = ave;
@ -236,7 +190,7 @@ override the normal convention.
m->next = next_mt;
}
@<Add this pattern and instruction to the trie, creating it if we haven't already started one@> =
@<Add this pattern and instruction to the trie, creating it if necessary@> =
if (ave == NULL) ave = Tries::new_avinue(end);
TEMPORARY_TEXT(from);
WRITE_TO(from, "%V", first->ve_pt);
@ -246,15 +200,64 @@ override the normal convention.
@ The following may be useful for debugging:
=
void Preform::Nonparsing::log_avinues(void) {
void PreformUtilities::log_avinues(void) {
nonterminal *nt;
LOOP_OVER(nt, nonterminal) {
production_list *pl;
for (pl = nt->first_production_list; pl; pl = pl->next_production_list) {
if (pl->as_avinue) {
LOOP_OVER(nt, nonterminal)
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl)
if (pl->as_avinue)
LOG("\n\n%V ($J)\n%a",
nt->nonterminal_id, pl->definition_language, pl->as_avinue);
}
}
}
}
@h Errors.
People are going to get their tries wrong; it's a very hard notation
to learn. No end users of Inform will ever write them at all -- this is a
low-level feature for translators only -- but translators need all the help
they can get, so we'll try to provide good problem messages.
=
void PreformUtilities::production_error(nonterminal *nt, production *pr, char *message) {
PreformUtilities::error(WordAssemblages::lit_0(), nt, pr, message);
}
@ Some tools using this module will want to push simple error messages out to
the command line; others will want to translate them into elaborate problem
texts in HTML. So the client is allowed to define |PREFORM_ERROR_WORDS_CALLBACK|
to some routine of her own, gazumping this one.
=
void PreformUtilities::error(word_assemblage base_text, nonterminal *nt,
production *pr, char *message) {
#ifdef PREFORM_ERROR_WORDS_CALLBACK
PREFORM_ERROR_WORDS_CALLBACK(base_text, nt, pr, message);
#endif
#ifndef PREFORM_ERROR_WORDS_CALLBACK
if (pr) {
LOG("The production at fault is:\n");
Instrumentation::log_production(pr, FALSE); LOG("\n");
}
TEMPORARY_TEXT(ERM);
if (nt == NULL)
WRITE_TO(ERM, "(no nonterminal)");
else
WRITE_TO(ERM, "nonterminal %w",
Vocabulary::get_exemplar(nt->nonterminal_id, FALSE));
WRITE_TO(ERM, ": ");
if (WordAssemblages::nonempty(base_text))
WRITE_TO(ERM, "can't conjugate verb '%A': ", &base_text);
if (pr) {
TEMPORARY_TEXT(TEMP);
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt) {
Instrumentation::write_ptoken(TEMP, pt);
if (pt->next_pt) WRITE_TO(TEMP, " ");
}
WRITE_TO(ERM, "line %d ('%S'): ", pr->match_number, TEMP);
DISCARD_TEXT(TEMP);
}
WRITE_TO(ERM, "%s", message);
Errors::with_text("Preform error: %S", ERM);
DISCARD_TEXT(ERM);
#endif
}

View file

@ -100,11 +100,11 @@ an internal NT, or try all possible productions for a regular one.
@<Try to match to a regular NT@> =
if ((unoptimised) || (NTI::nt_bitmap_violates(W, &(nt->opt.nt_ntic)) == FALSE)) {
void *acc_result = NULL;
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list) {
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
NATURAL_LANGUAGE_WORDS_TYPE *nl = pl->definition_language;
if ((primary_Preform_language == NULL) || (primary_Preform_language == nl)) {
int ditto_result = FALSE;
for (production *pr = pl->first_production; pr; pr = pr->next_production)
for (production *pr = pl->first_pr; pr; pr = pr->next_pr)
@<Try to match to a production@>;
}
}
@ -290,7 +290,7 @@ are in those positions.
@<Try a fast scan through the production@> =
int wn = -1, tc = 0;
for (ptoken *pt = pr->first_ptoken; pt; pt = pt->next_ptoken, tc++) {
for (ptoken *pt = pr->first_pt; pt; pt = pt->next_pt, tc++) {
if (pt->opt.ptoken_is_fast) {
int p = pt->opt.ptoken_position;
if (p > 0) wn = Wordings::first_wn(W)+p-1;
@ -388,13 +388,13 @@ ptokens.
int wn = Wordings::first_wn(W), tc;
ptoken *pt, *nextpt;
if (backtrack_token) {
pt = backtrack_token; nextpt = backtrack_token->next_ptoken;
pt = backtrack_token; nextpt = backtrack_token->next_pt;
tc = backtrack_tc; wn = backtrack_to;
goto Reenter;
}
for (pt = pr->first_ptoken, nextpt = (pt)?(pt->next_ptoken):NULL, tc = 0;
for (pt = pr->first_pt, nextpt = (pt)?(pt->next_pt):NULL, tc = 0;
pt;
pt = nextpt, nextpt = (pt)?(pt->next_ptoken):NULL, tc++) {
pt = nextpt, nextpt = (pt)?(pt->next_pt):NULL, tc++) {
Reenter: ;
int known_pos = checked[tc];
if (known_pos >= 0) {
@ -559,7 +559,7 @@ int Preform::next_strut_posn_after(wording W, ptoken *start, int len, int from)
while (from <= last_legal_position) {
ptoken *pt;
int pos = from;
for (pt = start; pt; pt = pt->next_ptoken) {
for (pt = start; pt; pt = pt->next_pt) {
if (pt->ptoken_category == FIXED_WORD_PTC) {
if (Preform::parse_fixed_word_ptoken(pos, pt)) pos++;
else break;

View file

@ -129,8 +129,8 @@ void Optimiser::optimise_nonterminal(nonterminal *nt) {
nt->opt.optimised_in_this_pass = TRUE;
nt->opt.nt_extremes = LengthExtremes::calculate_for_nt(nt);
for (production_list *pl = nt->first_production_list; pl; pl = pl->next_production_list)
for (production *pr = pl->first_production; pr; pr = pr->next_production)
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl)
for (production *pr = pl->first_pr; pr; pr = pr->next_pr)
Optimiser::optimise_production(pr);
NTI::calculate_constraint(nt);
}
@ -160,7 +160,7 @@ starts and finishes; it's not enough just to know where it starts.
@<Compute front-end ptoken positions@> =
int posn = 1;
ptoken *pt;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
for (pt = pr->first_pt; pt; pt = pt->next_pt) {
last = pt;
int L = Optimiser::ptoken_width(pt);
if ((posn != 0) && (L != PTOKEN_ELASTIC)) {
@ -191,8 +191,8 @@ production, but this is never larger than about 10.
} else break;
ptoken *prevt = NULL;
for (prevt = pr->first_ptoken; prevt; prevt = prevt->next_ptoken)
if (prevt->next_ptoken == pt)
for (prevt = pr->first_pt; prevt; prevt = prevt->next_pt)
if (prevt->next_pt == pt)
break;
pt = prevt;
}
@ -204,7 +204,7 @@ position then all of them have, but we're in no hurry so we don't exploit that.)
@<Compute struts within the production@> =
pr->opt.no_struts = 0;
ptoken *pt;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken) {
for (pt = pr->first_pt; pt; pt = pt->next_pt) {
if ((pt->opt.ptoken_position == 0) &&
(Optimiser::ptoken_width(pt) != PTOKEN_ELASTIC)) {
if (pr->opt.no_struts >= MAX_STRUTS_PER_PRODUCTION) continue;
@ -214,8 +214,8 @@ position then all of them have, but we're in no hurry so we don't exploit that.)
(Optimiser::ptoken_width(pt) != PTOKEN_ELASTIC)) {
pt->opt.strut_number = pr->opt.no_struts;
pr->opt.strut_lengths[pr->opt.no_struts] += Optimiser::ptoken_width(pt);
if (pt->next_ptoken == NULL) break; /* should be impossible */
pt = pt->next_ptoken;
if (pt->next_pt == NULL) break; /* should be impossible */
pt = pt->next_pt;
}
pr->opt.no_struts++;
}
@ -223,7 +223,7 @@ position then all of them have, but we're in no hurry so we don't exploit that.)
@<Work out which ptokens are fast@> =
ptoken *pt;
for (pt = pr->first_ptoken; pt; pt = pt->next_ptoken)
for (pt = pr->first_pt; pt; pt = pt->next_pt)
if ((pt->ptoken_category == FIXED_WORD_PTC) && (pt->opt.ptoken_position != 0)
&& (pt->range_starts < 0) && (pt->range_ends < 0))
pt->opt.ptoken_is_fast = TRUE;

View file

@ -36,3 +36,4 @@ Chapter 4: Parsing
Preform
Basic Nonterminals
Instrumentation
Preform Utilities

View file

@ -53,6 +53,10 @@ following alphabetical list has references to fuller explanations:
have the opportunity to flag certain Preform nonterminals in ways which will
help //The Optimiser//.
(*) |PREFORM_ERROR_WORDS_CALLBACK| allows the parent to issue errors about
Preform definitions in its own way; they will otherwise by default be standard
command-line error message written to |STDERR|.
(*) |PROBLEM_WORDS_CALLBACK| is called when a lexical error is found, and can
prevent this from being issued to the terminal as an error message: see
//Lexer::lexer_problem_handler//.