1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-17 07:40:47 +03:00

Started in on inflections

This commit is contained in:
Graham Nelson 2020-05-23 22:57:42 +01:00
parent a77ae3b34b
commit eace688fea
55 changed files with 1170 additions and 444 deletions

View file

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

View file

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

View file

@ -132,7 +132,7 @@ thing which is being compiled when it is.
<span class="plain-syntax"> </span><span class="identifier-syntax">inform7_task</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">stage_of_compilation</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inform7_task</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_resource_number</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">English_language</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Projects::get_language_of_syntax</span><span class="plain-syntax">(</span><span class="identifier-syntax">project</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InflectionDefns::set_default_nl</span><span class="plain-syntax">(</span><span class="identifier-syntax">Projects::get_language_of_syntax</span><span class="plain-syntax">(</span><span class="identifier-syntax">project</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><a href="1-htc.html#SP2" class="function-link"><span class="function-syntax">Sequence::carry_out</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TargetVMs::debug_enabled</span><span class="plain-syntax">(</span><span class="identifier-syntax">inform7_task</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">task</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">for_vm</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inform7_task</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>

View file

@ -103,7 +103,7 @@ trouble to search the existing dictionary here.
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">V</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</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="named-paragraph-container code-font"><a href="3-pd.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Forbid plural declarations containing quoted text</span><span class="named-paragraph-number">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><a href="9-tc.html#SP11" class="function-link"><span class="function-syntax">Assertions::Creator::vet_name_for_noun</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="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="identifier-syntax">Pluralisation::register</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</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">Pluralisation::register</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">InflectionDefns::default_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="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>

View file

@ -1527,7 +1527,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;adaptive-adjective&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Projects::get_language_of_play</span><span class="Preform-plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="Preform-function-syntax">Task::project</span></a><span class="Preform-plain-syntax">()) == </span><span class="Preform-identifier-syntax">English_language</span><span class="Preform-plain-syntax">) </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</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">Projects::get_language_of_play</span><span class="Preform-plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="Preform-function-syntax">Task::project</span></a><span class="Preform-plain-syntax">()) == </span><span class="Preform-identifier-syntax">InflectionDefns::default_nl</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">NULL</span><span class="Preform-plain-syntax">)) </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">adjectival_phrase</span><span class="Preform-plain-syntax"> *</span><span class="Preform-identifier-syntax">aph</span><span class="Preform-plain-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">LOOP_OVER</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">aph</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">adjectival_phrase</span><span class="Preform-plain-syntax">) {</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">wording</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">AW</span><span class="Preform-plain-syntax"> = </span><span class="Preform-identifier-syntax">Clusters::get_name_general</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">aph</span><span class="Preform-plain-syntax">-&gt;</span><span class="Preform-identifier-syntax">adjective_names</span><span class="Preform-plain-syntax">, </span><span class="Preform-identifier-syntax">Projects::get_language_of_play</span><span class="Preform-plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="Preform-function-syntax">Task::project</span></a><span class="Preform-plain-syntax">()), </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax">, -1);</span>
@ -1544,7 +1544,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Adjectives::Meanings::agreements</span><button class="popup" onclick="togglePopup('usagePopup38')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup38">Usage of <span class="code-font"><span class="function-syntax">Adjectives::Meanings::agreements</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_8">&#167;2.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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Projects::get_language_of_play</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::project</span></a><span class="plain-syntax">()) == </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Projects::get_language_of_play</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::project</span></a><span class="plain-syntax">()) == </span><span class="identifier-syntax">InflectionDefns::default_nl</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="identifier-syntax">adjectival_phrase</span><span class="plain-syntax"> *</span><span class="identifier-syntax">aph</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">aph</span><span class="plain-syntax">, </span><span class="identifier-syntax">adjectival_phrase</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">Clusters::get_name_general</span><span class="plain-syntax">(</span><span class="identifier-syntax">aph</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">adjective_names</span><span class="plain-syntax">, </span><span class="identifier-syntax">Projects::get_language_of_play</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::project</span></a><span class="plain-syntax">()), </span><span class="constant-syntax">1</span><span class="plain-syntax">, -1);</span>

View file

@ -185,7 +185,7 @@ and is a somewhat provisional feature for now.
<span class="plain-syntax"> </span><span class="identifier-syntax">inform_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_defn_language</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">, </span><span class="identifier-syntax">gender_reference_ANNOT</span><span 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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"No such 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">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">nl</span><span class="plain-syntax"> == </span><span class="identifier-syntax">InflectionDefns::default_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">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_CantTranslateIntoEnglish</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"you can't translate into English"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"only out of it."</span><span class="plain-syntax">);</span>

View file

@ -165,7 +165,7 @@ as the object.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;verb-implies-sentence-subject&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">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;natural-language&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;infinitive-declaration&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[2]; &lt;&lt;inform_language:nl&gt;&gt; = (inform_language *) (RP[1]);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;infinitive-declaration&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; &lt;&lt;inform_language:nl&gt;&gt; = English_language;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;infinitive-declaration&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; &lt;&lt;inform_language:nl&gt;&gt; = InflectionDefns::default_nl(NULL);</span>
<span class="Preform-function-syntax">&lt;infinitive-declaration&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">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;infinitive-usage&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; &lt;&lt;giving-parts&gt;&gt; = TRUE</span>
@ -715,7 +715,7 @@ foreign verbs (4).
<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><span class="identifier-syntax">VerbMeanings::get_relational_meaning</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">vm</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">a_has_b_predicate</span><span class="plain-syntax">) </span><span class="identifier-syntax">p</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">bp</span><span class="plain-syntax"> == </span><span class="identifier-syntax">R_equality</span><span class="plain-syntax">) </span><span class="identifier-syntax">p</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) &amp;&amp; (</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="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="constant-syntax">5</span><span 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">) &amp;&amp; (</span><span class="identifier-syntax">nl</span><span class="plain-syntax"> != </span><span class="identifier-syntax">InflectionDefns::default_nl</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))) </span><span class="identifier-syntax">p</span><span class="plain-syntax"> = </span><span class="constant-syntax">5</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ++</span><span class="identifier-syntax">new_verb_sequence_count</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>
@ -801,13 +801,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::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">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_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">InflectionDefns::default_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">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">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">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">InflectionDefns::default_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">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>
<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">3</span><span class="plain-syntax">);</span>
@ -1341,7 +1341,7 @@ usages to the debugging log.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">vu</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">"(null verb usage)"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</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">"VU: $f "</span><span class="plain-syntax">, &amp;(</span><span class="identifier-syntax">vu</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">vu_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">vu</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">negated_form_of_verb</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"(negated) "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Linguistics::log_tense_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">vu</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">tensed</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InflectionDefns::log_tense_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">vu</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">tensed</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">NewVerbs::log_all</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">NewVerbs::log_all</span></span>:<br/>Main Routine - <a href="1-mr.html#SP1_6">&#167;1.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>

View file

@ -266,7 +266,7 @@ from sentences, and this can include I6 properties with no I7 analogue.
<span class="plain-syntax"> </span><span class="identifier-syntax">this_is_named_for_something_with_a_printed_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-tnt.html#SP11_1_1" class="named-paragraph-link"><span class="named-paragraph">Issue problem message if the name contains a comma</span><span class="named-paragraph-number">11.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">this_has_a_printed_name</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="3-tnt.html#SP11_1_2" class="named-paragraph-link"><span class="named-paragraph">Assert the printed name property</span><span class="named-paragraph-number">11.1.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Projects::get_language_of_play</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::project</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">Projects::get_language_of_play</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::project</span><span class="plain-syntax">()) != </span><span class="identifier-syntax">InflectionDefns::default_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="named-paragraph-container code-font"><a href="3-tnt.html#SP11_1_4" class="named-paragraph-link"><span class="named-paragraph">Assert male, female, neuter adjectives from grammatical gender</span><span class="named-paragraph-number">11.1.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>

View file

