1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/linguistics-module/4-apoo.html
2020-04-07 01:06:09 +01:00

337 lines
43 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>4/aoc</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="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></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="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '4/apoo' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">linguistics</a></li><li><a href="index.html#4">Chapter 4: Grammatical Categories II</a></li><li><b>Adverb Phrases of Occurrence</b></li></ul><p class="purpose">To parse representations of periods of time or of historical repetition.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>In two different contexts (action patterns and specifications) we
will need a represention for periods of time. We measure time in two
units: "times", as in something having been true four times in the
past; and "turns", as in something having been true for five turns
now. We will also need to keep track of four tenses when discussing
time periods, and also whether we mean "three or more" (say) or
"less than seven" turns or times. We represent this using the
relevant I6 comparison operator: for instance a length of 5 and
an operator <code class="display"><span class="extract">&gt;=</span></code> denotes "five or more". Lastly, we can denote a
closed interval of time as well, by setting <code class="display"><span class="extract">until</span></code> to the upper
end.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">TIMES_UNIT</span><span class="plain"> </span><span class="constant">1</span><span class="plain"> </span><span class="comment">used for "for the third time"</span>
<span class="definitionkeyword">define</span> <span class="constant">TURNS_UNIT</span><span class="plain"> </span><span class="constant">2</span><span class="plain"> </span><span class="comment">used for "for three turns"</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">time_period</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">valid_tp</span><span class="plain">; </span><span class="comment">flag distinguishing validly and invalidly parsed periods</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">units</span><span class="plain">; </span><span class="comment">one of the two above</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">; </span><span class="comment">the duration or else the lower limit of an interval</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">until</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-1</span></code> or else the upper limit of an interval</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">inform6_operator</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">&lt;=</span></code>, <code class="display"><span class="extract">==</span></code>, <code class="display"><span class="extract">&gt;</span></code>, and so forth</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tense</span><span class="plain">; </span><span class="comment">one of the four above</span>
<span class="plain">} </span><span class="reserved">time_period</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure time_period is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This simple procedure looks at the text between <code class="display"><span class="extract">w1</span></code> and <code class="display"><span class="extract">w2</span></code> to look for an
indication of a period of time, such as "twice" or "for more than the third
time".
</p>
<pre class="display">
<span class="reserved">time_period</span><span class="plain"> </span><span class="functiontext">Occurrence::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">time_period</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">valid_tp</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">length</span><span class="plain"> = -1;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">until</span><span class="plain"> = -1;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">units</span><span class="plain"> = </span><span class="constant">TIMES_UNIT</span><span class="plain">;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">tense</span><span class="plain"> = </span><span class="identifier">IS_TENSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">time_period</span><span class="plain"> </span><span class="functiontext">Occurrence::new_tense_marker</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">) {</span>
<span class="reserved">time_period</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain"> = </span><span class="functiontext">Occurrence::new</span><span class="plain">();</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">tense</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">time_period</span><span class="plain"> *</span><span class="functiontext">Occurrence::store</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">) {</span>
<span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">ntp</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">ntp</span><span class="plain"> = </span><span class="identifier">tp</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ntp</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Occurrence::log</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vtp</span><span class="plain">) {</span>
<span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp</span><span class="plain"> = (</span><span class="reserved">time_period</span><span class="plain"> *) </span><span class="identifier">vtp</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">valid_tp</span><span class="plain"> == </span><span class="identifier">FALSE</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">return</span><span class="plain">; }</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s"</span><span class="plain">, </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">until</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">until</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">"%d"</span><span class="plain">, </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">length</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="identifier">units</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TURNS_UNIT:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" turns"</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="identifier">TIMES_UNIT:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" times"</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">WRITE</span><span class="plain">(</span><span class="string">": &lt;invalid-units&gt;"</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">tp</span><span class="plain">-&gt;</span><span class="element">tense</span><span class="plain"> != </span><span class="identifier">IS_TENSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">": "</span><span class="plain">); </span><span class="identifier">Linguistics::log_tense_number</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">tense</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&gt;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Occurrence::is_valid</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="identifier">valid_tp</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Occurrence::make_invalid</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp</span><span class="plain">) {</span>
<span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">valid_tp</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Occurrence::get_tense</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="identifier">tense</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Occurrence::set_tense</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">) {</span>
<span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">tense</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Occurrence::duration_count</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">length</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> &lt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">L</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">tp</span><span class="plain">-&gt;</span><span class="element">until</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="identifier">until</span><span class="plain"> - </span><span class="identifier">L</span><span class="plain"> + </span><span class="constant">1</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">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</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="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">, </span><span class="string">"=="</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="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">, </span><span class="string">"&lt;="</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">L</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">, </span><span class="string">"&lt;"</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">L</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">strcmp</span><span class="plain">(</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">, </span><span class="string">"&gt;="</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="constant">1000000</span><span class="plain"> - </span><span class="identifier">L</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">tp</span><span class="plain">-&gt;</span><span class="element">inform6_operator</span><span class="plain">, </span><span class="string">"&gt;"</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="constant">1000000</span><span class="plain"> - (</span><span class="identifier">L</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">);</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>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Occurrence::compare_specificity</span><span class="plain">(</span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp1</span><span class="plain">, </span><span class="reserved">time_period</span><span class="plain"> *</span><span class="identifier">tp2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tp1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tp1</span><span class="plain">-&gt;</span><span class="element">valid_tp</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">tp1</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">tp2</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tp2</span><span class="plain">-&gt;</span><span class="element">valid_tp</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">tp2</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">tp1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tp2</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="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tp1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tp2</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="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tp2</span><span class="plain">) &amp;&amp; (</span><span class="identifier">tp1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dc1</span><span class="plain"> = </span><span class="functiontext">Occurrence::duration_count</span><span class="plain">(</span><span class="identifier">tp1</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dc2</span><span class="plain"> = </span><span class="functiontext">Occurrence::duration_count</span><span class="plain">(</span><span class="identifier">tp2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dc1</span><span class="plain"> &gt; </span><span class="identifier">dc2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dc1</span><span class="plain"> &lt; </span><span class="identifier">dc2</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">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="endnote">The function Occurrence::new is used in <a href="#SP7">&#167;7</a>.</p>
<p class="endnote">The function Occurrence::new_tense_marker appears nowhere else.</p>
<p class="endnote">The function Occurrence::store appears nowhere else.</p>
<p class="endnote">The function Occurrence::log is used in 1/lm (<a href="1-lm.html#SP3_5">&#167;3.5</a>).</p>
<p class="endnote">The function Occurrence::is_valid appears nowhere else.</p>
<p class="endnote">The function Occurrence::make_invalid appears nowhere else.</p>
<p class="endnote">The function Occurrence::get_tense appears nowhere else.</p>
<p class="endnote">The function Occurrence::set_tense appears nowhere else.</p>
<p class="endnote">The function Occurrence::duration_count appears nowhere else.</p>
<p class="endnote">The function Occurrence::compare_specificity appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">EQ_REPM</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">LT_REPM</span><span class="plain"> </span><span class="constant">2</span>
<span class="definitionkeyword">define</span> <span class="constant">LE_REPM</span><span class="plain"> </span><span class="constant">3</span>
<span class="definitionkeyword">define</span> <span class="constant">GT_REPM</span><span class="plain"> </span><span class="constant">4</span>
<span class="definitionkeyword">define</span> <span class="constant">GE_REPM</span><span class="plain"> </span><span class="constant">5</span>
<span class="definitionkeyword">define</span> <span class="constant">NO_REPM</span><span class="plain"> </span><span class="constant">6</span>
</pre>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Historical references are textual indications that a condition compares
the present state with past states: for example,
</p>
<blockquote>
<p>twice</p>
</blockquote>
<blockquote>
<p>for more than the third time</p>
</blockquote>
<p class="inwebparagraph">Note that every HR contains one of the words below, so that if
&lt;historical-reference-possible&gt; fails on an excerpt then it
cannot contain any HR; this cuts down our parsing time considerably.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">historical</span><span class="plain">-</span><span class="identifier">reference</span><span class="plain">-</span><span class="identifier">possible</span><span class="plain">&gt; ::=</span>
<span class="plain">*** </span><span class="identifier">once</span><span class="plain">/</span><span class="identifier">twice</span><span class="plain">/</span><span class="identifier">thrice</span><span class="plain">/</span><span class="identifier">turn</span><span class="plain">/</span><span class="identifier">turns</span><span class="plain">/</span><span class="identifier">time</span><span class="plain">/</span><span class="identifier">times</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Otherwise the grammar is straightforward:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">historical</span><span class="plain">-</span><span class="identifier">reference</span><span class="plain">&gt; ::=</span>
<span class="reserved">for</span><span class="plain"> &lt;</span><span class="identifier">repetition</span><span class="plain">-</span><span class="identifier">specification</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">repetition</span><span class="plain">-</span><span class="identifier">specification</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">repetition</span><span class="plain">-</span><span class="identifier">specification</span><span class="plain">&gt; ::=</span>
<span class="identifier">only</span><span class="plain">/</span><span class="identifier">exactly</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">EQ_REPM</span>
<span class="identifier">at</span><span class="plain"> </span><span class="identifier">most</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">LE_REPM</span>
<span class="identifier">less</span><span class="plain">/</span><span class="identifier">fewer</span><span class="plain"> </span><span class="identifier">than</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">LT_REPM</span>
<span class="identifier">at</span><span class="plain"> </span><span class="identifier">least</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">GE_REPM</span>
<span class="identifier">more</span><span class="plain"> </span><span class="identifier">than</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">GT_REPM</span>
<span class="identifier">under</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">LT_REPM</span>
<span class="identifier">over</span><span class="plain"> &lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">GT_REPM</span>
<span class="plain">&lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; ==&gt; </span><span class="constant">NO_REPM</span>
<span class="plain">&lt;</span><span class="identifier">repetitions</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">iteration</span><span class="plain">-</span><span class="identifier">repetitions</span><span class="plain">&gt; | ==&gt; </span><span class="constant">0</span><span class="plain">; &lt;&lt;</span><span class="identifier">from</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">unit</span><span class="plain">&gt;&gt; = </span><span class="constant">TIMES_UNIT</span>
<span class="plain">&lt;</span><span class="identifier">turn</span><span class="plain">-</span><span class="identifier">repetitions</span><span class="plain">&gt; ==&gt; </span><span class="constant">0</span><span class="plain">; &lt;&lt;</span><span class="identifier">from</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">unit</span><span class="plain">&gt;&gt; = </span><span class="constant">TURNS_UNIT</span>
<span class="plain">&lt;</span><span class="identifier">iteration</span><span class="plain">-</span><span class="identifier">repetitions</span><span class="plain">&gt; ::=</span>
<span class="identifier">once</span><span class="plain"> | ==&gt; </span><span class="constant">1</span>
<span class="identifier">twice</span><span class="plain"> | ==&gt; </span><span class="constant">2</span>
<span class="identifier">thrice</span><span class="plain"> | ==&gt; </span><span class="constant">3</span>
<span class="plain">&lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">to</span><span class="plain"> &lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">time</span><span class="plain">/</span><span class="identifier">times</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">to</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">time</span><span class="plain">/</span><span class="identifier">times</span><span class="plain"> ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">turn</span><span class="plain">-</span><span class="identifier">repetitions</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">to</span><span class="plain"> &lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">turn</span><span class="plain">/</span><span class="identifier">turns</span><span class="plain"> | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]; &lt;&lt;</span><span class="identifier">to</span><span class="plain">&gt;&gt; = </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; </span><span class="identifier">turn</span><span class="plain">/</span><span class="identifier">turns</span><span class="plain"> ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">rep</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; &lt;</span><span class="identifier">ordinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[2]</span>
<span class="plain">&lt;</span><span class="identifier">ordinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">&lt;</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">&gt; ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">time_period</span><span class="plain"> </span><span class="functiontext">Occurrence::parse</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">time_period</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain"> = </span><span class="functiontext">Occurrence::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">historical</span><span class="plain">-</span><span class="identifier">reference</span><span class="plain">-</span><span class="identifier">possible</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="plain">&lt;&lt;</span><span class="identifier">to</span><span class="plain">&gt;&gt; = -1;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">historical</span><span class="plain">-</span><span class="identifier">reference</span><span class="plain">&gt;(</span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">))) {</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EQ_REPM:</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="string">"=="</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="identifier">LT_REPM:</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="string">"&lt;"</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="identifier">LE_REPM:</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="string">"&lt;="</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="identifier">GT_REPM:</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="string">"&gt;"</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="identifier">GE_REPM:</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="string">"&gt;="</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="identifier">NO_REPM:</span><span class="plain"> </span><span class="identifier">tp</span><span class="plain">.</span><span class="element">inform6_operator</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">length</span><span class="plain"> = &lt;&lt;</span><span class="identifier">from</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">until</span><span class="plain"> = &lt;&lt;</span><span class="identifier">to</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">units</span><span class="plain"> = &lt;&lt;</span><span class="identifier">unit</span><span class="plain">&gt;&gt;;</span>
<span class="identifier">tp</span><span class="plain">.</span><span class="element">valid_tp</span><span class="plain"> = </span><span class="identifier">k</span><span class="plain">-1;</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">TIME_PERIODS</span><span class="plain">, </span><span class="string">"Parsed time period: &lt;%W&gt; = $t\n"</span><span class="plain">, </span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">), &amp;</span><span class="identifier">tp</span><span class="plain">);</span>
<span class="reserved">break</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"> </span><span class="identifier">tp</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Occurrence::parse appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-aoc.html">Back to 'Adverbs of Certainty'</a></li><li><i>(This section ends Chapter 4: Grammatical Categories II.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>