mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
1261 lines
179 KiB
HTML
1261 lines
179 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Verb Conjugation</title>
|
|
<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="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-src/Figures/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="index.html"><span class="selectedlink">inflections</span></a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Shared Modules</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../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="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Verb Conjugation' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">inflections</a></li><li><a href="index.html#3">Chapter 3: Grammatical Uses of Inflection</a></li><li><b>Verb Conjugation</b></li></ul><p class="purpose">Conjugating verbs into the many different forms they can take.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP2">§2. Making conjugations</a></li><li><a href="#SP4">§4. Follow instructions</a></li><li><a href="#SP5">§5. Merge verb material</a></li><li><a href="#SP8">§8. Parsing verb form numbers</a></li><li><a href="#SP9">§9. Parsing tense and sense indicators</a></li><li><a href="#SP10">§10. Parsing utilities</a></li><li><a href="#SP12">§12. Errors</a></li><li><a href="#SP15">§15. Testing</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>We will need to turn a base form of a verb — in English, this is always the
|
|
infinitive — into up to 123 variants; we manage this with quite an extensive
|
|
data structure. There will typically only be a few dozen fully conjugated
|
|
verbs in any source text, though, so the memory cost isn't too extreme. For
|
|
English it looks wasteful, since so many forms are the same, but for French
|
|
</p>
|
|
|
|
<ul class="items"><li>(say) they are almost all different.
|
|
</li></ul>
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">verb_conjugation</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">infinitive</span><span class="plain">; </span><span class="comment"> not counting the "to", in English</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">past_participle</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">present_participle</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">verb_tabulation</span><span class="plain"> </span><span class="identifier">tabulations</span><span class="plain">[</span><span class="constant">NO_KNOWN_MOODS</span><span class="plain">];</span>
|
|
<span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">defined_in</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LINGUISTICS_MODULE</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">verb_identity</span><span class="plain"> *</span><span class="identifier">vc_conjugates</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">where_vc_created</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">vc_iname</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">auxiliary_only</span><span class="plain">; </span><span class="comment"> used only as an auxiliary, e.g. the "have" in "I have gone"</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">instance_of_verb</span><span class="plain">; </span><span class="comment"> defines an instance of kind "verb" at run-time</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">verb_conjugation</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">verb_tabulation</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">to_be_auxiliary</span><span class="plain">; </span><span class="comment"> use this if non-empty</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">vc_text</span><span class="plain">[</span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">][2][6];</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">modal_auxiliary_usage</span><span class="plain">[</span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">][2][6];</span>
|
|
<span class="plain">} </span><span class="reserved">verb_tabulation</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure verb_conjugation is accessed in 3/plr and here.</p>
|
|
|
|
<p class="endnote">The structure verb_tabulation is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Making conjugations. </b>The following will make more sense if read alongside the examples in "English
|
|
Inflections", which explains the format in full. In fact English itself is a
|
|
little tame, though — try the French Language extension for the real deal.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The crucial early step here is <code class="display"><span class="extract">Conjugation::follow_instructions</span></code>, which has
|
|
two tasks to perform: it works out the numbered verb forms, and it chooses
|
|
which tabulation will be used. Verb form number 0 is always the base text,
|
|
and subsequent numbers include some which are universal across all verbs
|
|
(these have <code class="display"><span class="extract">*_FORM_TYPE</span></code> constants), and others which vary from one
|
|
conjugation to another.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="functiontext">Conjugation::conjugate<button class="popup" onclick="togglePopup('usagePopup40')">...<span class="popuptext" id="usagePopup40">Usage of <b>Conjugation::conjugate</b>:<br><a href="#SP5_4">§5.4</a>, <a href="#SP15">§15</a>, <a href="#SP16">§16</a></span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">base_text</span><span class="plain">,</span>
|
|
<span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="#SP2">Conjugation::conjugate_with_overrides</a></span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="functiontext">Conjugation::conjugate_with_overrides<button class="popup" onclick="togglePopup('usagePopup41')">...<span class="popuptext" id="usagePopup41">Usage of <b>Conjugation::conjugate_with_overrides</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">base_text</span><span class="plain">,</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> *</span><span class="identifier">overrides</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_overrides</span><span class="plain">, </span><span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">nl</span><span class="plain"> = </span><span class="identifier">English_language</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::nonempty</span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"No base text for verb conjugation"</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">MAX_FORM_TYPES</span><span class="plain">+1];</span>
|
|
<<span class="cwebmacro">Initialise all verb forms to the base text</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">aux_len</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">avo_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">niv_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">nonterminal</span><span class="plain"> *</span><span class="identifier">tabulation</span><span class="plain"> =</span>
|
|
<span class="functiontext"><a href="#SP4">Conjugation::follow_instructions</a></span><span class="plain">(</span><span class="identifier">verb_forms</span><span class="plain">, &</span><span class="identifier">n</span><span class="plain">, &</span><span class="identifier">aux_len</span><span class="plain">, &</span><span class="identifier">avo_flag</span><span class="plain">, &</span><span class="identifier">niv_flag</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">);</span>
|
|
|
|
<<span class="cwebmacro">Override any verb forms with supplied irregularities</span> <span class="cwebmacronumber">2.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Use the verb forms and the tabulation to make the conjugation</span> <span class="cwebmacronumber">2.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Initialise all verb forms to the base text</span> <span class="cwebmacronumber">2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=0; </span><span class="identifier">k</span><span class="plain"><=</span><span class="constant">MAX_FORM_TYPES</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++) </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] = </span><span class="identifier">base_text</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_2"></a><b>§2.2. </b>This feature is provided so that English verb definitions can override the
|
|
usual grammatical rules, which enables us to create new irregular verbs.
|
|
For example, Inform will by default make the past participle "blended" out
|
|
of the verb "to blend", but a definition like
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To blend (I blend, he blends, it is blent) ...</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">will cause "blent" to override "blended" in the <code class="display"><span class="extract">PAST_PARTICIPLE_FORM_TYPE</span></code>.
|
|
(Philip Larkin's poem "Church Going" uses "blent", but I've never seen
|
|
anybody else try this one on.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that verb form 0 can't be overridden: that was the base text.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Override any verb forms with supplied irregularities</span> <span class="cwebmacronumber">2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=1; </span><span class="identifier">k</span><span class="plain"><</span><span class="identifier">no_overrides</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::nonempty</span><span class="plain">(</span><span class="identifier">overrides</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">]))</span>
|
|
<span class="identifier">verb_forms</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] = </span><span class="identifier">overrides</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3"></a><b>§2.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Use the verb forms and the tabulation to make the conjugation</span> <span class="cwebmacronumber">2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">verb_conjugation</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LINGUISTICS_MODULE</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_conjugates</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain"> = </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">INFINITIVE_FORM_TYPE</span><span class="plain">];</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">present_participle</span><span class="plain"> = </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">PRESENT_PARTICIPLE_FORM_TYPE</span><span class="plain">];</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">past_participle</span><span class="plain"> = </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">PAST_PARTICIPLE_FORM_TYPE</span><span class="plain">];</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">defined_in</span><span class="plain"> = </span><span class="identifier">nl</span><span class="plain">;</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">auxiliary_only</span><span class="plain"> = </span><span class="identifier">avo_flag</span><span class="plain">;</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">instance_of_verb</span><span class="plain"> = (</span><span class="identifier">niv_flag</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">where_vc_created</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_iname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
|
|
<<span class="cwebmacro">Start by blanking out all the passive and active slots</span> <span class="cwebmacronumber">2.3.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Work through the supplied tabulation, filling in slots as directed</span> <span class="cwebmacronumber">2.3.2</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">vc</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3_1"></a><b>§2.3.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Start by blanking out all the passive and active slots</span> <span class="cwebmacronumber">2.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">to_be_auxiliary</span><span class="plain"> = </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">to_be_auxiliary</span><span class="plain"> = </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">tense</span><span class="plain">=0; </span><span class="identifier">tense</span><span class="plain"><</span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">; </span><span class="identifier">tense</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">sense</span><span class="plain">=0; </span><span class="identifier">sense</span><span class="plain"><2; </span><span class="identifier">sense</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><6; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2_3">§2.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3_2"></a><b>§2.3.2. </b>A tabulation is a sort of program laying out what to put in which slots,
|
|
active or passive. Each production is a step in this program, and it consists
|
|
of a "selector" followed by a "line". For example, the production:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">a3</span><span class="plain"> ( </span><span class="identifier">t1</span><span class="plain"> </span><span class="identifier">avoir</span><span class="plain"> ) </span><span class="constant">3</span><span class="plain">+*</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">contains six tokens; the selector is <code class="display"><span class="extract">a3</span></code>, and the line is made up from the
|
|
rest. (The selector is always just a single token.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work through the supplied tabulation, filling in slots as directed</span> <span class="cwebmacronumber">2.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">production_list</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">tabulation</span><span class="plain">-></span><span class="identifier">first_production_list</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">next_production_list</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">definition_language</span><span class="plain">) {</span>
|
|
<span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">first_production</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">next_production</span><span class="plain">) {</span>
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">selector</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">;</span>
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain"> = (</span><span class="identifier">selector</span><span class="plain">)?(</span><span class="identifier">selector</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">):</span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">selector</span><span class="plain">) && (</span><span class="identifier">selector</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">) && (</span><span class="identifier">line</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Apply the given tabulation line to the slots selected</span> <span class="cwebmacronumber">2.3.2.1</span>><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">tabulation</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">,</span>
|
|
<span class="string">"tabulation row doesn't consist of a selector and then text"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2_3">§2.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3_2_1"></a><b>§2.3.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Apply the given tabulation line to the slots selected</span> <span class="cwebmacronumber">2.3.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">active_set</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">, </span><span class="identifier">tense_set</span><span class="plain"> = -1, </span><span class="identifier">sense_set</span><span class="plain"> = -1, </span><span class="identifier">set_tba</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Parse the slot selector</span> <span class="cwebmacronumber">2.3.2.1.1</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">set_tba</span><span class="plain">)</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">to_be_auxiliary</span><span class="plain"> =</span>
|
|
<span class="functiontext"><a href="#SP5">Conjugation::merge</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">MAX_FORM_TYPES</span><span class="plain">+1, </span><span class="identifier">verb_forms</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">person</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">tense</span><span class="plain">=0; </span><span class="identifier">tense</span><span class="plain"><</span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">; </span><span class="identifier">tense</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">sense</span><span class="plain">=0; </span><span class="identifier">sense</span><span class="plain"><2; </span><span class="identifier">sense</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">person</span><span class="plain">=0; </span><span class="identifier">person</span><span class="plain"><6; </span><span class="identifier">person</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">sense_set</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">sense</span><span class="plain"> != </span><span class="identifier">sense_set</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tense_set</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">tense</span><span class="plain"> != </span><span class="identifier">tense_set</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">active_set</span><span class="plain">)</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">] =</span>
|
|
<span class="functiontext"><a href="#SP5">Conjugation::merge</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, </span><span class="identifier">person</span><span class="plain">, </span><span class="constant">MAX_FORM_TYPES</span><span class="plain">+1, </span><span class="identifier">verb_forms</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">,</span>
|
|
<span class="plain">&(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">modal_auxiliary_usage</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">]));</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">] =</span>
|
|
<span class="functiontext"><a href="#SP5">Conjugation::merge</a></span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, </span><span class="identifier">person</span><span class="plain">, </span><span class="constant">MAX_FORM_TYPES</span><span class="plain">+1, </span><span class="identifier">verb_forms</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">,</span>
|
|
<span class="plain">&(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">modal_auxiliary_usage</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">]));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2_3_2">§2.3.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3_2_1_1"></a><b>§2.3.2.1.1. </b>The selector tells us which tense(s), sense(s) and mood(s) to apply the
|
|
line to; <code class="display"><span class="extract">a3</span></code>, for example, means active mood, tense 3, in both positive
|
|
and negative senses.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Parse the slot selector</span> <span class="cwebmacronumber">2.3.2.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain"> = </span><span class="identifier">selector</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'a'</span><span class="plain">) </span><span class="identifier">active_set</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'p'</span><span class="plain">) </span><span class="identifier">active_set</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">active_set</span><span class="plain"> == </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">tabulation</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">,</span>
|
|
<span class="string">"tabulation row doesn't begin with 'a' or 'p'"</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">at</span><span class="plain">])) { </span><span class="identifier">tense_set</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">at</span><span class="plain">++]-</span><span class="character">'1'</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">at</span><span class="plain">] == </span><span class="character">'+'</span><span class="plain">) { </span><span class="identifier">sense_set</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">++; }</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">at</span><span class="plain">] == </span><span class="character">'-'</span><span class="plain">) { </span><span class="identifier">sense_set</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">++; }</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">at</span><span class="plain">] == </span><span class="character">'*'</span><span class="plain">) && (</span><span class="identifier">tense_set</span><span class="plain"> == -1) && (</span><span class="identifier">active_set</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">set_tba</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">at</span><span class="plain">] != </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"The selector here is: <%w>\n"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">tabulation</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">,</span>
|
|
<span class="string">"unrecognised selector in tabulation row"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2_3_2_1">§2.3.2.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Conjugation::conj_iname<button class="popup" onclick="togglePopup('usagePopup42')">...<span class="popuptext" id="usagePopup42">Usage of <b>Conjugation::conj_iname</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_conjugates</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">Hierarchy::package</span><span class="plain">(</span><span class="identifier">Modules::find</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">where_vc_created</span><span class="plain">), </span><span class="identifier">MVERBS_HAP</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ANT</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ANT</span><span class="plain">, </span><span class="string">"%A (modal)"</span><span class="plain">, </span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[0][0][2]);</span>
|
|
<span class="identifier">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">MVERB_NAME_HMD</span><span class="plain">, </span><span class="identifier">ANT</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">ANT</span><span class="plain">);</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">MODAL_CONJUGATION_FN_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">Verbs::verb_package</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_conjugates</span><span class="plain">, </span><span class="identifier">vc</span><span class="plain">-></span><span class="element">where_vc_created</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ANT</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ANT</span><span class="plain">, </span><span class="string">"to %A"</span><span class="plain">, </span><span class="identifier">vc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">);</span>
|
|
<span class="identifier">Hierarchy::markup</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">VERB_NAME_HMD</span><span class="plain">, </span><span class="identifier">ANT</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">ANT</span><span class="plain">);</span>
|
|
<span class="identifier">vc</span><span class="plain">-></span><span class="element">vc_iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">NONMODAL_CONJUGATION_FN_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">vc</span><span class="plain">-></span><span class="identifier">vc_iname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Follow instructions. </b>That completes the top level of the routine, but it depended on two major
|
|
sub-steps: a preliminary pass called <code class="display"><span class="extract">Conjugation::follow_instructions</span></code> and
|
|
a routine to deal with the final results called <code class="display"><span class="extract">Conjugation::merge</span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Here's the first of these. Note that the routine indirects through three main
|
|
nonterminals; it always starts with <code class="display"><span class="extract"><verb-conjugation-instructions></span></code> and
|
|
uses this to choose a "conjugation" nonterminal. It then chugs through
|
|
the conjugation, which ends by choosing a "tabulation". For example, in
|
|
English, the base text "do" passes through <code class="display"><span class="extract"><verb-conjugation-instructions></span></code>,
|
|
which chooses the conjugation <code class="display"><span class="extract"><to-do-conjugation></span></code>, which in turn sets some
|
|
participles and then chooses the tabulation <code class="display"><span class="extract"><to-do-tabulation></span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">nonterminal</span><span class="plain"> *</span><span class="functiontext">Conjugation::follow_instructions<button class="popup" onclick="togglePopup('usagePopup43')">...<span class="popuptext" id="usagePopup43">Usage of <b>Conjugation::follow_instructions</b>:<br><a href="#SP2">§2</a></span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> *</span><span class="identifier">verb_forms</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">highest_form_written</span><span class="plain">,</span>
|
|
<span class="reserved">int</span><span class="plain"> *</span><span class="identifier">aux_len</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">avo_flag</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">niv_flag</span><span class="plain">, </span><span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
|
|
<span class="identifier">nonterminal</span><span class="plain"> *</span><span class="identifier">instructions_nt</span><span class="plain"> = <</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">conjugation</span><span class="plain">-</span><span class="identifier">instructions</span><span class="plain">>;</span>
|
|
<span class="identifier">nonterminal</span><span class="plain"> *</span><span class="identifier">tabulation_nt</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">conjugation_nt</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">*</span><span class="identifier">highest_form_written</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="plain">*</span><span class="identifier">aux_len</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; *</span><span class="identifier">avo_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; *</span><span class="identifier">niv_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Pattern match on the base text to decide which conjugation to use</span> <span class="cwebmacronumber">4.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">conjugation_nt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">verb_forms</span><span class="plain">[0], </span><span class="identifier">instructions_nt</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
|
|
<span class="string">"the instructions here failed to choose a conjugation"</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Process the conjugation and determine the tabulation</span> <span class="cwebmacronumber">4.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tabulation_nt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">verb_forms</span><span class="plain">[0], </span><span class="identifier">conjugation_nt</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">,</span>
|
|
<span class="string">"the conjugation here failed to choose a tabulation"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">tabulation_nt</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1"></a><b>§4.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Pattern match on the base text to decide which conjugation to use</span> <span class="cwebmacronumber">4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> **</span><span class="identifier">base_text_words</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">base_text_word_count</span><span class="plain">;</span>
|
|
<span class="identifier">WordAssemblages::as_array</span><span class="plain">(&(</span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">BASE_FORM_TYPE</span><span class="plain">]), &</span><span class="identifier">base_text_words</span><span class="plain">, &</span><span class="identifier">base_text_word_count</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">production_list</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">instructions_nt</span><span class="plain">-></span><span class="identifier">first_production_list</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">next_production_list</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">definition_language</span><span class="plain">) {</span>
|
|
<span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">first_production</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">next_production</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Try to match the base text against this production</span> <span class="cwebmacronumber">4.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1_1"></a><b>§4.1.1. </b>Each production in this language's <code class="display"><span class="extract"><verb-conjugation-instructions></span></code> grammar
|
|
consists of a (possibly empty) pattern to match, followed by the name of a
|
|
nonterminal to use as the conjugation if it matches. For example, in
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">-</span><span class="identifier">querir</span><span class="plain"> <</span><span class="identifier">fr</span><span class="plain">-</span><span class="identifier">querir</span><span class="plain">-</span><span class="identifier">conjugation</span><span class="plain">></span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">the pattern part is a single token, <code class="display"><span class="extract">-querir</span></code>, which matches if the base text
|
|
is a single word whose last six characters are "querir". A more complicated
|
|
case is:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">be</span><span class="plain"> </span><span class="identifier">able</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> ... <</span><span class="identifier">to</span><span class="plain">-</span><span class="identifier">be</span><span class="plain">-</span><span class="identifier">able</span><span class="plain">-</span><span class="identifier">to</span><span class="plain">-</span><span class="identifier">auxiliary</span><span class="plain">></span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">Here the wildcard <code class="display"><span class="extract">...</span></code> matches one or more words, and the "auxiliary
|
|
infinitive" form is set to the part matched by <code class="display"><span class="extract">...</span></code>: for example,
|
|
"be able to see" matches with auxiliary infinitive "see".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Try to match the base text against this production</span> <span class="cwebmacronumber">4.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">, *</span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">; </span><span class="identifier">pt</span><span class="plain">; </span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">) { </span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">; </span><span class="identifier">len</span><span class="plain">++; }</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">len</span><span class="plain"> >= </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">last</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">NONTERMINAL_PTC</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">conjugation_nt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="comment"> i.e., if we have not yet chosen a conjugation</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">failed_to_match</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">wildcard_from</span><span class="plain"> = -1;</span>
|
|
<<span class="cwebmacro">Try to match the base text against the pattern part of the production</span> <span class="cwebmacronumber">4.1.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">failed_to_match</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">conjugation_nt</span><span class="plain"> = </span><span class="identifier">last</span><span class="plain">-></span><span class="identifier">nt_pt</span><span class="plain">;</span>
|
|
<span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">ADJOINT_INFINITIVE_FORM_TYPE</span><span class="plain">] = </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">BASE_FORM_TYPE</span><span class="plain">];</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wildcard_from</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="identifier">WordAssemblages::truncate</span><span class="plain">(&(</span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">ADJOINT_INFINITIVE_FORM_TYPE</span><span class="plain">]), </span><span class="identifier">wildcard_from</span><span class="plain">);</span>
|
|
<span class="plain">*</span><span class="identifier">aux_len</span><span class="plain"> = </span><span class="identifier">wildcard_from</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">malformed</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">BASE_FORM_TYPE</span><span class="plain">], <</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">conjugation</span><span class="plain">-</span><span class="identifier">instructions</span><span class="plain">>, </span><span class="identifier">pr</span><span class="plain">,</span>
|
|
<span class="string">"malformed line"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4_1">§4.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_1_1_1"></a><b>§4.1.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Try to match the base text against the pattern part of the production</span> <span class="cwebmacronumber">4.1.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">word_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">; ((</span><span class="identifier">pt</span><span class="plain">) && (</span><span class="identifier">pt</span><span class="plain"> != </span><span class="identifier">last</span><span class="plain">)); </span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">word_count</span><span class="plain"> < </span><span class="identifier">base_text_word_count</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="#SP11">Conjugation::compare_ve_with_tails</a></span><span class="plain">(</span><span class="identifier">base_text_words</span><span class="plain">[</span><span class="identifier">word_count</span><span class="plain">], </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">)))</span>
|
|
<span class="identifier">word_count</span><span class="plain">++;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">failed_to_match</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">MULTIPLE_WILDCARD_PTC</span><span class="plain">) {</span>
|
|
<span class="identifier">wildcard_from</span><span class="plain"> = </span><span class="identifier">word_count</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">base_text_word_count</span><span class="plain"> <= </span><span class="identifier">word_count</span><span class="plain">)</span>
|
|
<span class="identifier">failed_to_match</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="comment"> must match at least one word</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wildcard_from</span><span class="plain"> == -1) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">word_count</span><span class="plain"> != </span><span class="identifier">base_text_word_count</span><span class="plain">) </span><span class="identifier">failed_to_match</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">wildcard_from</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4_1_1">§4.1.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_2"></a><b>§4.2. </b>In a conjugation, productions have two possible forms: either just a single
|
|
nonterminal, which usually identifies the tabulation, or a number followed by some
|
|
tokens.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Process the conjugation and determine the tabulation</span> <span class="cwebmacronumber">4.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">production_list</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">conjugation_nt</span><span class="plain">-></span><span class="identifier">first_production_list</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">next_production_list</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nl</span><span class="plain"> == </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">definition_language</span><span class="plain">) {</span>
|
|
<span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">first_production</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">next_production</span><span class="plain">) {</span>
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">; </span><span class="identifier">pt</span><span class="plain">; </span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">) </span><span class="identifier">len</span><span class="plain">++;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">len</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">NONTERMINAL_PTC</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">-></span><span class="identifier">nt_pt</span><span class="plain"> == <</span><span class="identifier">auxiliary</span><span class="plain">-</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">only</span><span class="plain">>)</span>
|
|
<span class="plain">*</span><span class="identifier">avo_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">-></span><span class="identifier">nt_pt</span><span class="plain"> == <</span><span class="identifier">not</span><span class="plain">-</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">at</span><span class="plain">-</span><span class="identifier">run</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">>)</span>
|
|
<span class="plain">*</span><span class="identifier">niv_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">tabulation_nt</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">-></span><span class="identifier">nt_pt</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">:</span>
|
|
<<span class="cwebmacro">Set a verb form from the conjugation line</span> <span class="cwebmacronumber">4.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">malformed</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="#SP13">Conjugation::error</a></span><span class="plain">(</span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">BASE_FORM_TYPE</span><span class="plain">], </span><span class="identifier">conjugation_nt</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">,</span>
|
|
<span class="string">"malformed line"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4_2_1"></a><b>§4.2.1. </b>So here we check the more interesting case. The number identifies which
|
|
verb form to set, and the token which follows it provides the content. For
|
|
example:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">2 having</span></code> set to the literal text "having"
|
|
<code class="display"><span class="extract">3 1+ed</span></code> set to verb form 1 with "ed" suffixed
|
|
<code class="display"><span class="extract">3 <en-trie-past-participle></span></code> run this trie on the base text and take the result
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Set a verb form from the conjugation line</span> <span class="cwebmacronumber">4.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">number_token</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">;</span>
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">content_token</span><span class="plain"> = </span><span class="identifier">number_token</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext"><a href="#SP8">Conjugation::ptoken_to_verb_form_number</a></span><span class="plain">(</span><span class="identifier">number_token</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> > *</span><span class="identifier">highest_form_written</span><span class="plain">) { *</span><span class="identifier">highest_form_written</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">content_token</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">NONTERMINAL_PTC</span><span class="plain">)</span>
|
|
<span class="identifier">verb_forms</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">] =</span>
|
|
<span class="functiontext"><a href="2-tai.html#SP2">Inflections::apply_trie_to_wa</a></span><span class="plain">(</span>
|
|
<span class="identifier">verb_forms</span><span class="plain">[</span><span class="constant">BASE_FORM_TYPE</span><span class="plain">],</span>
|
|
<span class="functiontext"><a href="2-np.html#SP7">Preform::Nonparsing::define_trie</a></span><span class="plain">(</span><span class="identifier">content_token</span><span class="plain">-></span><span class="identifier">nt_pt</span><span class="plain">, </span><span class="identifier">TRIE_END</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">content_token</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">)</span>
|
|
<span class="identifier">verb_forms</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">] =</span>
|
|
<span class="functiontext"><a href="#SP6">Conjugation::expand_with_endings</a></span><span class="plain">(</span><span class="identifier">content_token</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">, </span><span class="identifier">verb_forms</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">malformed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP4_2">§4.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Merge verb material. </b>Now the final main step. <code class="display"><span class="extract">row</span></code> points to a list of ptokens containing text,
|
|
and we have to copy that text into a word assemblage and return it.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">In theory that's a one-line routine, but it's made complicated by the number
|
|
of special syntaxes which can go into the row of text. For example, if <code class="display"><span class="extract">row</span></code>
|
|
is only
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">will</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="reserved">do</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">then the word assemblage comes out to just "will not do"; but if it is
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">( </span><span class="identifier">t1</span><span class="plain"> </span><span class="identifier">auxiliary</span><span class="plain">-</span><span class="identifier">have</span><span class="plain"> ) </span><span class="identifier">done</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">then we consult tense 1 (present) of the verb "auxiliary-have", extract
|
|
the relevant slot, then append "done". (This might produce "have done"
|
|
or "has done" or "haven't done" or "hasn't done", depending on the
|
|
current sense and person.) We call the business of extracting text from
|
|
a different verb's conjugation "lifting".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">There are other complications, too. See "English Inflections" for more.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="functiontext">Conjugation::merge<button class="popup" onclick="togglePopup('usagePopup44')">...<span class="popuptext" id="usagePopup44">Usage of <b>Conjugation::merge</b>:<br><a href="#SP2_3_2_1">§2.3.2.1</a>, <a href="#SP5_2">§5.2</a></span></button></span><span class="plain">(</span><span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">row</span><span class="plain">,</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sense</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tense</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">person</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">num_ingredients</span><span class="plain">, </span><span class="identifier">word_assemblage</span><span class="plain"> *</span><span class="identifier">ingredients</span><span class="plain">,</span>
|
|
<span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">modal_following</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">modal_following</span><span class="plain">) { *</span><span class="identifier">modal_following</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; }</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verb_form_to_lift</span><span class="plain"> = -1;</span>
|
|
<span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">chunk</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">chunk</span><span class="plain"> = </span><span class="identifier">row</span><span class="plain">; </span><span class="identifier">chunk</span><span class="plain">; </span><span class="identifier">chunk</span><span class="plain"> = </span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">A plus-plus-digit indicates auxiliary modal usage</span> <span class="cwebmacronumber">5.5</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">A form number followed by a bracketed verb lifts the relevant form</span> <span class="cwebmacronumber">5.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">A bracketed verb becomes a lift</span> <span class="cwebmacronumber">5.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">A fixed word is simply added to the result</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">A nonterminal is a table of persons</span> <span class="cwebmacronumber">5.2</span>><span class="plain">;</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Error in merge material line"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="#SP7">Conjugation::shorten_with_contractions</a></span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b>To take the easiest case first. If we read a word like <code class="display"><span class="extract">trailing</span></code>, we simply
|
|
add it. But note that <code class="display"><span class="extract">Conjugation::expand_with_endings</span></code> has other tricks up its sleeve,
|
|
and might expand <code class="display"><span class="extract">3+ed</span></code> to "trailed".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">A fixed word is simply added to the result</span> <span class="cwebmacronumber">5.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">) {</span>
|
|
<span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">, </span><span class="functiontext"><a href="#SP6">Conjugation::expand_with_endings</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">, </span><span class="identifier">ingredients</span><span class="plain">));</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b>If we read a nonterminal name, such as <code class="display"><span class="extract"><fr-vivre-present></span></code>, then this must
|
|
be a grammar with six productions, giving the text to use for the six different
|
|
persons. We consult <code class="display"><span class="extract">person</span></code> and extract the relevant text. For example, if
|
|
<code class="display"><span class="extract">person</span></code> is 3, we extract "vivons". Note that this material is itself read
|
|
in by a recursive use of <code class="display"><span class="extract">Conjugation::merge()</span></code>, because this enables it to
|
|
make use of the same fancy features we're allowing here.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">A nonterminal is a table of persons</span> <span class="cwebmacronumber">5.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">NONTERMINAL_PTC</span><span class="plain">) {</span>
|
|
<span class="identifier">production_list</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">nt_pt</span><span class="plain">-></span><span class="identifier">first_production_list</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain">; </span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">next_production_list</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pl</span><span class="plain">-></span><span class="identifier">first_production</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain">; </span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">next_production</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == </span><span class="identifier">person</span><span class="plain">)</span>
|
|
<span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">,</span>
|
|
<span class="functiontext"><a href="#SP5">Conjugation::merge</a></span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">,</span>
|
|
<span class="identifier">sense</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, </span><span class="identifier">person</span><span class="plain">, </span><span class="identifier">num_ingredients</span><span class="plain">, </span><span class="identifier">ingredients</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
|
|
<span class="identifier">N</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_3"></a><b>§5.3. </b>A number followed by a verb in brackets, like so:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="constant">3</span><span class="plain"> ( </span><span class="identifier">avoir</span><span class="plain"> )</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">expands to verb form 3 of this verb — the past participle of "avoir", which
|
|
is "eu", as it happens. This is a special kind of lift. It isn't actually
|
|
performed now; we make a note and carry it out when we reach the brackets,
|
|
on the next iteration.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">A form number followed by a bracketed verb lifts the relevant form</span> <span class="cwebmacronumber">5.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain"> = </span><span class="functiontext"><a href="#SP8">Conjugation::ptoken_to_verb_form_number</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">X</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="functiontext"><a href="#SP10">Conjugation::ptoken_as_bracket</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">))) {</span>
|
|
<span class="identifier">verb_form_to_lift</span><span class="plain"> = </span><span class="identifier">X</span><span class="plain">;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4"></a><b>§5.4. </b>And now the lift takes place. We might at this point have <code class="display"><span class="extract">verb_form_to_lift</span></code>
|
|
set, in which case we should lift a verb form, or we might not, in which case
|
|
we should lift an ordinary usage, such as third-person singular in a particular
|
|
tense. A lift can optionally change tense or sense: for example,
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">( </span><span class="identifier">t1</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> )</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">lifts from the present tense of "to have". If there's no tense indicator,
|
|
the tense remains the current one. (It's also possible to change the sense from
|
|
positive to negative or vice versa with this, though I can't think of a
|
|
language where this would be useful.) Note that, once again, the text of the
|
|
infinitive passes through <code class="display"><span class="extract">Conjugation::expand_with_endings</span></code>, so that it can make use
|
|
of the numbered verb forms if we want it to.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">A bracketed verb becomes a lift</span> <span class="cwebmacronumber">5.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="#SP10">Conjugation::ptoken_as_bracket</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">) == </span><span class="constant">1</span><span class="plain">) {</span>
|
|
<span class="identifier">chunk</span><span class="plain"> = </span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">; </span><span class="comment"> move past open bracket</span>
|
|
|
|
<span class="comment"> if there is a tense/sense indicator, use it, and move forward</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext"><a href="#SP9">Conjugation::ptoken_to_tense_indicator</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">, &</span><span class="identifier">S</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">chunk</span><span class="plain"> = </span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">tense</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> == -1) </span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">sense</span><span class="plain">;</span>
|
|
|
|
<span class="comment"> extract the text of the infinitive</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">verb_lifted</span><span class="plain"> = </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">chunk</span><span class="plain">) && (</span><span class="functiontext"><a href="#SP10">Conjugation::ptoken_as_bracket</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">) != -1)) {</span>
|
|
<span class="identifier">verb_lifted</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">verb_lifted</span><span class="plain">,</span>
|
|
<span class="functiontext"><a href="#SP6">Conjugation::expand_with_endings</a></span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">, </span><span class="identifier">ingredients</span><span class="plain">));</span>
|
|
<span class="identifier">chunk</span><span class="plain"> = </span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">aux</span><span class="plain"> = </span><span class="functiontext"><a href="#SP15">Conjugation::find_by_infinitive</a></span><span class="plain">(</span><span class="identifier">verb_lifted</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">aux</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">aux</span><span class="plain"> = </span><span class="functiontext"><a href="#SP2">Conjugation::conjugate</a></span><span class="plain">(</span><span class="identifier">verb_lifted</span><span class="plain">, </span><span class="identifier">nl</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">aux</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't conjugate lifted verb"</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">verb_form_to_lift</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">, </span><span class="identifier">aux</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">, </span><span class="identifier">aux</span><span class="plain">-></span><span class="element">present_participle</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">, </span><span class="identifier">aux</span><span class="plain">-></span><span class="element">past_participle</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> -1: </span><span class="identifier">wa</span><span class="plain"> = </span><span class="identifier">WordAssemblages::join</span><span class="plain">(</span><span class="identifier">wa</span><span class="plain">, </span><span class="identifier">aux</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">T</span><span class="plain">][</span><span class="identifier">S</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">]);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"only parts 1, 2, 3 can be extracted"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_5"></a><b>§5.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">A plus-plus-digit indicates auxiliary modal usage</span> <span class="cwebmacronumber">5.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">) {</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'+'</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">[1] == </span><span class="character">'+'</span><span class="plain">) && (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[2])) && (</span><span class="identifier">p</span><span class="plain">[3] == </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">modal_following</span><span class="plain">) {</span>
|
|
<span class="plain">*</span><span class="identifier">modal_following</span><span class="plain"> = ((</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">[2]) - ((</span><span class="reserved">int</span><span class="plain">) </span><span class="character">'0'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Whenever we read a single word, it passes through the following. A word
|
|
like "fish" will pass through unchanged; a number like "7" will convert
|
|
to verb form 7 in the current verb (for example, 2 becomes the present
|
|
participle); a plus sign joins two pieces together; and a tilde is a tie,
|
|
joining but with a space. Thus <code class="display"><span class="extract">fish~to~fry</span></code> becomes three words.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="functiontext">Conjugation::expand_with_endings<button class="popup" onclick="togglePopup('usagePopup45')">...<span class="popuptext" id="usagePopup45">Usage of <b>Conjugation::expand_with_endings</b>:<br><a href="#SP4_2_1">§4.2.1</a>, <a href="#SP5_1">§5.1</a>, <a href="#SP5_4">§5.4</a></span></button></span><span class="plain">(</span><span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">word_assemblage</span><span class="plain"> *</span><span class="identifier">verb_forms</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ve</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">();</span>
|
|
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain">>0) && (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1]) && ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'+'</span><span class="plain">) || (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'~'</span><span class="plain">))) {</span>
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">front</span><span class="plain"> =</span>
|
|
<span class="identifier">Vocabulary::entry_for_partial_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1);</span>
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">back</span><span class="plain"> =</span>
|
|
<span class="identifier">Vocabulary::entry_for_partial_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1, </span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)-1);</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">front_wa</span><span class="plain"> = </span><span class="functiontext"><a href="#SP6">Conjugation::expand_with_endings</a></span><span class="plain">(</span><span class="identifier">front</span><span class="plain">, </span><span class="identifier">verb_forms</span><span class="plain">);</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">back_wa</span><span class="plain"> = </span><span class="functiontext"><a href="#SP6">Conjugation::expand_with_endings</a></span><span class="plain">(</span><span class="identifier">back</span><span class="plain">, </span><span class="identifier">verb_forms</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"%A"</span><span class="plain">, &</span><span class="identifier">front_wa</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] == </span><span class="character">'~'</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="character">' '</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"%A"</span><span class="plain">, &</span><span class="identifier">back_wa</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain"> = </span><span class="functiontext"><a href="#SP8">Conjugation::ve_to_verb_form_number</a></span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">verb_forms</span><span class="plain">[</span><span class="identifier">X</span><span class="plain">];</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">WordAssemblages::lit_1</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>The final step in merging verb material is to pass the result through the
|
|
following, which attends to contractions. (Most of the time it does nothing.)
|
|
For example, suppose we have:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">ne</span><span class="plain">-</span><span class="character">' ai pas</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">The <code class="display"><span class="extract">-'</span></code> marker tells us that the word it attaches to should contract if a
|
|
vowel follows it. In this case that's what happens, so we convert to:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">n</span><span class="character">'ai pas</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">On the other hand,
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">ne</span><span class="plain">-</span><span class="character">' jette pas</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">would convert to
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">ne</span><span class="plain"> </span><span class="identifier">jette</span><span class="plain"> </span><span class="identifier">pas</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">with no contraction. Either way, though, we have to take some action when
|
|
we see a <code class="display"><span class="extract">-'</span></code> marker.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="identifier">word_assemblage</span><span class="plain"> </span><span class="functiontext">Conjugation::shorten_with_contractions<button class="popup" onclick="togglePopup('usagePopup46')">...<span class="popuptext" id="usagePopup46">Usage of <b>Conjugation::shorten_with_contractions</b>:<br><a href="#SP5">§5</a></span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain">) {</span>
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> **</span><span class="identifier">words</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">word_count</span><span class="plain">;</span>
|
|
<span class="identifier">WordAssemblages::as_array</span><span class="plain">(&</span><span class="identifier">wa</span><span class="plain">, &</span><span class="identifier">words</span><span class="plain">, &</span><span class="identifier">word_count</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">word_count</span><span class="plain">-1; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">words</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">words</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1], </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)-2;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">j</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">] == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1] == </span><span class="character">'\''</span><span class="plain">)) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">contract_this</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Decide whether a contraction is needed here</span> <span class="cwebmacronumber">7.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">contract_this</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=0; </span><span class="identifier">k</span><span class="plain"><</span><span class="identifier">j</span><span class="plain">-1; </span><span class="identifier">k</span><span class="plain">++) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"%c"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">]); }</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"'%w"</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">words</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+1; </span><span class="identifier">k</span><span class="plain"><</span><span class="identifier">word_count</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++) </span><span class="identifier">words</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">] = </span><span class="identifier">words</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">+1];</span>
|
|
<span class="identifier">word_count</span><span class="plain">--;</span>
|
|
<span class="identifier">WordAssemblages::truncate_to</span><span class="plain">(&</span><span class="identifier">wa</span><span class="plain">, </span><span class="identifier">word_count</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=0; </span><span class="identifier">k</span><span class="plain"><</span><span class="identifier">j</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">"%c"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">k</span><span class="plain">]); }</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">words</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7_1"></a><b>§7.1. </b>We contract if the following word starts with a (possibly accented) vowel,
|
|
and we construe "y" (but not "h" or "w") as a vowel.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Decide whether a contraction is needed here</span> <span class="cwebmacronumber">7.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">incipit</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">[0];</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> = </span><span class="identifier">tolower</span><span class="plain">(</span><span class="identifier">Characters::remove_accent</span><span class="plain">(</span><span class="identifier">incipit</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">first</span><span class="plain"> == </span><span class="character">'a'</span><span class="plain">) || (</span><span class="identifier">first</span><span class="plain"> == </span><span class="character">'e'</span><span class="plain">) || (</span><span class="identifier">first</span><span class="plain"> == </span><span class="character">'i'</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">first</span><span class="plain"> == </span><span class="character">'o'</span><span class="plain">) || (</span><span class="identifier">first</span><span class="plain"> == </span><span class="character">'u'</span><span class="plain">) || (</span><span class="identifier">first</span><span class="plain"> == </span><span class="character">'y'</span><span class="plain">))</span>
|
|
<span class="identifier">contract_this</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Parsing verb form numbers. </b>These are easy: they're just written as arabic numbers.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Conjugation::ptoken_to_verb_form_number<button class="popup" onclick="togglePopup('usagePopup47')">...<span class="popuptext" id="usagePopup47">Usage of <b>Conjugation::ptoken_to_verb_form_number</b>:<br><a href="#SP4_2_1">§4.2.1</a>, <a href="#SP5_3">§5.3</a></span></button></span><span class="plain">(</span><span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pt</span><span class="plain">) && (</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext"><a href="#SP8">Conjugation::ve_to_verb_form_number</a></span><span class="plain">(</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Conjugation::ve_to_verb_form_number<button class="popup" onclick="togglePopup('usagePopup48')">...<span class="popuptext" id="usagePopup48">Usage of <b>Conjugation::ve_to_verb_form_number</b>:<br><a href="#SP6">§6</a></span></button></span><span class="plain">(</span><span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Vocabulary::test_vflags</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">NUMBER_MC</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_literal_number_value</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">X</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">X</span><span class="plain"> < </span><span class="constant">MAX_FORM_TYPES</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">X</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Parsing tense and sense indicators. </b>These are a little harder: for example, <code class="display"><span class="extract">t2+</span></code> or <code class="display"><span class="extract">t3</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Conjugation::ptoken_to_tense_indicator<button class="popup" onclick="togglePopup('usagePopup49')">...<span class="popuptext" id="usagePopup49">Usage of <b>Conjugation::ptoken_to_tense_indicator</b>:<br><a href="#SP5_4">§5.4</a></span></button></span><span class="plain">(</span><span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">set_sense</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pt</span><span class="plain">) && (</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">)) {</span>
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'t'</span><span class="plain">) && (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[1])) && (</span><span class="identifier">p</span><span class="plain">[2] == </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">[1] - </span><span class="character">'1'</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> >= </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">N</span><span class="plain"> <= </span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'t'</span><span class="plain">) && (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[1])) && (</span><span class="identifier">p</span><span class="plain">[2] == </span><span class="character">'+'</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">[3] == </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">[1] - </span><span class="character">'1'</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> >= </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">N</span><span class="plain"> <= </span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">set_sense</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'t'</span><span class="plain">) && (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[1])) && (</span><span class="identifier">p</span><span class="plain">[2] == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">[3] == </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">[1] - </span><span class="character">'1'</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> >= </span><span class="constant">1</span><span class="plain">) && (</span><span class="identifier">N</span><span class="plain"> <= </span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">set_sense</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Parsing utilities. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Conjugation::ptoken_as_bracket<button class="popup" onclick="togglePopup('usagePopup50')">...<span class="popuptext" id="usagePopup50">Usage of <b>Conjugation::ptoken_as_bracket</b>:<br><a href="#SP5_3">§5.3</a>, <a href="#SP5_4">§5.4</a></span></button></span><span class="plain">(</span><span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pt</span><span class="plain">) && (</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ptoken_category</span><span class="plain"> == </span><span class="identifier">FIXED_WORD_PTC</span><span class="plain">)) {</span>
|
|
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">ve_pt</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ve</span><span class="plain"> == </span><span class="identifier">OPENBRACKET_V</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ve</span><span class="plain"> == </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>In the following, for example, "breveter" as <code class="display"><span class="extract">ve</span></code> would match "-veter"
|
|
as <code class="display"><span class="extract">pattern</span></code>.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Conjugation::compare_ve_with_tails<button class="popup" onclick="togglePopup('usagePopup51')">...<span class="popuptext" id="usagePopup51">Usage of <b>Conjugation::compare_ve_with_tails</b>:<br><a href="#SP4_1_1_1">§4.1.1.1</a></span></button></span><span class="plain">(</span><span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ve</span><span class="plain"> == </span><span class="identifier">pattern</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[0] == </span><span class="character">'-'</span><span class="plain">) {</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">)-(</span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)-1);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=1; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">i</span><span class="plain">++, </span><span class="identifier">j</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">j</span><span class="plain"><0) || (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] != </span><span class="identifier">q</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">]))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Errors. </b>People are going to get their conjugations wrong; it's a very hard notation
|
|
to learn. No end users of Inform will ever write them at all — this is a
|
|
low-level feature for translators only — but translators need all the help
|
|
they can get, so we'll try to provide good problem messages.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::trie_definition_error<button class="popup" onclick="togglePopup('usagePopup52')">...<span class="popuptext" id="usagePopup52">Usage of <b>Conjugation::trie_definition_error</b>:<br>Non-Parsing Preform - <a href="2-np.html#SP7_1">§7.1</a>, <a href="2-np.html#SP7_1_1">§7.1.1</a>, <a href="2-np.html#SP7_1_1_1">§7.1.1.1</a></span></button></span><span class="plain">(</span><span class="identifier">nonterminal</span><span class="plain"> *</span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="#SP14">Conjugation::basic_problem_handler</a></span><span class="plain">(</span><span class="identifier">WordAssemblages::lit_0</span><span class="plain">(), </span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">message</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>And similarly:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::error<button class="popup" onclick="togglePopup('usagePopup53')">...<span class="popuptext" id="usagePopup53">Usage of <b>Conjugation::error</b>:<br><a href="#SP2_3_2">§2.3.2</a>, <a href="#SP2_3_2_1_1">§2.3.2.1.1</a>, <a href="#SP4">§4</a>, <a href="#SP4_1_1">§4.1.1</a>, <a href="#SP4_2">§4.2</a></span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">nonterminal</span><span class="plain"> *</span><span class="identifier">nt</span><span class="plain">,</span>
|
|
<span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="#SP14">Conjugation::basic_problem_handler</a></span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">message</span><span class="plain">);</span>
|
|
<span class="identifier">exit</span><span class="plain">(1);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b>Some tools using this module will want to push simple error messages out to
|
|
the command line; others will want to translate them into elaborate problem
|
|
texts in HTML. So the client is allowed to define <code class="display"><span class="extract">SYNTAX_PROBLEM_HANDLER</span></code>
|
|
to some routine of her own, gazumping this one.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::basic_problem_handler<button class="popup" onclick="togglePopup('usagePopup54')">...<span class="popuptext" id="usagePopup54">Usage of <b>Conjugation::basic_problem_handler</b>:<br><a href="#SP12">§12</a>, <a href="#SP13">§13</a></span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">nonterminal</span><span class="plain"> *</span><span class="identifier">nt</span><span class="plain">,</span>
|
|
<span class="identifier">production</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">INFLECTIONS_ERROR_HANDLER</span>
|
|
<span class="identifier">INFLECTIONS_ERROR_HANDLER</span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">, </span><span class="identifier">nt</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">message</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">INFLECTIONS_ERROR_HANDLER</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"The production at fault is:\n"</span><span class="plain">);</span>
|
|
<span class="identifier">Preform::log_production</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">"(no nonterminal)"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">"nonterminal %w"</span><span class="plain">, </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">nt</span><span class="plain">-></span><span class="identifier">nonterminal_id</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">));</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">": "</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::nonempty</span><span class="plain">(</span><span class="identifier">base_text</span><span class="plain">))</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">"can't conjugate verb '%A': "</span><span class="plain">, &</span><span class="identifier">base_text</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ptoken</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">first_ptoken</span><span class="plain">; </span><span class="identifier">pt</span><span class="plain">; </span><span class="identifier">pt</span><span class="plain"> = </span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">) {</span>
|
|
<span class="identifier">Preform::write_ptoken</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">pt</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pt</span><span class="plain">-></span><span class="identifier">next_ptoken</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">"line %d ('%S'): "</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">-></span><span class="identifier">match_number</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">, </span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">message</span><span class="plain">);</span>
|
|
<span class="identifier">Errors::with_text</span><span class="plain">(</span><span class="string">"Preform error: %S"</span><span class="plain">, </span><span class="identifier">ERM</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Testing. </b>Similarly, the following helps translators by giving them unit tests for their
|
|
conjugations:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Test verb (internal) with appuyer.</p>
|
|
|
|
</blockquote>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::test<button class="popup" onclick="togglePopup('usagePopup55')">...<span class="popuptext" id="usagePopup55">Usage of <b>Conjugation::test</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">PREFORM_LANGUAGE_TYPE</span><span class="plain"> *</span><span class="identifier">nl</span><span class="plain">) {</span>
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain"> = </span><span class="functiontext"><a href="#SP2">Conjugation::conjugate</a></span><span class="plain">(</span>
|
|
<span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">), </span><span class="identifier">nl</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vc</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Failed test\n"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="functiontext"><a href="#SP15">Conjugation::write</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">vc</span><span class="plain">);</span>
|
|
<span class="identifier">DESTROY</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">, </span><span class="reserved">verb_conjugation</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::write<button class="popup" onclick="togglePopup('usagePopup56')">...<span class="popuptext" id="usagePopup56">Usage of <b>Conjugation::write</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Infinitive: %A / Present participle: %A / Past participle: %A^"</span><span class="plain">,</span>
|
|
<span class="plain">&(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">present_participle</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">past_participle</span><span class="plain">));</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mood_count</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::nonempty</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">to_be_auxiliary</span><span class="plain">)) </span><span class="identifier">mood_count</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mood</span><span class="plain">, </span><span class="identifier">sense</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, </span><span class="identifier">person</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">mood</span><span class="plain">=0; </span><span class="identifier">mood</span><span class="plain"><</span><span class="identifier">mood_count</span><span class="plain">; </span><span class="identifier">mood</span><span class="plain">++) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">sense</span><span class="plain">=0; </span><span class="identifier">sense</span><span class="plain"><2; </span><span class="identifier">sense</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mood</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Active "</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Passive "</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sense</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"positive^"</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"negative^"</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">tense</span><span class="plain">=0; </span><span class="identifier">tense</span><span class="plain"><7; </span><span class="identifier">tense</span><span class="plain">++) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Tense %d: "</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">person</span><span class="plain">=0; </span><span class="identifier">person</span><span class="plain"><6; </span><span class="identifier">person</span><span class="plain">++) {</span>
|
|
<span class="identifier">word_assemblage</span><span class="plain"> *</span><span class="identifier">wa</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mood</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">wa</span><span class="plain"> = &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">ACTIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">]);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">wa</span><span class="plain"> = &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">tense</span><span class="plain">][</span><span class="identifier">sense</span><span class="plain">][</span><span class="identifier">person</span><span class="plain">]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">person</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" / "</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::nonempty</span><span class="plain">(*</span><span class="identifier">wa</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%A"</span><span class="plain">, </span><span class="identifier">wa</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"^"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::nonempty</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">to_be_auxiliary</span><span class="plain">))</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Form passive as to be + %A\n"</span><span class="plain">, &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="constant">PASSIVE_MOOD</span><span class="plain">].</span><span class="element">to_be_auxiliary</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="functiontext">Conjugation::find_by_infinitive<button class="popup" onclick="togglePopup('usagePopup57')">...<span class="popuptext" id="usagePopup57">Usage of <b>Conjugation::find_by_infinitive</b>:<br><a href="#SP5_4">§5.4</a></span></button></span><span class="plain">(</span><span class="identifier">word_assemblage</span><span class="plain"> </span><span class="identifier">infinitive</span><span class="plain">) {</span>
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">, </span><span class="reserved">verb_conjugation</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::compare</span><span class="plain">(&</span><span class="identifier">infinitive</span><span class="plain">, &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">)))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">vc</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="functiontext">Conjugation::find_prior<button class="popup" onclick="togglePopup('usagePopup58')">...<span class="popuptext" id="usagePopup58">Usage of <b>Conjugation::find_prior</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">nvc</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nvc</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">, </span><span class="reserved">verb_conjugation</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vc</span><span class="plain"> != </span><span class="identifier">nvc</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::compare</span><span class="plain">(&(</span><span class="identifier">nvc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::compare</span><span class="plain">(&(</span><span class="identifier">nvc</span><span class="plain">-></span><span class="element">past_participle</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">past_participle</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::compare</span><span class="plain">(&(</span><span class="identifier">nvc</span><span class="plain">-></span><span class="element">present_participle</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">present_participle</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="constant">NO_KNOWN_MOODS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">verb_tabulation</span><span class="plain"> *</span><span class="identifier">nvt</span><span class="plain"> = &(</span><span class="identifier">nvc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="reserved">verb_tabulation</span><span class="plain"> *</span><span class="identifier">vt</span><span class="plain"> = &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">tabulations</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::compare</span><span class="plain">(&(</span><span class="identifier">nvt</span><span class="plain">-></span><span class="element">to_be_auxiliary</span><span class="plain">), &(</span><span class="identifier">vt</span><span class="plain">-></span><span class="element">to_be_auxiliary</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">match</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">p</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain"><6; </span><span class="identifier">p</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">=0; </span><span class="identifier">s</span><span class="plain"><2; </span><span class="identifier">s</span><span class="plain">++)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">=0; </span><span class="identifier">t</span><span class="plain"><</span><span class="constant">NO_KNOWN_TENSES</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">WordAssemblages::compare</span><span class="plain">(&(</span><span class="identifier">nvt</span><span class="plain">-></span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">][</span><span class="identifier">s</span><span class="plain">][</span><span class="identifier">p</span><span class="plain">]), &(</span><span class="identifier">vt</span><span class="plain">-></span><span class="element">vc_text</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">][</span><span class="identifier">s</span><span class="plain">][</span><span class="identifier">p</span><span class="plain">])) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">match</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nvt</span><span class="plain">-></span><span class="element">modal_auxiliary_usage</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">][</span><span class="identifier">s</span><span class="plain">][</span><span class="identifier">p</span><span class="plain">] != </span><span class="identifier">vt</span><span class="plain">-></span><span class="element">modal_auxiliary_usage</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">][</span><span class="identifier">s</span><span class="plain">][</span><span class="identifier">p</span><span class="plain">]) </span><span class="identifier">match</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">match</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">vc</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. </b>This is for testing English only; it helps with the test suite cases derived
|
|
from our dictionary of 14,000 or so present and past participles.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::test_participle<button class="popup" onclick="togglePopup('usagePopup59')">...<span class="popuptext" id="usagePopup59">Usage of <b>Conjugation::test_participle</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain"> = </span><span class="functiontext"><a href="#SP2">Conjugation::conjugate</a></span><span class="plain">(</span>
|
|
<span class="identifier">WordAssemblages::from_wording</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">), </span><span class="identifier">English_language</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">vc</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Failed test\n"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="functiontext"><a href="#SP16">Conjugation::write_participle</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">vc</span><span class="plain">);</span>
|
|
<span class="identifier">DESTROY</span><span class="plain">(</span><span class="identifier">vc</span><span class="plain">, </span><span class="reserved">verb_conjugation</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Conjugation::write_participle<button class="popup" onclick="togglePopup('usagePopup60')">...<span class="popuptext" id="usagePopup60">Usage of <b>Conjugation::write_participle</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">verb_conjugation</span><span class="plain"> *</span><span class="identifier">vc</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"To %A: he is %A; it was %A.\n"</span><span class="plain">,</span>
|
|
<span class="plain">&(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">infinitive</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">present_participle</span><span class="plain">), &(</span><span class="identifier">vc</span><span class="plain">-></span><span class="element">past_participle</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>As noted above, these nonterminals have no parsing function, and are used only
|
|
as markers in verb conjugations.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">auxiliary</span><span class="plain">-</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">only</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">not</span><span class="plain">-</span><span class="identifier">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">verb</span><span class="plain">-</span><span class="identifier">at</span><span class="plain">-</span><span class="identifier">run</span><span class="plain">-</span><span class="identifier">time</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="3-pp.html">Back to 'Past Participles'</a></li><li><i>(This section ends Chapter 3: Grammatical Uses of Inflection.)</i></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|