@ -127,7 +127,7 @@ which use this module:
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="1-im.html#SP3">&#167;3</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">1</li><li class="progresscurrent">im</li><li class="progresschapter"><a href="2-ld.html">2</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-ld.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="P-htitm.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresscurrentchapter">1</li><li class="progresscurrent">im</li><li class="progresschapter"><a href="2-ld.html">2</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-ld.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -72,11 +72,13 @@ function togglePopup(material_id) {
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NO_KNOWN_GENDERS</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">NEUTER_GENDER</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> can be used as Scandinavian "common gender"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">NEUTER_GENDER</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> or can be used as Scandinavian "common gender"</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MASCULINE_GENDER</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">FEMININE_GENDER</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>There are six "persons":
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>There are six "persons". The sequence corresponds to the defined constants
in the English Language extension, which we assume will be followed by other
languages.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">NO_KNOWN_PERSONS</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span>
@ -101,15 +103,9 @@ function togglePopup(material_id) {
<span class="definition-keyword">define</span> <span class="constant-syntax">ACTIVE_MOOD</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">PASSIVE_MOOD</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>25 cases ought to be plenty, though some languages are pretty scary this
way: Hungarian, for example, has 18. We only require one case to exist, the
nominative, which is required to be case 0.
</p>
<p class="commentary">But this covers a pretty decent selection. Note that, as with the
persons above, the sequence corresponds to the defined constants in the
English Language extension, which we assume will be followed by other
languages.
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>25 cases sounds like plenty, but some languages are pretty scary this
way: Hungarian has 18. We only require one case to exist, the nominative,
which is required to be case 0.
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_GRAMMATICAL_CASES</span><span class="plain-syntax"> </span><span class="constant-syntax">25</span>
@ -126,18 +122,20 @@ tense 5 for the past historic.
<span class="definition-keyword">define</span> <span class="constant-syntax">HASBEEN_TENSE</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> Present perfect</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">HADBEEN_TENSE</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> Past perfect</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WILLBE_TENSE</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> Future (not used in assertions or conditions)</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">CUSTOM1_TENSE</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">CUSTOM2_TENSE</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Linguistics::log_tense_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InflectionDefns::log_tense_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</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">t</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">IS_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"IS_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">WAS_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"WAS_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">IS_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"IS_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">WAS_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"WAS_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">HASBEEN_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"HASBEEN_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">HADBEEN_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"HADBEEN_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">WILLBE_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"WILLBE_TENSE"</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">5</span><span class="plain-syntax">: </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"CUSTOM1_TENSE"</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">6</span><span class="plain-syntax">: </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"CUSTOM2_TENSE"</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">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;invalid-tense&gt;"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">WILLBE_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"WILLBE_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CUSTOM1_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"CUSTOM1_TENSE"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CUSTOM2_TENSE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"CUSTOM2_TENSE"</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">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;invalid-tense&gt;"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
@ -146,15 +144,19 @@ in its run.
</p>
<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="identifier-syntax">default_language_for_linguistics</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InflectionDefns::set_default_nl</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="identifier-syntax">default_language_for_linguistics</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">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="function-syntax">InflectionDefns::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">InflectionDefns::default_nl</span></span>:<br/>Article Inflection - <a href="3-ai.html#SP1">&#167;1</a><br/>Declensions - <a href="3-dcl.html#SP2">&#167;2</a>, <a href="3-dcl.html#SP3">&#167;3</a><br/>Name Clusters - <a href="3-nc.html#SP3">&#167;3</a>, <a href="3-nc.html#SP4">&#167;4</a>, <a href="3-nc.html#SP4_1_1">&#167;4.1.1</a><br/>Pluralisation - <a href="3-plr.html#SP3">&#167;3</a>, <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>, <a href="3-ga.html#SP4">&#167;4</a><br/>Past Participles - <a href="3-pp.html#SP2">&#167;2</a><br/>Verb Conjugation - <a href="3-vc.html#SP2">&#167;2</a>, <a href="3-vc.html#SP4_2_1">&#167;4.2.1</a>, <a href="3-vc.html#SP14">&#167;14</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><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">default_language_for_linguistics</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-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>
<ul class="progressbar"><li class="progressprev"><a href="1-im.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">ld</li><li class="progresssection"><a href="2-tai.html">tai</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

@ -83,7 +83,7 @@ the same as the original.
</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">Inflections::suffix_inflection</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">Inflections::suffix_inflection</span></span>:<br/><a href="2-tai.html#SP2">&#167;2</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></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Inflections::suffix_inflection</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">Inflections::suffix_inflection</span></span>:<br/><a href="2-tai.html#SP2">&#167;2</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>, <a href="3-ga.html#SP4">&#167;4</a><br/>Past Participles - <a href="3-pp.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</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">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">T</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">return</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">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">result</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -116,7 +116,7 @@ do more than simply fiddle with the final letters.
</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">Inflections::apply_trie_to_wa</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">Inflections::apply_trie_to_wa</span></span>:<br/>Name Clusters - <a href="2-nc.html#SP4_1_1">&#167;4.1.1</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">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="identifier-syntax">match_avinue</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">Inflections::apply_trie_to_wa</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">Inflections::apply_trie_to_wa</span></span>:<br/>Name Clusters - <a href="3-nc.html#SP4_1_1">&#167;4.1.1</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">word_assemblage</span><span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><span class="identifier-syntax">match_avinue</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">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">no_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">no_words</span><span class="plain-syntax">);</span>
@ -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-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>
<ul class="progressbar"><li class="progressprev"><a href="2-ld.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-ld.html">ld</a></li><li class="progresscurrent">tai</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

@ -58,9 +58,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">inflections</a></li><li><a href="index.html#3">Chapter 3: Grammatical Uses of Inflection</a></li><li><b>Article Inflection</b></li></ul></div>
<p class="purpose">To inflect "a" into "an", and so forth.</p>
<ul class="toc"><li><a href="3-ai.html#SP1">&#167;1. The indefinite article trie</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. The indefinite article trie. </b>Here we take text such as "UNESCO document" and put an article in front, to
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>Here we take text such as "UNESCO document" and put an article in front, to
get "a UNESCO document" (and not "an UNESCO document": these things are much
trickier than they look).
</p>
@ -68,20 +66,20 @@ trickier than they look).
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">match_avinue</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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ArticleInflection::preface_by_article</span><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">initial_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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ArticleInflection::preface_by_article</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">initial_text</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">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><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><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-nc.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">ai</li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-dcl.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="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">ai</li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-nc.html">nc</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-dcl.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -80,15 +80,15 @@ function togglePopup(material_id) {
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::decline</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">Declensions::decline</span></span>:<br/>Name Clusters - <a href="2-nc.html#SP3">&#167;3</a>, <a href="2-nc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</span><span 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="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::decline</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">Declensions::decline</span></span>:<br/>Name Clusters - <a href="3-nc.html#SP3">&#167;3</a>, <a href="3-nc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">declension</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_inner</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">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;noun-declension&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-dcl.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Fix the origin</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::decline_article</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</span><span 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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">declension</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_inner</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">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">num</span><span class="plain-syntax">, </span><span class="function-syntax">&lt;article-declension&gt;</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-dcl.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Fix the origin</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
@ -110,7 +110,7 @@ function togglePopup(material_id) {
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::decline_inner</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">Declensions::decline_inner</span></span>:<br/><a href="3-dcl.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">num</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="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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">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_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>
@ -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><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">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">InflectionDefns::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>
@ -248,7 +248,7 @@ function togglePopup(material_id) {
<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>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::in_case</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">Declensions::in_case</span></span>:<br/>Name Clusters - <a href="2-nc.html#SP6">&#167;6</a>, <a href="2-nc.html#SP7">&#167;7</a>, <a href="2-nc.html#SP8">&#167;8</a></span></button><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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Declensions::in_case</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">Declensions::in_case</span></span>:<br/>Name Clusters - <a href="3-nc.html#SP6">&#167;6</a>, <a href="3-nc.html#SP7">&#167;7</a>, <a href="3-nc.html#SP8">&#167;8</a></span></button><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">int</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"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </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="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"case out of range"</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">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>
@ -293,7 +293,7 @@ function togglePopup(material_id) {
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-ai.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresscurrent">dcl</li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-plr.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-ai.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresscurrent">dcl</li><li class="progresssection"><a href="3-nc.html">nc</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-nc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -59,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">inflections</a></li><li><a href="index.html#3">Chapter 3: Grammatical Uses of Inflection</a></li><li><b>Grading Adjectives</b></li></ul></div>
<p class="purpose">To inflect adjectives into comparative and superlative forms.</p>
<ul class="toc"><li><a href="3-ga.html#SP1">&#167;1. Constructing comparatives</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Constructing comparatives. </b>In English, the comparative of an adjective can generally be formed by
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>In English, the comparative of an adjective can generally be formed by
suffixing the inflected form with "than"; thus, "big" to "bigger than".
The following does the suffixing:
</p>
@ -71,7 +69,8 @@ The following does the suffixing:
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">than</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b></p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>This is essentially a wrapper function for the trie &lt;adjective-to-comparative&gt;.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Grading::make_comparative</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
@ -81,9 +80,10 @@ 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">"some-long-text"</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">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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">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><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><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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
@ -95,7 +95,11 @@ The following does the suffixing:
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">comprised</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">PW</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>This is essentially a wrapper function for the trie &lt;adjective-to-superlative&gt;.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Grading::make_superlative</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">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">TEMPORARY_TEXT</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">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">transformed</span><span class="plain-syntax">);</span>
@ -103,9 +107,10 @@ 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">"some-long-text"</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">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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">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><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><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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
@ -114,10 +119,10 @@ The following does the suffixing:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PW</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>There has to be a better term than "quiddity" for this grammatical construct,
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>This is essentially a wrapper function for the trie &lt;adjective-to-quiddity&gt;.
There has to be a better term than "quiddity" for this grammatical concept,
but what I mean is the property for which the given adjective makes a
comparison: for instance, "tallness" for "tall", or "steeliness" for
"steely".
comparison: for instance, "tallness" for "tall", or "steeliness" for "steely".
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -128,9 +133,10 @@ 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">"some-long-text"</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">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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">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><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><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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
@ -140,7 +146,7 @@ comparison: for instance, "tallness" for "tall", or "steeliness" for
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-plr.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresscurrent">ga</li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-pp.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-plr.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-nc.html">nc</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresscurrent">ga</li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-pp.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -63,10 +63,10 @@ function togglePopup(material_id) {
<main role="main">
<!--Weave of 'Name Clusters' 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>Name Clusters</b></li></ul></div>
<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>Name Clusters</b></li></ul></div>
<p class="purpose">Name clusters are sets of noun or adjective forms, perhaps multiple or in multiple languages, which have in common that they share a meaning.</p>
<ul class="toc"><li><a href="2-nc.html#SP1">&#167;1. Cluster</a></li><li><a href="2-nc.html#SP5">&#167;5. Plural fixing</a></li><li><a href="2-nc.html#SP6">&#167;6. Searching declensions</a></li><li><a href="2-nc.html#SP9">&#167;9. Meanings</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="3-nc.html#SP1">&#167;1. Cluster</a></li><li><a href="3-nc.html#SP5">&#167;5. Plural fixing</a></li><li><a href="3-nc.html#SP6">&#167;6. Searching declensions</a></li><li><a href="3-nc.html#SP9">&#167;9. Meanings</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Cluster. </b>A cluster is a linked list of wordings, in effect, but they are annotated
with lingistic roles. For example, the cluster of names for the common noun
@ -82,7 +82,7 @@ with lingistic roles. For example, the cluster of names for the common noun
<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">name_cluster</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">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">listed</span><span class="plain-syntax">; </span><span class="comment-syntax"> of </span><span class="extract"><span class="extract-syntax">individual_name</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax">;</span>
@ -91,8 +91,7 @@ with lingistic roles. For example, the cluster of names for the common noun
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> text of name</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">name_number</span><span class="plain-syntax">; </span><span class="comment-syntax"> 1 for singular, 2 for plural</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">name_gender</span><span class="plain-syntax">; </span><span class="comment-syntax"> 1 is neuter, 2 is masculine, 3 is feminine</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name_language</span><span class="plain-syntax">; </span><span class="comment-syntax"> always non-null</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next</span><span class="plain-syntax">; </span><span class="comment-syntax"> within its cluster</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name_language</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">;</span>
</pre>
@ -103,7 +102,7 @@ with lingistic roles. For example, the cluster of names for the common noun
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="function-syntax">Clusters::new</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">names</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">names</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_name</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">names</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">listed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">individual_name</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">names</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -111,26 +110,28 @@ with lingistic roles. For example, the cluster of names for the common noun
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Clusters::add</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">Clusters::add</span></span>:<br/><a href="2-nc.html#SP3_1">&#167;3.1</a>, <a href="2-nc.html#SP4">&#167;4</a>, <a href="2-nc.html#SP4_1">&#167;4.1</a>, <a href="2-nc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pluralise</span><span 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="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Clusters::add_one</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">Clusters::add_one</span></span>:<br/><a href="3-nc.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">principal_meaning</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL_GENERAL_POINTER</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline</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">gender</span><span class="plain-syntax">, </span><span class="identifier-syntax">number</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_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">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_number</span><span class="plain-syntax"> = </span><span class="identifier-syntax">number</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_gender</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gender</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">names</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">names</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</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">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in2</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">in2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">names</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax">; ((</span><span class="identifier-syntax">in2</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">in2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">)); </span><span class="identifier-syntax">in2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in2</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">in2</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</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">pluralise</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">number</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-nc.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Add plural names as well</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">names</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed</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">in</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Clusters::add</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">Clusters::add</span></span>:<br/><a href="3-nc.html#SP4">&#167;4</a>, <a href="3-nc.html#SP4_1">&#167;4.1</a>, <a href="3-nc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pluralise</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><a href="3-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add_one</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">names</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="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="identifier-syntax">number</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">pluralise</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">number</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-nc.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Add plural names as well</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3_1"></a><b>&#167;3.1. </b>The following makes all possible plurals and registers those too. (Note
that every instance gets a plural name: even something palpably unique, like
@ -150,13 +151,13 @@ so there may be any number of names registered: for instance, the kind
<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">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pde</span><span class="plain-syntax"> = </span><a href="3-plr.html#SP3" class="function-link"><span class="function-syntax">Pluralisation::make</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><span class="identifier-syntax">pde</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::nonempty</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">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTRUCTED_PLURALS</span><span class="plain-syntax">, </span><span class="string-syntax">"(%d) Reading plural of &lt;%W&gt; as &lt;%W&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">PW</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="constant-syntax">2</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">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">CONSTRUCTED_PLURALS</span><span class="plain-syntax">, </span><span class="string-syntax">"(%d) Plural of &lt;%W&gt;: &lt;%W&gt;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">k</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>
<span class="plain-syntax"> </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><a href="3-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add_one</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">gender</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">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</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">pde</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-nc.html#SP3">&#167;3</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="3-nc.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>The following is more suited to adjectives, or to words which are used
adjectivally, such as past participles in French. This time we generate all
possible gender and number agreements &mdash; except in English, where no variation
@ -169,15 +170,14 @@ combinations. Here we only work through six, ignoring animation:
</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">Clusters::add_with_agreements</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">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="reserved-syntax">if</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><a href="2-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</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="constant-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="constant-syntax">1</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="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gna</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">gna</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">gna</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">6</span><span class="plain-syntax">; </span><span class="identifier-syntax">gna</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-nc.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Generate agreement form in this GNA and add to the declension</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">void</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::add_with_agreements</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">nl</span><span class="plain-syntax"> == </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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><a href="3-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</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="constant-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="constant-syntax">1</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="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gna</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">gna</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">6</span><span class="plain-syntax">; </span><span class="identifier-syntax">gna</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-nc.html#SP4_1" class="named-paragraph-link"><span class="named-paragraph">Generate agreement form in this GNA and add to the declension</span><span class="named-paragraph-number">4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4_1"></a><b>&#167;4.1. </b>We use tries to modify the base text, which is taken to be the neuter
@ -206,10 +206,10 @@ singular form, into the other five forms.
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">: </span><span class="identifier-syntax">step1</span><span class="plain-syntax"> = </span><span class="function-syntax">&lt;adjective-to-plural&gt;</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">FW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-nc.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Process via the agreement trie in this pipeline</span><span class="named-paragraph-number">4.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">FW</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">form_gender</span><span class="plain-syntax">, </span><span class="identifier-syntax">form_number</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-nc.html#SP4_1_1" class="named-paragraph-link"><span class="named-paragraph">Process via the agreement trie in this pipeline</span><span class="named-paragraph-number">4.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="3-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">FW</span><span class="plain-syntax">, </span><span class="identifier-syntax">nl</span><span class="plain-syntax">, </span><span class="identifier-syntax">form_gender</span><span class="plain-syntax">, </span><span class="identifier-syntax">form_number</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-nc.html#SP4">&#167;4</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="3-nc.html#SP4">&#167;4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4_1_1"></a><b>&#167;4.1.1. </b>Not much of a pipeline, really: we start with the base case and work
through one or two tries.
</p>
@ -221,13 +221,15 @@ 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><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="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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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><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">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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
<ul class="endnotetexts"><li>This code is used in <a href="3-nc.html#SP4_1">&#167;4.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. Plural fixing. </b>Less elegantly, we can force the plural of a name in a cluster to a given
fixed text, overwriting it if it's already there. In practice this is done
only when the built-in kinds are being given plural names; some of these
@ -236,14 +238,15 @@ and wouldn't pass through the pluralising tries intact.
</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">Clusters::set_plural_name</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nl</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::set_plural_name</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">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">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</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">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</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">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_number</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">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><a href="3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline</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="constant-syntax">NEUTER_GENDER</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">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="constant-syntax">2</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-nc.html#SP3" class="function-link"><span class="function-syntax">Clusters::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">NEUTER_GENDER</span><span class="plain-syntax">, </span><span class="constant-syntax">2</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="SP6"></a><b>&#167;6. Searching declensions. </b>These are always quite small, so there's no need for any efficient device
@ -255,11 +258,11 @@ or plural):
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::get_name</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">Clusters::get_name</span></span>:<br/><a href="2-nc.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_flag</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::get_name</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">Clusters::get_name</span></span>:<br/><a href="3-nc.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_flag</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">number_sought</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">plural_flag</span><span class="plain-syntax">) </span><span class="identifier-syntax">number_sought</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">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</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">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</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">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_number</span><span class="plain-syntax"> == </span><span class="identifier-syntax">number_sought</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::in_case</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">), </span><span class="constant-syntax">NOMINATIVE_CASE</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">EMPTY_WORDING</span><span class="plain-syntax">;</span>
@ -270,15 +273,16 @@ falling back on English if there's none registered:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::get_name_in_play</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_flag</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="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::get_name_in_play</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plural_flag</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number_sought</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">plural_flag</span><span class="plain-syntax">) </span><span class="identifier-syntax">number_sought</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">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</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">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</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">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_number</span><span class="plain-syntax"> == </span><span class="identifier-syntax">number_sought</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_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">return</span><span class="plain-syntax"> </span><a href="3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::in_case</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">), </span><span class="constant-syntax">NOMINATIVE_CASE</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-nc.html#SP6" class="function-link"><span class="function-syntax">Clusters::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_flag</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-nc.html#SP6" class="function-link"><span class="function-syntax">Clusters::get_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cl</span><span class="plain-syntax">, </span><span class="identifier-syntax">plural_flag</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>A more specific search, which can optionally test for number and gender.
@ -288,7 +292,7 @@ falling back on English if there's none registered:
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::get_name_general</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number_sought</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gender_sought</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</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">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</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">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">number_sought</span><span class="plain-syntax"> == -1) || (</span><span class="identifier-syntax">number_sought</span><span class="plain-syntax"> == </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_number</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">gender_sought</span><span class="plain-syntax"> == -1) || (</span><span class="identifier-syntax">gender_sought</span><span class="plain-syntax"> == </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_gender</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name_language</span><span class="plain-syntax"> == </span><span class="identifier-syntax">nl</span><span class="plain-syntax">))</span>
@ -308,12 +312,14 @@ to an <span class="extract"><span class="extract-syntax">excerpt_meaning</span><
<span class="plain-syntax">}</span>
<span class="identifier-syntax">general_pointer</span><span class="plain-syntax"> </span><span class="function-syntax">Clusters::get_principal_meaning</span><span class="plain-syntax">(</span><span class="reserved-syntax">name_cluster</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL_GENERAL_POINTER</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">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_name</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">principal_meaning</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="reserved-syntax">individual_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">cl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">listed</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">in</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">principal_meaning</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL_GENERAL_POINTER</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-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>
<ul class="progressbar"><li class="progressprev"><a href="3-dcl.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresscurrent">nc</li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-plr.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -108,9 +108,9 @@ one not found in the dictionary).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">plural_dictionary_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">Pluralisation::make</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">Pluralisation::make</span></span>:<br/>Name Clusters - <a href="2-nc.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PW</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">plural_dictionary_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">Pluralisation::make</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">Pluralisation::make</span></span>:<br/>Name Clusters - <a href="3-nc.html#SP3_1">&#167;3.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">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="reserved-syntax">plural_dictionary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">search_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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">plural_dictionary_entry</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pde</span><span class="plain-syntax">;</span>
@ -169,14 +169,15 @@ has a plural, and modifies it to the plural form.
<pre class="displayed-code all-displayed-code code-font">
<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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">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><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="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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-dcl.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresscurrent">plr</li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-ga.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-nc.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-nc.html">nc</a></li><li class="progresscurrent">plr</li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-ga.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -104,12 +104,13 @@ 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><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="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>
<span class="plain-syntax"> </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-ga.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresscurrent">pp</li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-vc.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-ga.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-nc.html">nc</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresscurrent">pp</li><li class="progresssection"><a href="3-vc.html">vc</a></li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="3-vc.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -125,7 +125,7 @@ conjugation to another.
<span class="reserved-syntax">verb_conjugation</span><span class="plain-syntax"> *</span><span class="function-syntax">Conjugation::conjugate_with_overrides</span><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">word_assemblage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">overrides</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_overrides</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">nl</span><span class="plain-syntax"> = </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">WordAssemblages::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">base_text</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"No base text for verb conjugation"</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><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="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">InflectionDefns::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>
@ -996,7 +996,7 @@ from our dictionary of 14,000 or so present and past participles.
<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::test_participle</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">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="identifier-syntax">WordAssemblages::from_wording</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><a href="2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">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#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>
@ -1022,7 +1022,7 @@ as markers in verb conjugations.
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-pp.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresscurrent">vc</li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="4-ei.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-pp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresssection"><a href="3-ai.html">ai</a></li><li class="progresssection"><a href="3-dcl.html">dcl</a></li><li class="progresssection"><a href="3-nc.html">nc</a></li><li class="progresssection"><a href="3-plr.html">plr</a></li><li class="progresssection"><a href="3-ga.html">ga</a></li><li class="progresssection"><a href="3-pp.html">pp</a></li><li class="progresscurrent">vc</li><li class="progresschapter"><a href="4-ei.html">4</a></li><li class="progressnext"><a href="4-ei.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -59,76 +59,9 @@
<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#4">Chapter 4: Default Language</a></li><li><b>English Inflections</b></li></ul></div>
<p class="purpose">To define how English nouns and verbs are inflected.</p>
<ul class="toc"><li><a href="4-ei.html#SP1">&#167;1. Preface</a></li><li><a href="4-ei.html#SP3">&#167;3. Noun inflections</a></li><li><a href="4-ei.html#SP7">&#167;7. Plural inflections</a></li><li><a href="4-ei.html#SP16">&#167;16. Verb inflections</a></li><li><a href="4-ei.html#SP47">&#167;47. Present to past participles</a></li><li><a href="4-ei.html#SP48">&#167;48. Adjective agreements</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="4-ei.html#SP1">&#167;1. Noun inflections</a></li><li><a href="4-ei.html#SP5">&#167;5. Plural inflections</a></li><li><a href="4-ei.html#SP14">&#167;14. Verb inflections</a></li><li><a href="4-ei.html#SP45">&#167;45. Present to past participles</a></li><li><a href="4-ei.html#SP46">&#167;46. Adjective agreements</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Preface. </b>Inflections are modifications of words &mdash; usually word endings or beginnings &mdash;
for different circumstances. English is often called an uninflected language,
but this is an exaggeration. For example, we spell the word "tree" as
"trees" if it refers to more than one of them. Inform sometimes needs
to take text in one form and change it to another &mdash; for example, to turn
a singular noun into a plural one &mdash; and ordinary Preform parsing isn't good
enough to express this.
</p>
<p class="commentary">Inform uses a data structure called a "trie" as an efficient way to match
prefix and/or suffix patterns in words, and then to modify them. These tries
are created using the same notation as for Preform grammar, which is
convenient in many ways, but also a little misleading &mdash; they are parsed quite
differently. The rules are as follows:
</p>
<ul class="items"><li>(a) A nonterminal in trie grammar can either be a list of other tries, or it
can be a list of inflection rules. Mixtures of the two are not allowed. For
example <span class="extract"><span class="extract-syntax">&lt;singular-noun-to-its-indefinite-article&gt;</span></span> is a list of other tries, while
<span class="extract"><span class="extract-syntax">&lt;en-trie-indef-a&gt;</span></span> contains actual rules.
</li><li>(b) In a list of tries, each production consists only of a single nonterminal
identifying the trie to make use of. One exception: writing <span class="extract"><span class="extract-syntax">...</span></span> before the
trie's name makes it work on the end of a word instead of the beginning.
Inform attempts to find a match using each trie in turn, until a match is
found.
</li><li>(c) In a list of inflection rules, each production consists of two words. The
first word is what to match; the second gives instructions on what to turn
it into. An asterisk is used to mean "any string of 0 or more letters";
a digit in the replacement text means "truncate by this many letters and
add...". (As a special case, the replacement text "0" means: make no
change.) Some examples:
</li></ul>
<p class="commentary"><span class="extract"><span class="extract-syntax">lead gold</span></span> turns "lead" into "gold"
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">codex codices</span></span> turns "codex" to "codices"
</p>
<p class="commentary"><span class="extract"><span class="extract-syntax">*mouse 5mice</span></span> turns "mouse" to "mice", or "fieldmouse" to "fieldmice"
</p>
<p class="commentary">Designing a trie is not quite as easy as it looks. It looks as if this is a
sequence of tests to perform in succession, but it's better to think of the
rules all being performed at once. In general, if you need one inflection
rule to take precedence over another, put it in an earlier trie, rather than
putting it earlier in the same trie.
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>Tries are highly language specific and should not be translated as such:
instead, an appropriate version needs to be written for every language.
</p>
<p class="commentary">Except at the very top level, translators are free to created new tries
and name them as they please. For example, the Spanish implementation of
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="function-syntax">&lt;singular-noun-to-its-indefinite-article&gt;</span>
</pre>
<p class="commentary">may look entirely unlike its English version, but at the top level it still
has to have that name.
</p>
<p class="commentary">Lower-level tries used in the implementation should have names beginning
with a language code: hence the names "en-" used below.
</p>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. Noun inflections. </b>The following trie looks at the start of a word, which we assume to be a
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Noun inflections. </b>The following trie looks at the start of a word, which we assume to be a
noun, and decides whether to use the indefinite article "a" or "an".
This is much more complicated than simply looking for a vowel as the first
letter, as people often think until they try a few cases.
@ -145,7 +78,7 @@ dictionary and the "Official Scrabble Wordlist".
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;en-trie-indef-c&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>Exceptions to the exceptions:
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. </b>Exceptions to the exceptions:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -158,7 +91,7 @@ dictionary and the "Official Scrabble Wordlist".
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">uvarovite*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">an</span><span class="Preform-plain-syntax"> </span><span class="Preform-comment-syntax"> a rare emerald-green garnet, Ca3Cr2(SiO4)3</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>Then the exceptions:
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>Then the exceptions:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -228,7 +161,7 @@ dictionary and the "Official Scrabble Wordlist".
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">uvu*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">a</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>And finally the basic rules:
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>And finally the basic rules:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -288,7 +221,7 @@ dictionary and the "Official Scrabble Wordlist".
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">yw*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">an</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. Plural inflections. </b>The following takes a single word, assumes it to be a noun which meaningfully
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. Plural inflections. </b>The following takes a single word, assumes it to be a noun which meaningfully
has a plural, and modifies it to the plural form. ("Golf" is a noun which
doesn't sensibly have a plural; the algorithm here would return "golves".)
</p>
@ -334,7 +267,7 @@ of a sibilant plus "o" suffix to include an "e", so that Conway produces
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;en-trie-plural-append-s&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>See Conway's table A.2. The following nouns, mostly names of kinds of animal,
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. </b>See Conway's table A.2. The following nouns, mostly names of kinds of animal,
have the same plural as singular form: for example, chamois, salmon, goldfish.
</p>
@ -392,7 +325,7 @@ have the same plural as singular form: for example, chamois, salmon, goldfish.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">pincers</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>We may as well pluralise pronouns while we're at it.
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </b>We may as well pluralise pronouns while we're at it.
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -421,7 +354,7 @@ have the same plural as singular form: for example, chamois, salmon, goldfish.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">oneself</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">oneselves</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>We now reach Conway step 4. These are irregular plurals mostly coming
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. </b>We now reach Conway step 4. These are irregular plurals mostly coming
from archaisms.
</p>
@ -442,7 +375,7 @@ from archaisms.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">trilby</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">trilbys</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>Step 5. Now we reach a batch of irregular but fairly general inflected
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </b>Step 5. Now we reach a batch of irregular but fairly general inflected
endings; for example, protozoon to protozoa, or metamorphosis to metamorphoses.
Note that we differ from Conway in pluralizing blouse as blouses, not blice.
</p>
@ -462,7 +395,7 @@ Note that we differ from Conway in pluralizing blouse as blouses, not blice.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*xis</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">3xes</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>Step 6. These are inflections from Latin and Greek which have survived
<p class="commentary firstcommentary"><a id="SP10"></a><b>&#167;10. </b>Step 6. These are inflections from Latin and Greek which have survived
into modern English:
</p>
@ -494,7 +427,7 @@ into modern English:
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ovum</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">ova</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>Step 11a. (We're not implementing Conway's steps in sequence: see below.)
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. </b>Step 11a. (We're not implementing Conway's steps in sequence: see below.)
These -o endings are mostly loan words from Romance languages whose original
inflections are assimilated.
</p>
@ -535,7 +468,7 @@ inflections are assimilated.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">tempo</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">tempos</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. </b>Conway steps 8 to 11. These are regular inflections depending only on
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b>Conway steps 8 to 11. These are regular inflections depending only on
word endings.
</p>
@ -621,7 +554,7 @@ word endings.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*zo</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0s</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. </b>Lastly, the fallback if none of the above cases match: append an -s, of
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b>Lastly, the fallback if none of the above cases match: append an -s, of
course.
</p>
@ -630,7 +563,7 @@ course.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0s</span><span class="Preform-plain-syntax"> </span><span class="Preform-comment-syntax"> Step 13</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. Verb inflections. </b>"Le verbe est l'âme d'une langue" (attributed to Georges Duhamel). And the
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. Verb inflections. </b>"Le verbe est l'âme d'une langue" (attributed to Georges Duhamel). And the
care of the soul is, of course, complicated. For example, the source text can
say something like this:
</p>
@ -666,7 +599,7 @@ of the possibilities we need to make, and write a trie to handle each one.
is, how the different word forms map onto the possible tenses, persons,
numbers, and so on.
</li></ul>
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </b>This gives us a certain amount of choice. What exactly is "too irregular"?
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. </b>This gives us a certain amount of choice. What exactly is "too irregular"?
In French, are all -er, -ir, and -re verbs "regular"? (Consider "aller",
for example.) In English, it's possible to say that there are seven or so
classes of verbs, all regular by their own standards; but most people say
@ -701,7 +634,7 @@ example, to set has just three distinct forms &mdash; to set, he sets, he set, h
had set, setting.
</p>
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. </b>Form types are numbered from 0 up to, potentially, a constant
<p class="commentary firstcommentary"><a id="SP16"></a><b>&#167;16. </b>Form types are numbered from 0 up to, potentially, a constant
called <span class="extract"><span class="Preform-extract-syntax">MAX_FORM_TYPES</span></span>. (This is so large that there shouldn't ever be need
for more.) Form type 0 is always the original text, and is used as the basis
from which the others are generated. For English verbs Inform always sets form
@ -728,7 +661,7 @@ each language. English needs two: the present (5) and past (6) forms.
<span class="definition-keyword">define</span> <span class="Preform-constant-syntax">ADJOINT_INFINITIVE_FORM_TYPE</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">4</span>
<span class="definition-keyword">define</span> <span class="Preform-constant-syntax">MAX_FORM_TYPES</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">123</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19"></a><b>&#167;19. </b>We're now ready to write the <span class="extract"><span class="Preform-extract-syntax">&lt;verb-conjugation-instructions&gt;</span></span>. This is
<p class="commentary firstcommentary"><a id="SP17"></a><b>&#167;17. </b>We're now ready to write the <span class="extract"><span class="Preform-extract-syntax">&lt;verb-conjugation-instructions&gt;</span></span>. This is
a block which looks at the infinitive of the verb and decides which of
several conjugations should be used. Badly irregular verbs get
conjugations of their own, and others are grouped together. In French,
@ -754,7 +687,7 @@ least one line, and the best way to ensure that is to finish up with <span class
as the last pattern &mdash; this matches anything.
</p>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. </b>The instructions for English are quite concise, except for the presence
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. </b>The instructions for English are quite concise, except for the presence
of the awkward contracted informal forms of verbs. (These aren't used in
Inform assertion sentences, but are needed for text substitutions.)
</p>
@ -788,7 +721,7 @@ Inform assertion sentences, but are needed for text substitutions.)
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;regular-verb-conjugation&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP21"></a><b>&#167;21. </b>We will start with two auxiliary verbs, that is, verbs used to construct
<p class="commentary firstcommentary"><a id="SP19"></a><b>&#167;19. </b>We will start with two auxiliary verbs, that is, verbs used to construct
forms of other verbs. The first is "to have"; as we'll see, English uses
this to construct perfect tenses:
</p>
@ -851,7 +784,7 @@ for "[have]".
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;to-have-tabulation&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP22"></a><b>&#167;22. </b>Tabulations give instructions for how to construct 120 possible versions
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. </b>Tabulations give instructions for how to construct 120 possible versions
of the verb. These are divided up first into active and passive "moods":
</p>
@ -990,7 +923,7 @@ are used for the six persons.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">a2-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">had</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">not</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP23"></a><b>&#167;23. </b>And this is an example of splitting into cases for the six persons,
<p class="commentary firstcommentary"><a id="SP21"></a><b>&#167;21. </b>And this is an example of splitting into cases for the six persons,
1PS, 2PS, 3PS, 1PP, 2PP, 3PP. I have, you have, he has, we have, you have,
they have. (This is more excitingly varied in other languages, of course.)
</p>
@ -1000,7 +933,7 @@ they have. (This is more excitingly varied in other languages, of course.)
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">have</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">have</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">has</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">have</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">have</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">have</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP24"></a><b>&#167;24. </b>Next we have "to do", which is like "to have" in being fairly regular,
<p class="commentary firstcommentary"><a id="SP22"></a><b>&#167;22. </b>Next we have "to do", which is like "to have" in being fairly regular,
as irregular verbs go. But we treat this as a special case because, again,
we're going to need as an auxiliary verb when forming negatives ("Peter
does not wear the hat" &mdash; note the "does not"). But this time we give
@ -1066,7 +999,7 @@ may have to revisit this for languages other than English.)
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">do</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">do</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">does</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">do</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">do</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">do</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP25"></a><b>&#167;25. </b>Regular English verbs, then, look like so. We will, for the first time,
<p class="commentary firstcommentary"><a id="SP23"></a><b>&#167;23. </b>Regular English verbs, then, look like so. We will, for the first time,
make heavy use of our numbered verb forms: for example, for the verb
"to take", they would be "take" (1), "taking" (2), "taken" (3),
"takes" (5) and "took" (6). We start with the infinitive ("take")
@ -1098,7 +1031,7 @@ to "grabs onto", "grabbing onto" and so on.
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;regular-verb-tabulation&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP26"></a><b>&#167;26. </b>Here we see our auxiliary verbs in use. For the negated present tense,
<p class="commentary firstcommentary"><a id="SP24"></a><b>&#167;24. </b>Here we see our auxiliary verbs in use. For the negated present tense,
"Peter does not carry the ball"; for the negated past tense, "Peter did
not carry the ball" &mdash; in both cases, this is "to do" plus the infinitive
"take". For the perfect tenses, "to have" plus the past participle &mdash;
@ -1122,7 +1055,7 @@ a bequest".)
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">p*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">3</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">by</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP27"></a><b>&#167;27. </b>This looks odd, but what it says is that the present tense of a regular
<p class="commentary firstcommentary"><a id="SP25"></a><b>&#167;25. </b>This looks odd, but what it says is that the present tense of a regular
English verb is always the infinitive (I take, you take, we take, and so on)
except for third person singular (he takes), which is different. (It's usually
what the plural of the infinitive would be if the infinitive were a noun,
@ -1134,7 +1067,7 @@ as we'll see.)
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">5</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP28"></a><b>&#167;28. </b>Now for our most irregular verb: "to be".
<p class="commentary firstcommentary"><a id="SP26"></a><b>&#167;26. </b>Now for our most irregular verb: "to be".
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -1160,7 +1093,7 @@ as we'll see.)
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">was</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">were</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">was</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">were</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">were</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">were</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP29"></a><b>&#167;29. </b>Except for tense formation (Peter "will" take the ball), the most common
<p class="commentary firstcommentary"><a id="SP27"></a><b>&#167;27. </b>Except for tense formation (Peter "will" take the ball), the most common
modal verb which can be used in Inform source text is "can". For example:
</p>
@ -1199,7 +1132,7 @@ to elide, so we always pronounce it that way and the spelling now follows.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">a5-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">will</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">not</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">be</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">able</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">++1</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP30"></a><b>&#167;30. </b>Inform has only a simple understanding of what "can" means, so it doesn't
<p class="commentary firstcommentary"><a id="SP28"></a><b>&#167;28. </b>Inform has only a simple understanding of what "can" means, so it doesn't
allow the source text to use "can" in combination with arbitrary verbs.
Instead, each legal combination has to be declared explicitly:
</p>
@ -1242,7 +1175,7 @@ Jane".
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">p</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">be</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">able</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">be</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">3</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">4</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">by</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP31"></a><b>&#167;31. </b>The following handles the other English modal verbs ("might", "should"
<p class="commentary firstcommentary"><a id="SP29"></a><b>&#167;29. </b>The following handles the other English modal verbs ("might", "should"
and so on) surprisingly easily. The notation <span class="extract"><span class="Preform-extract-syntax">++1</span></span> means that the verb
being modified should appear in verb form 1, and so on: for example,
"might not lead" as "might not" plus form 1 of "to lead", i.e., "lead".
@ -1267,7 +1200,7 @@ being modified should appear in verb form 1, and so on: for example,
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">a5-</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">4</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">not</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">++1</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP32"></a><b>&#167;32. </b>That completes our basic kit of verbs nicely. What's left is used only
<p class="commentary firstcommentary"><a id="SP30"></a><b>&#167;30. </b>That completes our basic kit of verbs nicely. What's left is used only
for generating text at run-time &mdash; for printing adaptive messages, that is;
none of these oddball exceptional cases is otherwise used as a verb in
Inform source text. None of them has any meaning to Inform.
@ -1329,7 +1262,7 @@ dialects &mdash; and we aren't even going to try to cope with that.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">wasn't</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">weren't</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">wasn't</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">weren't</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">weren't</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">weren't</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP33"></a><b>&#167;33. </b>And now "to 've", the contracted form of "to have". A subtle dialect
<p class="commentary firstcommentary"><a id="SP31"></a><b>&#167;31. </b>And now "to 've", the contracted form of "to have". A subtle dialect
point here concerns the negated present tense:
</p>
@ -1380,7 +1313,7 @@ go with those.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">'ve</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">'ve</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">'s</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">'ve</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">'ve</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">'ve</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP34"></a><b>&#167;34. </b>Now we come to "aren't", a negated form of "to be", but where the
<p class="commentary firstcommentary"><a id="SP32"></a><b>&#167;32. </b>Now we come to "aren't", a negated form of "to be", but where the
contraction occurs between the verb and the "not" rather than between
the subject and the verb.
</p>
@ -1418,7 +1351,7 @@ that option here.)
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">haven't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">been</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">haven't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">been</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">hasn't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">been</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">haven't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">been</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">haven't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">been</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">haven't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">been</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP35"></a><b>&#167;35. </b>And finally: the contracted informal negatives of various modal verbs which
<p class="commentary firstcommentary"><a id="SP33"></a><b>&#167;33. </b>And finally: the contracted informal negatives of various modal verbs which
it's useful to be able to print, like the "can't" in
</p>
@ -1451,7 +1384,7 @@ of "modal" itself arguable. This is the best we can do.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">7</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP36"></a><b>&#167;36. </b>Together with special rules for can't, which is inevitably slightly different:
<p class="commentary firstcommentary"><a id="SP34"></a><b>&#167;34. </b>Together with special rules for can't, which is inevitably slightly different:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -1469,7 +1402,7 @@ of "modal" itself arguable. This is the best we can do.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">a5+</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">won't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">be</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">able</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">++1</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP37"></a><b>&#167;37. </b>We have special tries just to list the forms of the cases we will
<p class="commentary firstcommentary"><a id="SP35"></a><b>&#167;35. </b>We have special tries just to list the forms of the cases we will
deal with. Tries can do fancy things (see below), but here they act just as
a look-up table: for example, "won't" has present "won't", past
"wouldn't" and future "won't".
@ -1517,7 +1450,7 @@ signs can be used if we absolutely have to introduce spaces.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">shouldn't</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">shouldn't</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP38"></a><b>&#167;38. </b>That's the end of the conjugations &mdash; the easy part, it turns out. We now
<p class="commentary firstcommentary"><a id="SP36"></a><b>&#167;36. </b>That's the end of the conjugations &mdash; the easy part, it turns out. We now
need to create the four tries to make verb forms out of the infinitive:
the present participle, the past participle, the third-person singular
present tense, and the past tense.
@ -1560,7 +1493,7 @@ no easy way to tell. Consider deter to deterring (stress on second syllable
of deter), but meter to metering (stress on first syllable of meter).
</p>
<p class="commentary firstcommentary"><a id="SP39"></a><b>&#167;39. </b>The following algorithm is due to Toby Nelson, who produced it from a
<p class="commentary firstcommentary"><a id="SP37"></a><b>&#167;37. </b>The following algorithm is due to Toby Nelson, who produced it from a
dictionary of 14,689 English verbs, some of them quite obscure (to torpefy,
anyone? to spuilzie? to cachinnate?). It's essentially a more detailed
version of Greenbaum's rules above.
@ -1575,7 +1508,7 @@ version of Greenbaum's rules above.
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;en-trie-regular-c-present-participle&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP40"></a><b>&#167;40. </b>First of all there are some irregular cases &mdash; some for the usual suspects,
<p class="commentary firstcommentary"><a id="SP38"></a><b>&#167;38. </b>First of all there are some irregular cases &mdash; some for the usual suspects,
but others for oddball verbs where English breaks the normal phonetic rules
for the sake of clarity. For example, the participle of "singe" ought to
be "singing", but in fact we write "singeing", purely to make it different
@ -1771,7 +1704,7 @@ from the act of producing a song.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">undersaye</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1ing</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP41"></a><b>&#167;41. </b>Now some exceptional forms where consonant doubling doesn't occur:
<p class="commentary firstcommentary"><a id="SP39"></a><b>&#167;39. </b>Now some exceptional forms where consonant doubling doesn't occur:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -1792,7 +1725,7 @@ from the act of producing a song.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*daub</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0ing</span><span class="Preform-plain-syntax"> </span><span class="Preform-comment-syntax"> daubing, bedaubing</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP42"></a><b>&#167;42. </b>And now rules for consonant doubling:
<p class="commentary firstcommentary"><a id="SP40"></a><b>&#167;40. </b>And now rules for consonant doubling:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -1844,7 +1777,7 @@ from the act of producing a song.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*iz</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0zing</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP43"></a><b>&#167;43. </b>Finally:
<p class="commentary firstcommentary"><a id="SP41"></a><b>&#167;41. </b>Finally:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -1858,7 +1791,7 @@ from the act of producing a song.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0ing</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP44"></a><b>&#167;44. </b>Next the past participle. As noted above, for most verbs this is the same
<p class="commentary firstcommentary"><a id="SP42"></a><b>&#167;42. </b>Next the past participle. As noted above, for most verbs this is the same
as the past (e.g., he agreed and it was agreed); but there's a list of
exceptions for Anglo-Saxon survivals (e.g., he chose and it was chosen).
The exceptional cases were derived from Wikipedia's catalogue of irregular
@ -2025,7 +1958,7 @@ removed.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">write</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">written</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP45"></a><b>&#167;45. </b>That's the mandatory participles sorted out; so now we move on to the two
<p class="commentary firstcommentary"><a id="SP43"></a><b>&#167;43. </b>That's the mandatory participles sorted out; so now we move on to the two
additional verb forms used by English. First, the present form: a curiosity
of English is that this is almost always formed as if it were the plural of the
infinitive &mdash; thus "touch" becomes "touches". There are just a handful
@ -2043,7 +1976,7 @@ of exceptions to this.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">do</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">does</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP46"></a><b>&#167;46. </b>Second, the past. This is harder. Once again we have a catalogue of
<p class="commentary firstcommentary"><a id="SP44"></a><b>&#167;44. </b>Second, the past. This is harder. Once again we have a catalogue of
Anglo-Saxon past forms (e.g., he chose, not he chooses); and after those
are out of the way, the rules are the same as for the present participle,
except for adding -ed instead of -ing. The tricky part, again, is spotting
@ -2676,7 +2609,7 @@ when to double the consonant, which again depends on stress.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0ed</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP47"></a><b>&#167;47. Present to past participles. </b>Sentences like
<p class="commentary firstcommentary"><a id="SP45"></a><b>&#167;45. Present to past participles. </b>Sentences like
</p>
<blockquote>
@ -3185,7 +3118,7 @@ cases followed by two general rules.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*ing</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">3ed</span><span class="Preform-plain-syntax"> </span><span class="Preform-comment-syntax"> e.g., "smashing" to "smashed"</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP48"></a><b>&#167;48. Adjective agreements. </b>English doesn't inflect adjectives at all (let's not argue about "blond"
<p class="commentary firstcommentary"><a id="SP46"></a><b>&#167;46. Adjective agreements. </b>English doesn't inflect adjectives at all (let's not argue about "blond"
and "blonde"), so the following are just stubs.
</p>
@ -3206,7 +3139,7 @@ and "blonde"), so the following are just stubs.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP49"></a><b>&#167;49. </b>Grading of adjectives is more interesting. These spelling rules are taken
<p class="commentary firstcommentary"><a id="SP47"></a><b>&#167;47. </b>Grading of adjectives is more interesting. These spelling rules are taken
from the Oxford English Grammar at 4.24, "Gradability and comparison".
Something we can't easily implement is that a final vowel plus consonant
doesn't result in doubling the consonant (in the way that "big" becomes
@ -3238,7 +3171,7 @@ rare in English adjectives.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0est</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP50"></a><b>&#167;50. </b>To the best of my knowledge there's no technical term for "the noun which
<p class="commentary firstcommentary"><a id="SP48"></a><b>&#167;48. </b>To the best of my knowledge there's no technical term for "the noun which
is formed from an adjective to refer to the quality it measures", so the
Inform source code calls this the "quiddity". English permits several
competing forms of these to be constructed, depending on the adjective's
@ -3258,7 +3191,7 @@ sometimes less elegant, but never means the wrong thing.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0ness</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP51"></a><b>&#167;51. </b>English has almost no noun cases at all, with the only exceptions being
<p class="commentary firstcommentary"><a id="SP49"></a><b>&#167;49. </b>English has almost no noun cases at all, with the only exceptions being
Anglo-Saxon pronouns (thus we distinguish "they" and "them" as nominative
and accusative, for example); and pronouns we handle separately in any
case. We won't bother to distinguish gender:
@ -3272,7 +3205,7 @@ case. We won't bother to distinguish gender:
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;en-noun-declension-group&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;en-noun-declension-tables&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP52"></a><b>&#167;52. </b>And the sorting into groups sorts everything into "group 1", the only group:
<p class="commentary firstcommentary"><a id="SP50"></a><b>&#167;50. </b>And the sorting into groups sorts everything into "group 1", the only group:
</p>
<pre class="Preform-displayed-code all-displayed-code code-font">
@ -3283,7 +3216,7 @@ case. We won't bother to distinguish gender:
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;en-noun-declension-uninflected&gt;</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP53"></a><b>&#167;53. </b>And in this single group, nominative and accusative forms are identical
<p class="commentary firstcommentary"><a id="SP51"></a><b>&#167;51. </b>And in this single group, nominative and accusative forms are identical
to the stem in both singular and plural.
</p>
@ -3293,7 +3226,7 @@ to the stem in both singular and plural.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP54"></a><b>&#167;54. </b>English articles only inflect slightly, to show indefinite plurals; they
<p class="commentary firstcommentary"><a id="SP52"></a><b>&#167;52. </b>English articles only inflect slightly, to show indefinite plurals; they
don't distinguish nominative from accusative.
</p>
@ -3309,7 +3242,7 @@ don't distinguish nominative from accusative.
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="3-vc.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">ei</li><li class="progressnextoff">&#10095;</li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="3-vc.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</a></li><li class="progresschapter"><a href="3-ai.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresscurrent">ei</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -0,0 +1,99 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>How To Include This Module</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../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 'How To Include This Module' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">inflections</a></li><li><a href="index.html#P">Preliminaries</a></li><li><b>How To Include This Module</b></li></ul></div>
<p class="purpose">What to do to make use of the inflections module in a new command-line tool.</p>
<ul class="toc"><li><a href="P-htitm.html#SP1">&#167;1. Status</a></li><li><a href="P-htitm.html#SP2">&#167;2. Importing the module</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Status. </b>The inflections module is provided as one of the "services" suite of modules,
which means that it was built with a view to potential incorporation in
multiple tools. It can be found, for example, in <a href="../inform7/index.html" class="internal">inform7</a> and
<a href="../inflections-test/index.html" class="internal">inflections-test</a>.
</p>
<p class="commentary">By convention, the modules considered as "services" have no dependencies on
other modules except for <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a> and other "services" modules.
</p>
<p class="commentary">A tool can import <a href="index.html" class="internal">inflections</a> only if it also imports <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>,
<a href="../words-module/index.html" class="internal">words</a> and <a href="../syntax-module/index.html" class="internal">syntax</a>.
</p>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Importing the module. </b>We'll use the term "parent" to mean the tool which is importing <a href="index.html" class="internal">inflections</a>,
that is, which will include its code and be able to use it. As with any
imported module,
</p>
<ul class="items"><li>&#9679; The contents page of the parent's web must identify and locate the
module:
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="element-syntax">Import</span><span class="plain-syntax">:</span><span class="string-syntax"> somepath/inflections</span>
</pre>
<ul class="items"><li>&#9679; The parent must call <span class="extract"><span class="extract-syntax">InflectionsModule::start()</span></span> just after it starts up, and
<span class="extract"><span class="extract-syntax">InflectionsModule::end()</span></span> just before it shuts down. (But just after, and just
before, the corresponding calls to <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.)
</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="P-wtmd.html">&#10094;</a></li><li class="progresscurrentchapter">P</li><li class="progresssection"><a href="P-wtmd.html">wtmd</a></li><li class="progresscurrent">htitm</li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</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="1-im.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -0,0 +1,191 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>What This Module Does</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Preform-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 'What This Module Does' 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#P">Preliminaries</a></li><li><b>What This Module Does</b></li></ul></div>
<p class="purpose">An overview of the inflections module's role and abilities.</p>
<ul class="toc"><li><a href="P-wtmd.html#SP1">&#167;1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">&#167;2. Inflections</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. Prerequisites. </b>The inflections module is a part of the Inform compiler toolset. It is
presented as a literate program or "web". Before diving in:
</p>
<ul class="items"><li>(a) It helps to have some experience of reading webs: see <a href="../../../inweb/docs/index.html" class="internal">inweb</a> for more.
</li><li>(b) The module is written in C, in fact ANSI C99, but this is disguised by the
fact that it uses some extension syntaxes provided by the <a href="../../../inweb/docs/index.html" class="internal">inweb</a> literate
programming tool, making it a dialect of C called InC. See <a href="../../../inweb/docs/index.html" class="internal">inweb</a> for
full details, but essentially: it's C without predeclarations or header files,
and where functions have names like <span class="extract"><span class="extract-syntax">Tags::add_by_name</span></span> rather than <span class="extract"><span class="extract-syntax">add_by_name</span></span>.
</li><li>(c) This module uses other modules drawn from the <a href="../compiler.html" class="internal">compiler</a>, and also
uses a module of utility functions called <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.
For more, see <a href="../../../inweb/docs/foundation-module/P-abgtf.html" class="internal">A Brief Guide to Foundation (in foundation)</a>.
</li></ul>
<p class="commentary firstcommentary"><a id="SP2"></a><b>&#167;2. Inflections. </b>Inflections are modifications of words &mdash; usually word endings or beginnings &mdash;
for different circumstances. English is often called an uninflected language,
but this is an exaggeration. For example, we spell the word "tree" as
"trees" when we refer to more than one of them. Inform sometimes needs
to take text in one form and change it to another &mdash; for example, to turn
a singular noun into a plural one &mdash; and ordinary Preform parsing isn't good
enough to express this.
</p>
<p class="commentary">Inform uses a data structure called a "trie" as an efficient way to match
prefix and/or suffix patterns in words, and then to modify them.
</p>
<p class="commentary">Tries are provided as basic data structures by <a href="../../../inweb/docs/foundation-module/4-taa.html" class="internal">Tries and Avinues (in foundation)</a>,
and the code for initialising them from Preform grammar is provided by
<a href="../words-module/4-pu.html" class="internal">Preform Utilities (in words)</a>.
</p>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>Though tries are, as just mentioned, created from Preform grammar, they're
parsed quite differently. The rules are as follows:
</p>
<ul class="items"><li>(a) A nonterminal in trie grammar can either be a list of other tries, or it
can be a list of inflection rules. Mixtures of the two are not allowed. For
example &lt;singular-noun-to-its-indefinite-article&gt; is a list of other tries,
while &lt;en-trie-indef-a&gt; contains actual rules.
</li><li>(b) In a list of tries, each production consists only of a single nonterminal
identifying the trie to make use of. One exception: writing <span class="extract"><span class="extract-syntax">...</span></span> before the
trie's name makes it work on the end of a word instead of the beginning.
Inform attempts to find a match using each trie in turn, until a match is
found. For example:
</li></ul>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;fiddle-with-words&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;fiddle-with-exceptions&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;fiddle-with-irregular-endings&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;fiddle-with-regular-endings&gt;</span>
</pre>
<p class="commentary">means try &lt;fiddle-with-exceptions&gt; first (on the whole word), then
&lt;fiddle-with-irregular-endings&gt; (on the tail), and finally &lt;fiddle-with-regular-endings&gt;
(also on the tail).
</p>
<ul class="items"><li>(c) In a list of inflection rules, each production consists of two words. The
first word is what to match; the second gives instructions on what to turn
it into. An asterisk is used to mean "any string of 0 or more letters";
a digit in the replacement text means "truncate by this many letters and
add...". (As a special case, the replacement text "0" means: make no
change.) Some examples:
</li></ul>
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;pluralise&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">lead</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">lead</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">codex</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">codices</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">*mouse</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">5mice</span>
</pre>
<p class="commentary">This would pluralise "lead" as "lead", "codex" as "codices", "mouse" as "mice",
and "fieldmouse" as "fieldmice".
</p>
<p class="commentary">Designing a trie is not quite as easy as it looks. It looks as if this is a
sequence of tests to perform in succession, but it's better to think of the
rules all being performed at once. In general, if you need one inflection
rule to take precedence over another, put it in an earlier trie, rather than
putting it earlier in the same trie.
</p>
<p class="commentary">For the implementation of these rules, see <a href="2-tai.html" class="internal">Tries and Inflections</a>.
</p>
<p class="commentary firstcommentary"><a id="SP4"></a><b>&#167;4. </b>Once we have that general inflection machinery, most of what we need to
do becomes a simple matter of writing wrapper functions for tries.
</p>
<ul class="items"><li>&#9679; <a href="3-ai.html#SP1" class="internal">ArticleInflection::preface_by_article</a> handles the variation of articles:
for example, mutating "a" to "an" when it comes before "orange", thus making
"an orange" rather than "a orange".
</li><li>&#9679; <a href="3-ga.html#SP2" class="internal">Grading::make_comparative</a> turns "tall" into "taller".
</li><li>&#9679; <a href="3-ga.html#SP3" class="internal">Grading::make_superlative</a> turns "tall" into "tallest".
</li><li>&#9679; <a href="3-ga.html#SP4" class="internal">Grading::make_quiddity</a> turns "tall" into "tallness".
</li><li>&#9679; <a href="3-pp.html#SP1" class="internal">PastParticiples::pasturise_wording</a> turns "looking away" to "looked away".
</li><li>&#9679; <a href="3-plr.html#SP3" class="internal">Pluralisation::make</a> produces a series of allowable plurals for a
word, using a combination of a trie to handle regular pluralisation (for
English, we use Conway's algorithm) and a dictionary of user-supplied
exceptions.
</li></ul>
<p class="commentary firstcommentary"><a id="SP5"></a><b>&#167;5. </b>Tries are highly language specific and should not be translated as such:
instead, an appropriate version needs to be written for every language.
The tries for English are in <a href="4-ei.html" class="internal">English Inflections</a>.
</p>
<p class="commentary">Except at the very top level, translators are free to created new tries
and name them as they please. For example, the Spanish implementation of
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="function-syntax">&lt;singular-noun-to-its-indefinite-article&gt;</span>
</pre>
<p class="commentary">may look entirely unlike its English version, but at the top level it still
has to have that name.
</p>
<p class="commentary">Lower-level tries used in the implementation should have names beginning
with a language code: hence the names "en-" used in <a href="4-ei.html" class="internal">English Inflections</a>.
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">P</li><li class="progresscurrent">wtmd</li><li class="progresssection"><a href="P-htitm.html">htitm</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ld.html">2</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="P-htitm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -56,6 +56,22 @@
<hr>
<div class="contentspage">
<ul class="chapterlist">
<li>
<p class="chapterentry"><a name="P"></a>
<span class="chaptertitle">Preliminaries</span></p>
<ul class="sectionlist">
<li>
<p class="sectionentry"><a href="P-wtmd.html">
<spon class="sectiontitle">What This Module Does</span></a> -
<span class="sectionpurpose">An overview of the inflections module's role and abilities.</span></p>
</li>
<li>
<p class="sectionentry"><a href="P-htitm.html">
<spon class="sectiontitle">How To Include This Module</span></a> -
<span class="sectionpurpose">What to do to make use of the inflections module in a new command-line tool.</span></p>
</li>
</ul>
</li>
<li>
<p class="chapterentry"><a name="1"></a>
<span class="chaptertitle">Chapter 1: Starting Up</span></p>
@ -81,11 +97,6 @@
<spon class="sectiontitle">Tries and Inflections</span></a> -
<span class="sectionpurpose">Using tries to inflect word endings.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-nc.html">
<spon class="sectiontitle">Name Clusters</span></a> -
<span class="sectionpurpose">Name clusters are sets of noun or adjective forms, perhaps multiple or in multiple languages, which have in common that they share a meaning.</span></p>
</li>
</ul>
</li>
<li>
@ -102,6 +113,11 @@
<spon class="sectiontitle">Declensions</span></a> -
<span class="sectionpurpose">Declensions are sets of inflected variations of a common stem according to grammatical case.</span></p>
</li>
<li>
<p class="sectionentry"><a href="3-nc.html">
<spon class="sectiontitle">Name Clusters</span></a> -
<span class="sectionpurpose">Name clusters are sets of noun or adjective forms, perhaps multiple or in multiple languages, which have in common that they share a meaning.</span></p>
</li>
<li>
<p class="sectionentry"><a href="3-plr.html">
<spon class="sectiontitle">Pluralisation</span></a> -

View file

@ -65,9 +65,9 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../words-module/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">) == </span><span class="identifier-syntax">PARBREAK_V</span><span class="plain-syntax">) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="../words-module/3-wrd.html#SP6" class="function-link"><span class="function-syntax">Wordings::one_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</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">"%W --&gt; "</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"comparative: %W, "</span><span class="plain-syntax">, </span><a href="../inflections-module/3-ga.html#SP2" class="function-link"><span class="function-syntax">Grading::make_comparative</span></a><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="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"superlative: %W, "</span><span class="plain-syntax">, </span><a href="../inflections-module/3-ga.html#SP2" class="function-link"><span class="function-syntax">Grading::make_superlative</span></a><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="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"quiddity: %W\n"</span><span class="plain-syntax">, </span><a href="../inflections-module/3-ga.html#SP3" class="function-link"><span class="function-syntax">Grading::make_quiddity</span></a><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="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"comparative: %W, "</span><span class="plain-syntax">, </span><a href="../inflections-module/3-ga.html#SP2" class="function-link"><span class="function-syntax">Grading::make_comparative</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"superlative: %W, "</span><span class="plain-syntax">, </span><a href="../inflections-module/3-ga.html#SP3" class="function-link"><span class="function-syntax">Grading::make_superlative</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"quiddity: %W\n"</span><span class="plain-syntax">, </span><a href="../inflections-module/3-ga.html#SP4" class="function-link"><span class="function-syntax">Grading::make_quiddity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
@ -86,7 +86,7 @@ function togglePopup(material_id) {
<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><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</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">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">AT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-ai.html#SP1" class="function-link"><span class="function-syntax">ArticleInflection::preface_by_article</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">AT</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</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-ai.html#SP1" class="function-link"><span class="function-syntax">ArticleInflection::preface_by_article</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">AT</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"%S --&gt; %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">AT</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">AT</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>
@ -113,12 +113,12 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../words-module/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">) == </span><span class="identifier-syntax">f_V</span><span class="plain-syntax">) { </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="reserved-syntax">continue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../words-module/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">) == </span><span class="identifier-syntax">n_V</span><span class="plain-syntax">) { </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="reserved-syntax">continue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><a href="../words-module/3-wrd.html#SP6" class="function-link"><span class="function-syntax">Wordings::one_word</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline</span></a><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="identifier-syntax">gen</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">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">AD</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline_article</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</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">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><span class="identifier-syntax">gen</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">declension</span><span class="plain-syntax"> </span><span class="identifier-syntax">AD</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline_article</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><span class="identifier-syntax">gen</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">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"%W --&gt; "</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-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::writer</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">D</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">AD</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline</span></a><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="identifier-syntax">gen</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">AD</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline_article</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><span class="identifier-syntax">English_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</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">D</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><span class="identifier-syntax">gen</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">AD</span><span class="plain-syntax"> = </span><a href="../inflections-module/3-dcl.html#SP2" class="function-link"><span class="function-syntax">Declensions::decline_article</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PW</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::default_nl</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">), </span><span class="identifier-syntax">gen</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">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"pl --&gt; "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-dcl.html#SP3" class="function-link"><span class="function-syntax">Declensions::writer</span></a><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">D</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">AD</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">"\n"</span><span class="plain-syntax">);</span>
@ -157,7 +157,7 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">G</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">G</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">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">ASAGIG</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../inflections-module/3-plr.html#SP4" class="function-link"><span class="function-syntax">Pluralisation::regular</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ASAGIG</span><span class="plain-syntax">, </span><span class="identifier-syntax">G</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-plr.html#SP4" class="function-link"><span class="function-syntax">Pluralisation::regular</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ASAGIG</span><span class="plain-syntax">, </span><span class="identifier-syntax">G</span><span class="plain-syntax">, </span><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">"%S --&gt; %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">G</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASAGIG</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">ASAGIG</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">G</span><span class="plain-syntax">);</span>
@ -180,7 +180,7 @@ 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#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="../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><a href="../inflections-module/2-ld.html#SP7" class="function-link"><span class="function-syntax">InflectionDefns::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><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>

View file

@ -599,7 +599,7 @@ so on. For example:
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Kinds::Textual::write_articled</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</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><a href="2-dk.html#SP24" class="function-link"><span class="function-syntax">Kinds::Textual::write_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ArticleInflection::preface_by_article</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEMP</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">ArticleInflection::preface_by_article</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">, </span><span class="identifier-syntax">InflectionDefns::default_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">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEMP</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -184,9 +184,10 @@ we add a new one.
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="function-syntax">Nouns::add_to_noun_and_reg</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">Nouns::add_to_noun_and_reg</span></span>:<br/><a href="3-nns.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">noun</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">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">NATURAL_LANGUAGE_WORDS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">foreign_language</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">number</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">options</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Clusters::add</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">foreign_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="identifier-syntax">number</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Clusters::add</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">names</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">foreign_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">gender</span><span class="plain-syntax">, </span><span class="identifier-syntax">number</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">options</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">REGISTER_PLURAL_NTOPT</span><span class="plain-syntax">)?</span><span class="identifier-syntax">TRUE: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">in</span><span class="plain-syntax">; </span><span class="identifier-syntax">in</span><span class="plain-syntax"> = </span><span class="identifier-syntax">in</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">next</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">individual_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">in</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">in</span><span class="plain-syntax">, </span><span class="identifier-syntax">individual_name</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">options</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">REGISTER_SINGULAR_NTOPT</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">registration_category</span><span class="plain-syntax"> != </span><span class="constant-syntax">NOUN_HAS_NO_MC</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">excerpt_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">em</span><span class="plain-syntax"> = </span><a href="2-em.html#SP15" class="function-link"><span class="function-syntax">ExcerptMeanings::register</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">registration_category</span><span class="plain-syntax">,</span>

View file

@ -139,7 +139,7 @@ time".
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">": &lt;invalid-units&gt;"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tense</span><span class="plain-syntax"> != </span><span class="identifier-syntax">IS_TENSE</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">": "</span><span class="plain-syntax">); </span><span class="identifier-syntax">Linguistics::log_tense_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">tp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tense</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">": "</span><span class="plain-syntax">); </span><span class="identifier-syntax">InflectionDefns::log_tense_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">tp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tense</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -449,7 +449,7 @@ list, with lower priority numbers before higher ones.
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">VerbUsages::is_foreign</span><span class="plain-syntax">(</span><span class="reserved-syntax">verb_usage</span><span class="plain-syntax"> *</span><span class="identifier-syntax">vu</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">vu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">verb_used</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">vu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">verb_used</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">conjugation</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defined_in</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">vu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">verb_used</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">conjugation</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defined_in</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">vu</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">verb_used</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">conjugation</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">defined_in</span><span class="plain-syntax"> != </span><span class="identifier-syntax">InflectionDefns::default_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="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -115,7 +115,7 @@ any text but then fail.
<pre class="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-function-syntax">&lt;stock&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">verb</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; *XP = Conjugation::conjugate(WordAssemblages::from_wording(FW[1]), English_language);</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">verb</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> R[1]; *XP = Conjugation::conjugate(WordAssemblages::from_wording(FW[1]), InflectionDefns::default_nl(NULL));</span>
</pre>
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. Syntax tree. </b></p>

View file

@ -184,7 +184,7 @@ detect the language of play for a story file without actually running it.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Languages::write_ISO_code</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">inform_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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</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">L</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InflectionDefns::default_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">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">language_field</span><span class="plain-syntax">[</span><span class="constant-syntax">ISO_639_CODE_LFIELD</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"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">language_field</span><span class="plain-syntax">[</span><span class="constant-syntax">ISO_639_CODE_LFIELD</span><span class="plain-syntax">]);</span>

368
docs/words-module/4-pu.html Normal file
View file

@ -0,0 +1,368 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Preform Utilities</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">
<link href="../docs-assets/Preform-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="index.html"><span class="selectedlink">words</span></a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../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 'Preform Utilities' 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">words</a></li><li><a href="index.html#4">Chapter 4: Parsing</a></li><li><b>Preform Utilities</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="4-pu.html#SP1">&#167;1. Specifying generated text</a></li><li><a href="4-pu.html#SP4">&#167;4. Specifying replacements</a></li><li><a href="4-pu.html#SP5">&#167;5. Lexicon entry</a></li><li><a href="4-pu.html#SP6">&#167;6. Making tries</a></li><li><a href="4-pu.html#SP8">&#167;8. Errors</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. 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="Preform-displayed-code all-displayed-code code-font">
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">fried</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-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="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">PreformUtilities::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">PreformUtilities::merge</span></span>:<br/><a href="4-pu.html#SP2">&#167;2</a>, <a href="4-pu.html#SP3">&#167;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="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">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="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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">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">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="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#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_0</span></a><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_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">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wa</span><span class="plain-syntax"> = </span><a href="2-wa.html#SP6" class="function-link"><span class="function-syntax">WordAssemblages::join</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">wa</span><span class="plain-syntax">, </span><a href="2-wa.html#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_1</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">-&gt;</span><span class="element-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="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">wa</span><span class="plain-syntax"> = </span><a href="2-wa.html#SP6" class="function-link"><span class="function-syntax">WordAssemblages::join</span></a><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><a href="2-wa.html#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_0</span></a><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="SP2"></a><b>&#167;2. </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="reserved-syntax">word_assemblage</span><span class="plain-syntax"> </span><span class="function-syntax">PreformUtilities::wording</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">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="4-pu.html#SP1" class="function-link"><span class="function-syntax">PreformUtilities::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><a href="2-wa.html#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_0</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3"></a><b>&#167;3. </b>And here we take just one word:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">PreformUtilities::word</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">pnum</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="4-pu.html#SP1" class="function-link"><span class="function-syntax">PreformUtilities::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><a href="2-wa.html#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_0</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-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><a href="2-wa.html#SP9" class="function-link"><span class="function-syntax">WordAssemblages::as_array</span></a><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="SP4"></a><b>&#167;4. Specifying replacements. </b>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.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">vocabulary_entry</span><span class="plain-syntax"> *</span><span class="function-syntax">PreformUtilities::find_corresponding_word</span><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="plain-syntax"> </span><span class="reserved-syntax">nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nt_from</span><span class="plain-syntax">, </span><span class="reserved-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="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_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">nt_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pl</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="element-syntax">first_pl</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="element-syntax">next_pl</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="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_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pl_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pr</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="element-syntax">first_pr</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="element-syntax">next_pr</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="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_from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pr_from</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_pt</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="element-syntax">first_pt</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="element-syntax">next_pt</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="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_from</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="plain-syntax"> (</span><span class="identifier-syntax">pt_to</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><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="element-syntax">ve_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">pt_to</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ve_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">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="SP5"></a><b>&#167;5. 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">PreformUtilities::enter_lexicon</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">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="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">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><span class="reserved-syntax">if</span><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="plain-syntax"> </span><span class="identifier-syntax">Index::Lexicon::new_entry_with_details</span><span class="plain-syntax">(</span><span class="constant-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><a href="2-wa.html#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_1</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">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="identifier-syntax">endif</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6"></a><b>&#167;6. 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">PreformUtilities::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">PreformUtilities::define_trie</span></span>:<br/><a href="4-pu.html#SP6_1_1_2">&#167;6.1.1.2</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">end</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="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="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">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">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="element-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="element-syntax">as_avinue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-pu.html#SP6_1" class="named-paragraph-link"><span class="named-paragraph">Construct a new avinue from this nonterminal</span><span class="named-paragraph-number">6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">-&gt;</span><span class="element-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="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="SP6_1"></a><b>&#167;6.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">6.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="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">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="element-syntax">first_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">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="reserved-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="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">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_pt</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">FALSE</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">"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="4-pu.html#SP6_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">6.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="4-pu.html#SP6">&#167;6</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1_1"></a><b>&#167;6.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">6.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="reserved-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="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-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="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-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="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-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="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">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="element-syntax">ptoken_category</span><span class="plain-syntax"> == </span><span class="constant-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="4-pu.html#SP6_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Throw problem for a mixed trie nonterminal</span><span class="named-paragraph-number">6.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="4-pu.html#SP6_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">6.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="4-pu.html#SP6_1_1_1" class="named-paragraph-link"><span class="named-paragraph">Throw problem for a mixed trie nonterminal</span><span class="named-paragraph-number">6.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="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">"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="4-pu.html#SP6_1_1_3" class="named-paragraph-link"><span class="named-paragraph">Add this pattern and instruction to the trie, creating it if necessary</span><span class="named-paragraph-number">6.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="4-pu.html#SP6_1">&#167;6.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1_1_1"></a><b>&#167;6.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">6.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="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">"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="4-pu.html#SP6_1_1">&#167;6.1.1</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1_1_2"></a><b>&#167;6.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">6.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="4-pu.html#SP6" class="function-link"><span class="function-syntax">PreformUtilities::define_trie</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">-&gt;</span><span class="element-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="identifier-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="identifier-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="4-pu.html#SP6_1_1">&#167;6.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP6_1_1_3"></a><b>&#167;6.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 necessary</span><span class="named-paragraph-number">6.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="element-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><a href="2-vcb.html#SP7" class="function-link"><span class="function-syntax">Vocabulary::get_exemplar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">second</span><span class="plain-syntax">-&gt;</span><span class="element-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="4-pu.html#SP6_1_1">&#167;6.1.1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7"></a><b>&#167;7. </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">PreformUtilities::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="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="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">, </span><span class="reserved-syntax">nonterminal</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">if</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="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="element-syntax">nonterminal_id</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">pl</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">as_avinue</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8"></a><b>&#167;8. Errors. </b>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 &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>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PreformUtilities::production_error</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">PreformUtilities::production_error</span></span>:<br/><a href="4-pu.html#SP6_1">&#167;6.1</a>, <a href="4-pu.html#SP6_1_1">&#167;6.1.1</a>, <a href="4-pu.html#SP6_1_1_1">&#167;6.1.1.1</a><br/>Loading Preform - <a href="4-lp.html#SP7">&#167;7</a>, <a href="4-lp.html#SP7_1">&#167;7.1</a>, <a href="4-lp.html#SP7_2">&#167;7.2</a>, <a href="4-lp.html#SP7_3">&#167;7.3</a>, <a href="4-lp.html#SP14_1_1_1">&#167;14.1.1.1</a>, <a href="4-lp.html#SP14_1_2">&#167;14.1.2</a>, <a href="4-lp.html#SP14_1_3">&#167;14.1.3</a>, <a href="4-lp.html#SP14_1_4">&#167;14.1.4</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="reserved-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="4-pu.html#SP9" class="function-link"><span class="function-syntax">PreformUtilities::error</span></a><span class="plain-syntax">(</span><a href="2-wa.html#SP5" class="function-link"><span class="function-syntax">WordAssemblages::lit_0</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="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9"></a><b>&#167;9. </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">PREFORM_ERROR_WORDS_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">PreformUtilities::error</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">PreformUtilities::error</span></span>:<br/><a href="4-pu.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-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">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">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">PREFORM_ERROR_WORDS_CALLBACK</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PREFORM_ERROR_WORDS_CALLBACK</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">PREFORM_ERROR_WORDS_CALLBACK</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><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">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="plain-syntax"> </span><a href="2-vcb.html#SP7" class="function-link"><span class="function-syntax">Vocabulary::get_exemplar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">nt</span><span class="plain-syntax">-&gt;</span><span class="element-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><a href="2-wa.html#SP9" class="function-link"><span class="function-syntax">WordAssemblages::nonempty</span></a><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="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#SP13" class="function-link"><span class="function-syntax">Instrumentation::write_ptoken</span></a><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="element-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">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="element-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>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="4-ins.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="progresssection"><a href="4-ins.html">ins</a></li><li class="progresscurrent">pu</li><li class="progressnextoff">&#10095;</li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -107,7 +107,7 @@ detect the language of play for a story file without actually running it.
=
void Languages::write_ISO_code(OUTPUT_STREAM, inform_language *L) {
#ifdef CORE_MODULE
if (L == NULL) L = English_language;
if (L == NULL) L = InflectionDefns::default_nl(NULL);
#endif
if (Wordings::nonempty(L->language_field[ISO_639_CODE_LFIELD]))
WRITE("%+W", L->language_field[ISO_639_CODE_LFIELD]);

View file

@ -64,7 +64,7 @@ int Task::carry_out(build_step *S) {
inform7_task->stage_of_compilation = -1;
inform7_task->next_resource_number = 3;
English_language = Projects::get_language_of_syntax(project);
InflectionDefns::set_default_nl(Projects::get_language_of_syntax(project));
int rv = Sequence::carry_out(TargetVMs::debug_enabled(inform7_task->task->for_vm));
inform7_task = NULL;

View file

@ -33,7 +33,7 @@ int Plurals::plural_SMF(int task, parse_node *V, wording *NPs) {
wording P = Node::get_text(V->next->next);
@<Forbid plural declarations containing quoted text@>;
if (Assertions::Creator::vet_name_for_noun(P) == FALSE) return TRUE;
Pluralisation::register(S, P, English_language);
Pluralisation::register(S, P, InflectionDefns::default_nl(NULL));
return TRUE;
}
break;

View file

@ -1283,7 +1283,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
=
<adaptive-adjective> internal {
if (Projects::get_language_of_play(Task::project()) == English_language) return FALSE;
if (Projects::get_language_of_play(Task::project()) == InflectionDefns::default_nl(NULL)) return FALSE;
adjectival_phrase *aph;
LOOP_OVER(aph, adjectival_phrase) {
wording AW = Clusters::get_name_general(aph->adjective_names, Projects::get_language_of_play(Task::project()), 1, -1);
@ -1298,7 +1298,7 @@ prefaced "(of a rulebook)", "(of an activity)", and so on.
=
void Adjectives::Meanings::agreements(void) {
if (Projects::get_language_of_play(Task::project()) == English_language) return;
if (Projects::get_language_of_play(Task::project()) == InflectionDefns::default_nl(NULL)) return;
adjectival_phrase *aph;
LOOP_OVER(aph, adjectival_phrase) {
wording PW = Clusters::get_name_general(aph->adjective_names, Projects::get_language_of_play(Task::project()), 1, -1);

View file

@ -108,7 +108,7 @@ void UseNouns::nl_translates(parse_node *pn) {
inform_language *nl = Node::get_defn_language(pn->next->next);
int g = Annotations::read_int(pn->next->next, gender_reference_ANNOT);
if (nl == NULL) internal_error("No such NL");
if (nl == English_language) {
if (nl == InflectionDefns::default_nl(NULL)) {
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(PM_CantTranslateIntoEnglish),
"you can't translate into English",
"only out of it.");

View file

@ -89,7 +89,7 @@ as the object.
=
<verb-implies-sentence-subject> ::=
in <natural-language> <infinitive-declaration> | ==> R[2]; <<inform_language:nl>> = (inform_language *) (RP[1]);
<infinitive-declaration> ==> R[1]; <<inform_language:nl>> = English_language;
<infinitive-declaration> ==> R[1]; <<inform_language:nl>> = InflectionDefns::default_nl(NULL);
<infinitive-declaration> ::=
to <infinitive-usage> ( ... ) | ==> R[1]; <<giving-parts>> = TRUE
@ -552,7 +552,7 @@ foreign verbs (4).
binary_predicate *bp = VerbMeanings::get_relational_meaning(&vm);
if (bp == a_has_b_predicate) p = 1;
if (bp == R_equality) p = 2;
if ((nl) && (nl != English_language)) p = 5;
if ((nl) && (nl != InflectionDefns::default_nl(NULL))) p = 5;
++new_verb_sequence_count;
vi = Verbs::new_verb(vc, FALSE);
vc->vc_conjugates = vi;
@ -634,13 +634,13 @@ void NewVerbs::bootstrap(void) {
NewVerbs::declare_sm(Sentences::VPs::omit_from_SMF, I"omit-from", 4);
word_assemblage infinitive = PreformUtilities::wording(<bootstrap-verb>, 0);
verb_conjugation *vc = Conjugation::conjugate(infinitive, English_language);
verb_conjugation *vc = Conjugation::conjugate(infinitive, InflectionDefns::default_nl(NULL));
verb_identity *vi = Verbs::new_verb(vc, TRUE);
vc->vc_conjugates = vi;
VerbUsages::register_all_usages_of_verb(vi, FALSE, 2);
infinitive = PreformUtilities::wording(<bootstrap-verb>, 1);
vc = Conjugation::conjugate(infinitive, English_language);
vc = Conjugation::conjugate(infinitive, InflectionDefns::default_nl(NULL));
vi = Verbs::new_verb(vc, FALSE);
vc->vc_conjugates = vi;
VerbUsages::register_all_usages_of_verb(vi, FALSE, 3);
@ -1135,7 +1135,7 @@ void NewVerbs::log(verb_usage *vu) {
if (vu == NULL) { LOG("(null verb usage)"); return; }
LOG("VU: $f ", &(vu->vu_text));
if (vu->negated_form_of_verb) LOG("(negated) ");
Linguistics::log_tense_number(DL, vu->tensed);
InflectionDefns::log_tense_number(DL, vu->tensed);
}
void NewVerbs::log_all(void) {

View file

@ -189,7 +189,7 @@ from sentences, and this can include I6 properties with no I7 analogue.
this_is_named_for_something_with_a_printed_name = TRUE;
@<Issue problem message if the name contains a comma@>;
if (this_has_a_printed_name == FALSE) @<Assert the printed name property@>;
if (Projects::get_language_of_play(Task::project()) != English_language)
if (Projects::get_language_of_play(Task::project()) != InflectionDefns::default_nl(NULL))
@<Assert male, female, neuter adjectives from grammatical gender@>;
}

View file

@ -468,7 +468,7 @@ void Kinds::Textual::write_plural(OUTPUT_STREAM, kind *K) {
void Kinds::Textual::write_articled(OUTPUT_STREAM, kind *K) {
TEMPORARY_TEXT(TEMP);
Kinds::Textual::write_inner(TEMP, K, FALSE, TRUE);
ArticleInflection::preface_by_article(OUT, TEMP, English_language);
ArticleInflection::preface_by_article(OUT, TEMP, InflectionDefns::default_nl(NULL));
DISCARD_TEXT(TEMP);
}

View file

@ -1,4 +1,4 @@
[Linguistics::] Linguistic Definitions.
[InflectionDefns::] Linguistic Definitions.
Some basic linguistic constants are defined.
@ -6,11 +6,13 @@ Some basic linguistic constants are defined.
First, we support three genders:
@d NO_KNOWN_GENDERS 3
@d NEUTER_GENDER 1 /* can be used as Scandinavian "common gender" */
@d NEUTER_GENDER 1 /* or can be used as Scandinavian "common gender" */
@d MASCULINE_GENDER 2
@d FEMININE_GENDER 3
@ There are six "persons":
@ There are six "persons". The sequence corresponds to the defined constants
in the English Language extension, which we assume will be followed by other
languages.
@d NO_KNOWN_PERSONS 6
@d FIRST_PERSON_SINGULAR 0
@ -32,14 +34,9 @@ First, we support three genders:
@d ACTIVE_MOOD 0
@d PASSIVE_MOOD 1
@ 25 cases ought to be plenty, though some languages are pretty scary this
way: Hungarian, for example, has 18. We only require one case to exist, the
nominative, which is required to be case 0.
But this covers a pretty decent selection. Note that, as with the
persons above, the sequence corresponds to the defined constants in the
English Language extension, which we assume will be followed by other
languages.
@ 25 cases sounds like plenty, but some languages are pretty scary this
way: Hungarian has 18. We only require one case to exist, the nominative,
which is required to be case 0.
@d MAX_GRAMMATICAL_CASES 25
@d NOMINATIVE_CASE 0
@ -54,18 +51,20 @@ tense 5 for the past historic.
@d HASBEEN_TENSE 2 /* Present perfect */
@d HADBEEN_TENSE 3 /* Past perfect */
@d WILLBE_TENSE 4 /* Future (not used in assertions or conditions) */
@d CUSTOM1_TENSE 5
@d CUSTOM2_TENSE 6
=
void Linguistics::log_tense_number(OUTPUT_STREAM, int t) {
void InflectionDefns::log_tense_number(OUTPUT_STREAM, int t) {
switch (t) {
case IS_TENSE: WRITE("IS_TENSE"); break;
case WAS_TENSE: WRITE("WAS_TENSE"); break;
case IS_TENSE: WRITE("IS_TENSE"); break;
case WAS_TENSE: WRITE("WAS_TENSE"); break;
case HASBEEN_TENSE: WRITE("HASBEEN_TENSE"); break;
case HADBEEN_TENSE: WRITE("HADBEEN_TENSE"); break;
case WILLBE_TENSE: WRITE("WILLBE_TENSE"); break;
case 5: WRITE("CUSTOM1_TENSE"); break;
case 6: WRITE("CUSTOM2_TENSE"); break;
default: WRITE("<invalid-tense>"); break;
case WILLBE_TENSE: WRITE("WILLBE_TENSE"); break;
case CUSTOM1_TENSE: WRITE("CUSTOM1_TENSE"); break;
case CUSTOM2_TENSE: WRITE("CUSTOM2_TENSE"); break;
default: WRITE("<invalid-tense>"); break;
}
}
@ -74,9 +73,13 @@ The following is in effect also a constant; Inform sets it to English early
in its run.
=
NATURAL_LANGUAGE_WORDS_TYPE *English_language = NULL; /* until created, early in run */
NATURAL_LANGUAGE_WORDS_TYPE *default_language_for_linguistics = NULL;
NATURAL_LANGUAGE_WORDS_TYPE *Linguistics::default_nl(NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl) return nl;
return English_language;
void InflectionDefns::set_default_nl(NATURAL_LANGUAGE_WORDS_TYPE *nl) {
default_language_for_linguistics = nl;
}
NATURAL_LANGUAGE_WORDS_TYPE *InflectionDefns::default_nl(NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl) return nl;
return default_language_for_linguistics;
}

View file

@ -2,21 +2,20 @@
To inflect "a" into "an", and so forth.
@h The indefinite article trie.
Here we take text such as "UNESCO document" and put an article in front, to
@ Here we take text such as "UNESCO document" and put an article in front, to
get "a UNESCO document" (and not "an UNESCO document": these things are much
trickier than they look).
=
match_avinue *indef_trie = NULL;
void ArticleInflection::preface_by_article(OUTPUT_STREAM, text_stream *initial_text,
NATURAL_LANGUAGE_WORDS_TYPE *nl) {
void ArticleInflection::preface_by_article(OUTPUT_STREAM,
text_stream *initial_text, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (indef_trie == NULL)
indef_trie =
PreformUtilities::define_trie(
<singular-noun-to-its-indefinite-article>, TRIE_START,
Linguistics::default_nl(NULL));
InflectionDefns::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

@ -13,14 +13,14 @@ typedef struct declension {
@ =
declension Declensions::decline(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl, int gen, int num) {
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
declension D = Declensions::decline_inner(W, nl, gen, num, <noun-declension>);
@<Fix the origin@>;
return D;
}
declension Declensions::decline_article(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl, int gen, int num) {
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
declension D = Declensions::decline_inner(W, nl, gen, num, <article-declension>);
@<Fix the origin@>;
return D;
@ -36,7 +36,7 @@ declension Declensions::decline_article(wording W, NATURAL_LANGUAGE_WORDS_TYPE *
@ =
declension Declensions::decline_inner(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl, int gen, int num, nonterminal *nt) {
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
declension D;
D.within_language = nl;
for (production_list *pl = nt->first_pl; pl; pl = pl->next_pl) {
@ -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 = PreformUtilities::define_trie(gnt, TRIE_END, Linguistics::default_nl(nl));
match_avinue *group_trie = PreformUtilities::define_trie(gnt, TRIE_END, InflectionDefns::default_nl(nl));
wchar_t *result = Tries::search_avinue(group_trie, from);
DISCARD_TEXT(from);
if (result == NULL) {

View file

@ -2,8 +2,7 @@
To inflect adjectives into comparative and superlative forms.
@h Constructing comparatives.
In English, the comparative of an adjective can generally be formed by
@ In English, the comparative of an adjective can generally be formed by
suffixing the inflected form with "than"; thus, "big" to "bigger than".
The following does the suffixing:
@ -11,7 +10,9 @@ The following does the suffixing:
<comparative-construction> ::=
... than
@ =
@ This is essentially a wrapper function for the trie <adjective-to-comparative>.
=
wording Grading::make_comparative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
TEMPORARY_TEXT(comprised);
TEMPORARY_TEXT(transformed);
@ -19,9 +20,10 @@ wording Grading::make_comparative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
WRITE_TO(comprised, "some-long-text");
else
WRITE_TO(comprised, "%N", Wordings::first_wn(W));
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
match_avinue *comp_trie =
PreformUtilities::define_trie(<adjective-to-comparative>, TRIE_END, Linguistics::default_nl(nl));
PreformUtilities::define_trie(<adjective-to-comparative>, TRIE_END,
InflectionDefns::default_nl(nl));
Inflections::suffix_inflection(transformed, comp_trie, comprised);
wording PW = Feeds::feed_text(transformed);
word_assemblage merged =
@ -34,6 +36,9 @@ wording Grading::make_comparative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
return PW;
}
@ This is essentially a wrapper function for the trie <adjective-to-superlative>.
=
wording Grading::make_superlative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
TEMPORARY_TEXT(comprised);
TEMPORARY_TEXT(transformed);
@ -41,9 +46,10 @@ wording Grading::make_superlative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
WRITE_TO(comprised, "some-long-text");
else
WRITE_TO(comprised, "%N", Wordings::first_wn(W));
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
match_avinue *comp_trie =
PreformUtilities::define_trie(<adjective-to-superlative>, TRIE_END, Linguistics::default_nl(nl));
PreformUtilities::define_trie(<adjective-to-superlative>, TRIE_END,
InflectionDefns::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);
@ -52,10 +58,10 @@ wording Grading::make_superlative(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
return PW;
}
@ There has to be a better term than "quiddity" for this grammatical construct,
@ This is essentially a wrapper function for the trie <adjective-to-quiddity>.
There has to be a better term than "quiddity" for this grammatical concept,
but what I mean is the property for which the given adjective makes a
comparison: for instance, "tallness" for "tall", or "steeliness" for
"steely".
comparison: for instance, "tallness" for "tall", or "steeliness" for "steely".
=
wording Grading::make_quiddity(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
@ -65,9 +71,10 @@ wording Grading::make_quiddity(wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
WRITE_TO(comprised, "some-long-text");
else
WRITE_TO(comprised, "%N", Wordings::first_wn(W));
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
match_avinue *comp_trie =
PreformUtilities::define_trie(<adjective-to-quiddity>, TRIE_END, Linguistics::default_nl(nl));
PreformUtilities::define_trie(<adjective-to-quiddity>, TRIE_END,
InflectionDefns::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

@ -14,7 +14,7 @@ with lingistic roles. For example, the cluster of names for the common noun
=
typedef struct name_cluster {
struct individual_name *first_name;
struct linked_list *listed; /* of |individual_name| */
CLASS_DEFINITION
} name_cluster;
@ -23,8 +23,7 @@ typedef struct individual_name {
struct declension name; /* text of name */
int name_number; /* 1 for singular, 2 for plural */
int name_gender; /* 1 is neuter, 2 is masculine, 3 is feminine */
NATURAL_LANGUAGE_WORDS_TYPE *name_language; /* always non-null */
struct individual_name *next; /* within its cluster */
NATURAL_LANGUAGE_WORDS_TYPE *name_language;
CLASS_DEFINITION
} individual_name;
@ -33,32 +32,34 @@ typedef struct individual_name {
=
name_cluster *Clusters::new(void) {
name_cluster *names = CREATE(name_cluster);
names->first_name = NULL;
names->listed = NEW_LINKED_LIST(individual_name);
return names;
}
@ The following can add either a single name, or a name and its plural(s):
=
individual_name *Clusters::add(name_cluster *names, wording W,
NATURAL_LANGUAGE_WORDS_TYPE *nl, int gender, int number, int pluralise) {
if (nl == NULL) nl = English_language;
individual_name *Clusters::add_one(name_cluster *names, wording W,
NATURAL_LANGUAGE_WORDS_TYPE *nl, int gender, int number) {
nl = InflectionDefns::default_nl(nl);
individual_name *in = CREATE(individual_name);
in->principal_meaning = NULL_GENERAL_POINTER;
in->name = Declensions::decline(W, nl, gender, number);
in->name_language = nl;
in->name_number = number;
in->name_gender = gender;
in->next = NULL;
if (names->first_name == NULL) names->first_name = in;
else {
individual_name *in2;
for (in2 = names->first_name; ((in2) && (in2->next)); in2 = in2->next) ;
in2->next = in;
}
ADD_TO_LINKED_LIST(in, individual_name, names->listed);
return in;
}
linked_list *Clusters::add(name_cluster *names, wording W,
NATURAL_LANGUAGE_WORDS_TYPE *nl, int gender, int number, int pluralise) {
linked_list *L = NEW_LINKED_LIST(individual_name);
individual_name *in = Clusters::add_one(names, W, nl, gender, number);
ADD_TO_LINKED_LIST(in, individual_name, L);
if ((pluralise) && (number == 1))
@<Add plural names as well@>;
return in;
return L;
}
@ The following makes all possible plurals and registers those too. (Note
@ -75,9 +76,9 @@ so there may be any number of names registered: for instance, the kind
wording PW = EMPTY_WORDING;
pde = Pluralisation::make(W, &PW, pde, nl);
if (Wordings::nonempty(PW)) {
LOGIF(CONSTRUCTED_PLURALS, "(%d) Reading plural of <%W> as <%W>\n", k,
W, PW);
Clusters::add(names, PW, nl, gender, 2, FALSE);
LOGIF(CONSTRUCTED_PLURALS, "(%d) Plural of <%W>: <%W>\n", k, W, PW);
individual_name *in = Clusters::add_one(names, PW, nl, gender, 2);
ADD_TO_LINKED_LIST(in, individual_name, L);
}
} while (pde);
@ -91,15 +92,14 @@ At run time, it's an integer from 0 to 11 which encodes all possible
combinations. Here we only work through six, ignoring animation:
=
void Clusters::add_with_agreements(name_cluster *cl, wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl == NULL) nl = English_language;
if (nl == English_language) {
void Clusters::add_with_agreements(name_cluster *cl, wording W,
NATURAL_LANGUAGE_WORDS_TYPE *nl) {
nl = InflectionDefns::default_nl(nl);
if (nl == InflectionDefns::default_nl(NULL))
Clusters::add(cl, W, nl, NEUTER_GENDER, 1, FALSE);
} else {
int gna;
for (gna = 0; gna < 6; gna++)
else
for (int gna = 0; gna < 6; gna++)
@<Generate agreement form in this GNA and add to the declension@>;
}
}
@ We use tries to modify the base text, which is taken to be the neuter
@ -134,10 +134,12 @@ through one or two tries.
word_assemblage wa = WordAssemblages::from_wording(W);
if (step1)
wa = Inflections::apply_trie_to_wa(wa,
PreformUtilities::define_trie(step1, TRIE_END, Linguistics::default_nl(nl)));
PreformUtilities::define_trie(step1, TRIE_END,
InflectionDefns::default_nl(nl)));
if (step2)
wa = Inflections::apply_trie_to_wa(wa,
PreformUtilities::define_trie(step2, TRIE_END, Linguistics::default_nl(nl)));
PreformUtilities::define_trie(step2, TRIE_END,
InflectionDefns::default_nl(nl)));
FW = WordAssemblages::to_wording(&wa);
@h Plural fixing.
@ -148,9 +150,10 @@ only when the built-in kinds are being given plural names; some of these
and wouldn't pass through the pluralising tries intact.
=
void Clusters::set_plural_name(name_cluster *cl, wording W, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
void Clusters::set_plural_name(name_cluster *cl, wording W,
NATURAL_LANGUAGE_WORDS_TYPE *nl) {
individual_name *in;
for (in = cl->first_name; in; in = in->next)
LOOP_OVER_LINKED_LIST(in, individual_name, cl->listed)
if (in->name_number == 2) {
in->name = Declensions::decline(W, nl, NEUTER_GENDER, 2);
return;
@ -170,7 +173,7 @@ wording Clusters::get_name(name_cluster *cl, int plural_flag) {
int number_sought = 1;
if (plural_flag) number_sought = 2;
individual_name *in;
for (in = cl->first_name; in; in = in->next)
LOOP_OVER_LINKED_LIST(in, individual_name, cl->listed)
if (in->name_number == number_sought)
return Declensions::in_case(&(in->name), NOMINATIVE_CASE);
return EMPTY_WORDING;
@ -180,11 +183,12 @@ wording Clusters::get_name(name_cluster *cl, int plural_flag) {
falling back on English if there's none registered:
=
wording Clusters::get_name_in_play(name_cluster *cl, int plural_flag, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
wording Clusters::get_name_in_play(name_cluster *cl, int plural_flag,
NATURAL_LANGUAGE_WORDS_TYPE *nl) {
int number_sought = 1;
if (plural_flag) number_sought = 2;
individual_name *in;
for (in = cl->first_name; in; in = in->next)
LOOP_OVER_LINKED_LIST(in, individual_name, cl->listed)
if ((in->name_number == number_sought) &&
(in->name_language == nl))
return Declensions::in_case(&(in->name), NOMINATIVE_CASE);
@ -197,7 +201,7 @@ wording Clusters::get_name_in_play(name_cluster *cl, int plural_flag, NATURAL_LA
wording Clusters::get_name_general(name_cluster *cl,
NATURAL_LANGUAGE_WORDS_TYPE *nl, int number_sought, int gender_sought) {
individual_name *in;
for (in = cl->first_name; in; in = in->next)
LOOP_OVER_LINKED_LIST(in, individual_name, cl->listed)
if (((number_sought == -1) || (number_sought == in->name_number)) &&
((gender_sought == -1) || (gender_sought == in->name_gender)) &&
(in->name_language == nl))
@ -217,6 +221,8 @@ void Clusters::set_principal_meaning(individual_name *in, general_pointer meanin
}
general_pointer Clusters::get_principal_meaning(name_cluster *cl) {
if (cl->first_name == NULL) return NULL_GENERAL_POINTER;
return cl->first_name->principal_meaning;
individual_name *in;
LOOP_OVER_LINKED_LIST(in, individual_name, cl->listed)
return in->principal_meaning;
return NULL_GENERAL_POINTER;
}

View file

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

View file

@ -42,7 +42,7 @@ one not found in the dictionary).
=
plural_dictionary_entry *Pluralisation::make(wording W, wording *PW,
plural_dictionary_entry *search_from, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
plural_dictionary_entry *pde;
@ -95,8 +95,9 @@ 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;
nl = InflectionDefns::default_nl(nl);
match_avinue *plural_trie =
PreformUtilities::define_trie(<singular-noun-to-its-plural>, TRIE_END, Linguistics::default_nl(nl));
PreformUtilities::define_trie(<singular-noun-to-its-plural>, TRIE_END,
InflectionDefns::default_nl(nl));
return Inflections::suffix_inflection(OUT, plural_trie, from);
}

View file

@ -54,7 +54,7 @@ verb_conjugation *Conjugation::conjugate(word_assemblage base_text,
verb_conjugation *Conjugation::conjugate_with_overrides(word_assemblage base_text,
word_assemblage *overrides, int no_overrides, NATURAL_LANGUAGE_WORDS_TYPE *nl) {
if (nl == NULL) nl = English_language;
nl = InflectionDefns::default_nl(nl);
if (WordAssemblages::nonempty(base_text) == FALSE)
internal_error("No base text for verb conjugation");
@ -378,7 +378,7 @@ example:
verb_forms[n] =
Inflections::apply_trie_to_wa(
verb_forms[BASE_FORM_TYPE],
PreformUtilities::define_trie(content_token->nt_pt, TRIE_END, Linguistics::default_nl(nl)));
PreformUtilities::define_trie(content_token->nt_pt, TRIE_END, InflectionDefns::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);
@ -804,7 +804,7 @@ from our dictionary of 14,000 or so present and past participles.
=
void Conjugation::test_participle(OUTPUT_STREAM, wording W) {
verb_conjugation *vc = Conjugation::conjugate(
WordAssemblages::from_wording(W), English_language);
WordAssemblages::from_wording(W), InflectionDefns::default_nl(NULL));
if (vc == NULL) { WRITE("Failed test\n"); return; }
Conjugation::write_participle(OUT, vc);
DESTROY(vc, verb_conjugation);

View file

@ -2,65 +2,6 @@
To define how English nouns and verbs are inflected.
@h Preface.
Inflections are modifications of words -- usually word endings or beginnings --
for different circumstances. English is often called an uninflected language,
but this is an exaggeration. For example, we spell the word "tree" as
"trees" if it refers to more than one of them. Inform sometimes needs
to take text in one form and change it to another -- for example, to turn
a singular noun into a plural one -- and ordinary Preform parsing isn't good
enough to express this.
Inform uses a data structure called a "trie" as an efficient way to match
prefix and/or suffix patterns in words, and then to modify them. These tries
are created using the same notation as for Preform grammar, which is
convenient in many ways, but also a little misleading -- they are parsed quite
differently. The rules are as follows:
(a) A nonterminal in trie grammar can either be a list of other tries, or it
can be a list of inflection rules. Mixtures of the two are not allowed. For
example |<singular-noun-to-its-indefinite-article>| is a list of other tries, while
|<en-trie-indef-a>| contains actual rules.
(b) In a list of tries, each production consists only of a single nonterminal
identifying the trie to make use of. One exception: writing |...| before the
trie's name makes it work on the end of a word instead of the beginning.
Inform attempts to find a match using each trie in turn, until a match is
found.
(c) In a list of inflection rules, each production consists of two words. The
first word is what to match; the second gives instructions on what to turn
it into. An asterisk is used to mean "any string of 0 or more letters";
a digit in the replacement text means "truncate by this many letters and
add...". (As a special case, the replacement text "0" means: make no
change.) Some examples:
|lead gold| turns "lead" into "gold"
|codex codices| turns "codex" to "codices"
|*mouse 5mice| turns "mouse" to "mice", or "fieldmouse" to "fieldmice"
Designing a trie is not quite as easy as it looks. It looks as if this is a
sequence of tests to perform in succession, but it's better to think of the
rules all being performed at once. In general, if you need one inflection
rule to take precedence over another, put it in an earlier trie, rather than
putting it earlier in the same trie.
@ Tries are highly language specific and should not be translated as such:
instead, an appropriate version needs to be written for every language.
Except at the very top level, translators are free to created new tries
and name them as they please. For example, the Spanish implementation of
= (text as InC)
<singular-noun-to-its-indefinite-article>
=
may look entirely unlike its English version, but at the top level it still
has to have that name.
Lower-level tries used in the implementation should have names beginning
with a language code: hence the names "en-" used below.
@h Noun inflections.
The following trie looks at the start of a word, which we assume to be a
noun, and decides whether to use the indefinite article "a" or "an".

View file

@ -4,17 +4,21 @@ Purpose: A library for adapting words or short phrases for linguistic purposes.
Language: InC
Licence: Artistic License 2.0
Preliminaries
What This Module Does
How To Include This Module
Chapter 1: Starting Up
Inflections Module
Chapter 2: Machinery
Linguistic Definitions
Tries and Inflections
Name Clusters
Chapter 3: Grammatical Uses of Inflection
Article Inflection
Declensions
Name Clusters
Pluralisation
Grading Adjectives
Past Participles

View file

@ -0,0 +1,28 @@
How To Include This Module.
What to do to make use of the inflections module in a new command-line tool.
@h Status.
The inflections module is provided as one of the "services" suite of modules,
which means that it was built with a view to potential incorporation in
multiple tools. It can be found, for example, in //inform7// and
//inflections-test//.
By convention, the modules considered as "services" have no dependencies on
other modules except for //foundation// and other "services" modules.
A tool can import //inflections// only if it also imports //foundation//,
//words// and //syntax//.
@h Importing the module.
We'll use the term "parent" to mean the tool which is importing //inflections//,
that is, which will include its code and be able to use it. As with any
imported module,
(*) The contents page of the parent's web must identify and locate the
module:
= (text as Inweb)
Import: somepath/inflections
=
(*) The parent must call |InflectionsModule::start()| just after it starts up, and
|InflectionsModule::end()| just before it shuts down. (But just after, and just
before, the corresponding calls to //foundation//.)

View file

@ -0,0 +1,113 @@
What This Module Does.
An overview of the inflections module's role and abilities.
@h Prerequisites.
The inflections module is a part of the Inform compiler toolset. It is
presented as a literate program or "web". Before diving in:
(a) It helps to have some experience of reading webs: see //inweb// for more.
(b) The module is written in C, in fact ANSI C99, but this is disguised by the
fact that it uses some extension syntaxes provided by the //inweb// literate
programming tool, making it a dialect of C called InC. See //inweb// for
full details, but essentially: it's C without predeclarations or header files,
and where functions have names like |Tags::add_by_name| rather than |add_by_name|.
(c) This module uses other modules drawn from the //compiler//, and also
uses a module of utility functions called //foundation//.
For more, see //foundation: A Brief Guide to Foundation//.
@h Inflections.
Inflections are modifications of words -- usually word endings or beginnings --
for different circumstances. English is often called an uninflected language,
but this is an exaggeration. For example, we spell the word "tree" as
"trees" when we refer to more than one of them. Inform sometimes needs
to take text in one form and change it to another -- for example, to turn
a singular noun into a plural one -- and ordinary Preform parsing isn't good
enough to express this.
Inform uses a data structure called a "trie" as an efficient way to match
prefix and/or suffix patterns in words, and then to modify them.
Tries are provided as basic data structures by //foundation: Tries and Avinues//,
and the code for initialising them from Preform grammar is provided by
//words: Preform Utilities//.
@ Though tries are, as just mentioned, created from Preform grammar, they're
parsed quite differently. The rules are as follows:
(a) A nonterminal in trie grammar can either be a list of other tries, or it
can be a list of inflection rules. Mixtures of the two are not allowed. For
example <singular-noun-to-its-indefinite-article> is a list of other tries,
while <en-trie-indef-a> contains actual rules.
(b) In a list of tries, each production consists only of a single nonterminal
identifying the trie to make use of. One exception: writing |...| before the
trie's name makes it work on the end of a word instead of the beginning.
Inform attempts to find a match using each trie in turn, until a match is
found. For example:
= (text as Preform)
<fiddle-with-words> ::=
<fiddle-with-exceptions> |
... <fiddle-with-irregular-endings> |
... <fiddle-with-regular-endings>
=
means try <fiddle-with-exceptions> first (on the whole word), then
<fiddle-with-irregular-endings> (on the tail), and finally <fiddle-with-regular-endings>
(also on the tail).
(c) In a list of inflection rules, each production consists of two words. The
first word is what to match; the second gives instructions on what to turn
it into. An asterisk is used to mean "any string of 0 or more letters";
a digit in the replacement text means "truncate by this many letters and
add...". (As a special case, the replacement text "0" means: make no
change.) Some examples:
= (text as Preform)
<pluralise> ::=
lead lead |
codex codices |
*mouse 5mice
=
This would pluralise "lead" as "lead", "codex" as "codices", "mouse" as "mice",
and "fieldmouse" as "fieldmice".
Designing a trie is not quite as easy as it looks. It looks as if this is a
sequence of tests to perform in succession, but it's better to think of the
rules all being performed at once. In general, if you need one inflection
rule to take precedence over another, put it in an earlier trie, rather than
putting it earlier in the same trie.
For the implementation of these rules, see //Tries and Inflections//.
@ Once we have that general inflection machinery, most of what we need to
do becomes a simple matter of writing wrapper functions for tries.
(*) //ArticleInflection::preface_by_article// handles the variation of articles:
for example, mutating "a" to "an" when it comes before "orange", thus making
"an orange" rather than "a orange".
(*) //Grading::make_comparative// turns "tall" into "taller".
(*) //Grading::make_superlative// turns "tall" into "tallest".
(*) //Grading::make_quiddity// turns "tall" into "tallness".
(*) //PastParticiples::pasturise_wording// turns "looking away" to "looked away".
(*) //Pluralisation::make// produces a series of allowable plurals for a
word, using a combination of a trie to handle regular pluralisation (for
English, we use Conway's algorithm) and a dictionary of user-supplied
exceptions.
@ Tries are highly language specific and should not be translated as such:
instead, an appropriate version needs to be written for every language.
The tries for English are in //English Inflections//.
Except at the very top level, translators are free to created new tries
and name them as they please. For example, the Spanish implementation of
= (text as InC)
<singular-noun-to-its-indefinite-article>
=
may look entirely unlike its English version, but at the top level it still
has to have that name.
Lower-level tries used in the implementation should have names beginning
with a language code: hence the names "en-" used in //English Inflections//.

View file

@ -14,9 +14,9 @@ void Unit::test_adjectives(text_stream *arg) {
if (Lexer::word(i) == PARBREAK_V) continue;
wording W = Wordings::one_word(i);
PRINT("%W --> ", W);
PRINT("comparative: %W, ", Grading::make_comparative(W, English_language));
PRINT("superlative: %W, ", Grading::make_superlative(W, English_language));
PRINT("quiddity: %W\n", Grading::make_quiddity(W, English_language));
PRINT("comparative: %W, ", Grading::make_comparative(W, InflectionDefns::default_nl(NULL)));
PRINT("superlative: %W, ", Grading::make_superlative(W, InflectionDefns::default_nl(NULL)));
PRINT("quiddity: %W\n", Grading::make_quiddity(W, InflectionDefns::default_nl(NULL)));
}
}
}
@ -35,7 +35,7 @@ void Unit::test_articles(text_stream *arg) {
TEMPORARY_TEXT(T);
WRITE_TO(T, "%W", W);
TEMPORARY_TEXT(AT);
ArticleInflection::preface_by_article(AT, T, English_language);
ArticleInflection::preface_by_article(AT, T, InflectionDefns::default_nl(NULL));
PRINT("%S --> %S\n", T, AT);
DISCARD_TEXT(AT);
DISCARD_TEXT(T);
@ -62,12 +62,12 @@ void Unit::test_declensions(text_stream *arg) {
if (Lexer::word(i) == f_V) { gen = FEMININE_GENDER; continue; }
if (Lexer::word(i) == n_V) { gen = NEUTER_GENDER; continue; }
wording W = Wordings::one_word(i);
declension D = Declensions::decline(W, English_language, gen, 1);
declension AD = Declensions::decline_article(PW, English_language, gen, 1);
declension D = Declensions::decline(W, InflectionDefns::default_nl(NULL), gen, 1);
declension AD = Declensions::decline_article(PW, InflectionDefns::default_nl(NULL), gen, 1);
PRINT("%W --> ", W);
Declensions::writer(STDOUT, &D, &AD);
D = Declensions::decline(W, English_language, gen, 2);
AD = Declensions::decline_article(PW, English_language, gen, 2);
D = Declensions::decline(W, InflectionDefns::default_nl(NULL), gen, 2);
AD = Declensions::decline_article(PW, InflectionDefns::default_nl(NULL), gen, 2);
PRINT("pl --> ");
Declensions::writer(STDOUT, &D, &AD);
PRINT("\n");
@ -106,7 +106,7 @@ void Unit::test_plurals(text_stream *arg) {
TEMPORARY_TEXT(G);
WRITE_TO(G, "%W", W);
TEMPORARY_TEXT(ASAGIG);
Pluralisation::regular(ASAGIG, G, English_language);
Pluralisation::regular(ASAGIG, G, InflectionDefns::default_nl(NULL));
PRINT("%S --> %S\n", G, ASAGIG);
DISCARD_TEXT(ASAGIG);
DISCARD_TEXT(G);
@ -129,7 +129,7 @@ void Unit::test_verbs(text_stream *arg) {
if (c++ < 10) {
PRINT("Verb %W -->\n", W);
TEMPORARY_TEXT(T);
Conjugation::test(T, W, English_language);
Conjugation::test(T, W, InflectionDefns::default_nl(NULL));
Regexp::replace(T, L"%^", L"\n", REP_REPEATING);
PRINT("%S\n", T);
DISCARD_TEXT(T);

View file

@ -112,9 +112,10 @@ we add a new one.
=
individual_name *Nouns::add_to_noun_and_reg(noun *t,
wording W, NATURAL_LANGUAGE_WORDS_TYPE *foreign_language, int gender, int number, int options) {
individual_name *in = Clusters::add(t->names, W, foreign_language, gender, number,
linked_list *L = Clusters::add(t->names, W, foreign_language, gender, number,
(options & REGISTER_PLURAL_NTOPT)?TRUE:FALSE);
for (; in; in = in->next)
individual_name *in;
LOOP_OVER_LINKED_LIST(in, individual_name, L)
if ((options & REGISTER_SINGULAR_NTOPT) && (t->registration_category != NOUN_HAS_NO_MC)) {
excerpt_meaning *em = ExcerptMeanings::register(
t->registration_category,

View file

@ -70,7 +70,7 @@ void Occurrence::log(OUTPUT_STREAM, void *vtp) {
default: WRITE(": <invalid-units>"); break;
}
if (tp->tense != IS_TENSE) {
WRITE(": "); Linguistics::log_tense_number(OUT, tp->tense);
WRITE(": "); InflectionDefns::log_tense_number(OUT, tp->tense);
}
WRITE(">");
}

View file

@ -326,7 +326,7 @@ A usage is "foreign" if it belongs to a language other than English:
int VerbUsages::is_foreign(verb_usage *vu) {
if ((vu->verb_used) &&
(vu->verb_used->conjugation->defined_in) &&
(vu->verb_used->conjugation->defined_in != English_language)) {
(vu->verb_used->conjugation->defined_in != InflectionDefns::default_nl(NULL))) {
return TRUE;
}
return FALSE;

View file

@ -55,7 +55,7 @@ any text but then fail.
@ =
<stock> ::=
verb <cardinal-number> ... ==> R[1]; *XP = Conjugation::conjugate(WordAssemblages::from_wording(FW[1]), English_language);
verb <cardinal-number> ... ==> R[1]; *XP = Conjugation::conjugate(WordAssemblages::from_wording(FW[1]), InflectionDefns::default_nl(NULL));
@h Syntax tree.