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

Ranges for literal notation parts not starting from 0

This commit is contained in:
Graham Nelson 2023-07-14 14:20:05 +01:00
parent 70c0e97e80
commit ed743bbcb6
19 changed files with 309 additions and 189 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
[Version](notes/versioning.md): 10.2.0-beta+6W80 'Krypton' (13 July 2023)
[Version](notes/versioning.md): 10.2.0-beta+6W81 'Krypton' (14 July 2023)
## About Inform

View file

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 13 July 2023
Build Number: 6W80
Build Date: 14 July 2023
Build Number: 6W81

View file

@ -413,7 +413,7 @@ by a bracketed list of up to three options in any order.
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;lp-part&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }</span>
<span class="Preform-function-syntax">&lt;lp-part&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;np-unparsed-bal&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;lp-part-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, LPRequests::mark(RP[1], R[2], &lt;&lt;max_part_val&gt;&gt;) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;np-unparsed-bal&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;lp-part-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, LPRequests::mark(RP[1], R[2], &lt;&lt;min_part_val&gt;&gt;, &lt;&lt;max_part_val&gt;&gt;) }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;np-unparsed-bal&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { 0, RP[1] }</span>
<span class="Preform-function-syntax">&lt;lp-part-option-list&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
@ -430,7 +430,7 @@ by a bracketed list of up to three options in any order.
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">with</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">leading</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">zeros</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { WITH_LEADING_ZEROS_LSO, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">without</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">leading</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">zeros</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { WITHOUT_LEADING_ZEROS_LSO, - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">in</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;number-base&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> { BASE_LSO*R[1], - }</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> &lt;&lt;max_part_val&gt;&gt; = R[2]; </span><span class="named-paragraph-container code-font"><a href="3-nlpr.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Apply range</span><span class="named-paragraph-number">8.1</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> &lt;&lt;min_part_val&gt;&gt; = R[1]; &lt;&lt;max_part_val&gt;&gt; = R[2]; </span><span class="named-paragraph-container code-font"><a href="3-nlpr.html#SP8_1" class="named-paragraph-link"><span class="named-paragraph">Apply range</span><span class="named-paragraph-number">8.1</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">up</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;number-base&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">digit/digits</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-nlpr.html#SP8_4" class="named-paragraph-link"><span class="named-paragraph">Apply based max digit count</span><span class="named-paragraph-number">8.4</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">up</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">to</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">digit/digits</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-nlpr.html#SP8_2" class="named-paragraph-link"><span class="named-paragraph">Apply max digit count</span><span class="named-paragraph-number">8.2</span></a></span><span class="Preform-constant-syntax">;</span>
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;cardinal-number&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax">&lt;number-base&gt;</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">digit/digits</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==&gt;</span><span class="Preform-plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-nlpr.html#SP8_5" class="named-paragraph-link"><span class="named-paragraph">Apply based digit count</span><span class="named-paragraph-number">8.5</span></a></span><span class="Preform-constant-syntax">;</span>
@ -442,11 +442,11 @@ by a bracketed list of up to three options in any order.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">[1] != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">[1] &gt; </span><span class="identifier-syntax">R</span><span class="plain-syntax">[2])</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(...),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the range in a named part has to begin at 0"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for the moment at least."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">MAXIMUM_LSO</span><span class="plain-syntax">, - };</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the minimum value for a named part cannot be greater than the maximum"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"or it would be impossible for any value of this kind to exist."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> ==&gt; { </span><span class="constant-syntax">MINIMUM_LSO</span><span class="plain-syntax"> + </span><span class="constant-syntax">MAXIMUM_LSO</span><span class="plain-syntax">, - };</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-nlpr.html#SP8">&#167;8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8_2" class="paragraph-anchor"></a><b>&#167;8.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Apply max digit count</span><span class="named-paragraph-number">8.2</span></span><span class="comment-syntax"> =</span>
@ -527,6 +527,7 @@ by a bracketed list of up to three options in any order.
<span class="definition-keyword">define</span> <span class="constant-syntax">WITH_LEADING_ZEROS_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000004</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">WITHOUT_LEADING_ZEROS_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000008</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MAXIMUM_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000010</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MINIMUM_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000020</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">BASE_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00000100</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">BASE_MASK_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x0000ff00</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MIN_DIGITS_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x00010000</span>
@ -535,10 +536,11 @@ by a bracketed list of up to three options in any order.
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_DIGITS_MASK_LSO</span><span class="plain-syntax"> </span><span class="constant-syntax">0x7f000000</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">LPRequests::mark</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">LPRequests::mark</span></span>:<br/><a href="3-nlpr.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">M</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">LPRequests::mark</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">LPRequests::mark</span></span>:<br/><a href="3-nlpr.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">MI</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">MA</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_options_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">MAXIMUM_LSO</span><span class="plain-syntax">) </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_max_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">M</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">MINIMUM_LSO</span><span class="plain-syntax">) </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_min_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">MI</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">N</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">MAXIMUM_LSO</span><span class="plain-syntax">) </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_max_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">MA</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

View file

@ -528,6 +528,7 @@ which compilation unit the node belongs.
<span class="definition-keyword">enum</span> <span class="constant-syntax">evaluation_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">parse_node</span></span><span class="comment-syntax">: result of evaluating the text</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">explicit_gender_marker_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: used by PROPER NOUN nodes for evident genders</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">lpe_options_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: options set for a literal pattern part</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">lpe_min_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: value offset for a literal pattern part</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">lpe_max_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: maximum value for a literal pattern part</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">multiplicity_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">int</span></span><span class="comment-syntax">: e.g., 5 for "five gold rings"</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">new_relation_here_ANNOT</span><span class="plain-syntax"> </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">binary_predicate</span></span><span class="comment-syntax">: new relation as subject of "relates" sentence</span>
@ -583,6 +584,8 @@ which compilation unit the node belongs.
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">lpe_max_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP16" class="function-link"><span class="function-syntax">CoreSyntax::write_lpe_max_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">lpe_min_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP16" class="function-link"><span class="function-syntax">CoreSyntax::write_lpe_min_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">multiplicity_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP16" class="function-link"><span class="function-syntax">CoreSyntax::write_multiplicity_ANNOT</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::declare_type</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="constant-syntax">new_relation_here_ANNOT</span><span class="plain-syntax">, </span><a href="1-inaa.html#SP16" class="function-link"><span class="function-syntax">CoreSyntax::write_new_relation_here_ANNOT</span></a><span class="plain-syntax">);</span>
@ -637,6 +640,9 @@ which compilation unit the node belongs.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CoreSyntax::write_lpe_max_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" {lpe max: %d}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">lpe_max_ANNOT</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CoreSyntax::write_lpe_min_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" {lpe offset: %d}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">lpe_min_ANNOT</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CoreSyntax::write_multiplicity_ANNOT</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">multiplicity_ANNOT</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" {multiplicity %d}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">multiplicity_ANNOT</span><span class="plain-syntax">));</span>
@ -713,6 +719,7 @@ which compilation unit the node belongs.
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">defn_language_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">lpe_options_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">lpe_max_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">lpe_min_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">multiplicity_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">UNPARSED_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">new_relation_here_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::allow</span><span class="plain-syntax">(</span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">, </span><span class="constant-syntax">new_relation_here_ANNOT</span><span class="plain-syntax">);</span>

File diff suppressed because one or more lines are too long

View file

@ -232,11 +232,7 @@ the first function appears.)
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-lp.html#SP4_1_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
@ -256,11 +252,7 @@ the first function appears.)
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PRINTNUMBER_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-lp.html#SP4_1_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax"> != </span><span class="constant-syntax">10</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
@ -294,15 +286,7 @@ the first function appears.)
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PRINTNUMBER_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">MODULO_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-lp.html#SP4_1_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax"> != </span><span class="constant-syntax">10</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
@ -316,23 +300,23 @@ the first function appears.)
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">print_with_leading_zeros</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_printable</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax"> + </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_offset</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">max_digits</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1000000</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">d</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">; </span><span class="identifier-syntax">d</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">max_digits</span><span class="plain-syntax">; </span><span class="identifier-syntax">d</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="identifier-syntax">b</span><span class="plain-syntax"> * </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">max_printable</span><span class="plain-syntax"> = </span><span class="identifier-syntax">b</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pow</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">pow</span><span class="plain-syntax">) </span><span class="identifier-syntax">pow</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pow</span><span class="plain-syntax"> * </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">max_printable</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">pow</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pow</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pow</span><span class="plain-syntax"> * </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (; </span><span class="identifier-syntax">pow</span><span class="plain-syntax">&gt;1; </span><span class="identifier-syntax">pow</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pow</span><span class="plain-syntax">/</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">number_base</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">pow</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">max_printable</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">pow</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">LT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">MODULO_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-lp.html#SP4_1_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">pow</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
@ -347,21 +331,45 @@ the first function appears.)
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-lp.html#SP4_1_1_3">&#167;4.1.1.3</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP4_1_1_3_2" class="paragraph-anchor"></a><b>&#167;4.1.1.3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_offset</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">PLUS_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">MODULO_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_offset</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_offset</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-lp.html#SP4_1_1_3">&#167;4.1.1.3</a> (three times), <a href="5-lp.html#SP4_1_1_3_1">&#167;4.1.1.3.1</a>, <a href="5-lp.html#SP4_1_1_4">&#167;4.1.1.4</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP4_1_1_4" class="paragraph-anchor"></a><b>&#167;4.1.1.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Truncate the printed form here if subsequent numerical parts are zero</span><span class="named-paragraph-number">4.1.1.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">oc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ec</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">literal_pattern_element</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lpe</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">lp_elements</span><span class="plain-syntax">[</span><span class="identifier-syntax">ec</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ec</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">lp_elements</span><span class="plain-syntax">[</span><span class="identifier-syntax">ec</span><span class="plain-syntax">].</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-lp.html#SP4_1_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
@ -374,15 +382,7 @@ the first function appears.)
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EQ_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">MODULO_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">DIVIDE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">value_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">lp_elements</span><span class="plain-syntax">[</span><span class="identifier-syntax">ec</span><span class="plain-syntax">].</span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">lp_elements</span><span class="plain-syntax">[</span><span class="identifier-syntax">ec</span><span class="plain-syntax">].</span><span class="identifier-syntax">element_range</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-lp.html#SP4_1_1_3_2" class="named-paragraph-link"><span class="named-paragraph">Evaluate LPE value to be printed</span><span class="named-paragraph-number">4.1.1.3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">(0);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
@ -1289,13 +1289,42 @@ sets the <span class="extract"><span class="extract-syntax">parsed_number</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_index</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_offset</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP13" class="function-link"><span class="function-syntax">EmitCode::ref_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">tot_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">MINUS_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">tot_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_offset</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">min_val</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_val</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">LT_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">tot_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">min_val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">JUMP_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP17" class="function-link"><span class="function-syntax">EmitCode::lab</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">failed_label</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">IF_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP14" class="function-link"><span class="function-syntax">EmitCode::inv</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">GE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">tot_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_range</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP8" class="function-link"><span class="function-syntax">EmitCode::val_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">max_val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::up</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP5" class="function-link"><span class="function-syntax">EmitCode::code</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="2-ec.html#SP3" class="function-link"><span class="function-syntax">EmitCode::down</span></a><span class="plain-syntax">();</span>

View file

@ -202,6 +202,7 @@ The rightmost element \(e_{n-1}\) is the least significant numerically.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">literal_pattern_element</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">element_index</span><span class="plain-syntax">; </span><span class="comment-syntax"> the value </span>\(i\)<span class="comment-syntax"> placing this within its LP, where </span>\(0\leq i&lt;n\)
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">element_offset</span><span class="plain-syntax">; </span><span class="comment-syntax"> amount by which outward values differ from stored ones</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">element_range</span><span class="plain-syntax">; </span><span class="comment-syntax"> the value </span>\(r_i\)<span class="comment-syntax"> for this LP</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">element_multiplier</span><span class="plain-syntax">; </span><span class="comment-syntax"> the value </span>\(m_i\)<span class="comment-syntax"> for this LP</span>
@ -292,6 +293,7 @@ mass might also support "in kilograms" and "in grams", for instance.
<span class="reserved-syntax">literal_pattern_element</span><span class="plain-syntax"> </span><span class="function-syntax">LiteralPatterns::lpe_new</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">LiteralPatterns::lpe_new</span></span>:<br/><a href="3-lp.html#SP25_7_2_1_1">&#167;25.7.2.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">r</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sgn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">literal_pattern_element</span><span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">.</span><span class="element-syntax">element_range</span><span class="plain-syntax"> = -1; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">.</span><span class="element-syntax">element_range</span><span class="plain-syntax"> = </span><span class="identifier-syntax">r</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">.</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">.</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">.</span><span class="element-syntax">element_index</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">.</span><span class="element-syntax">element_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
@ -660,8 +662,11 @@ on unusual platforms.
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">point_at</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">point_at</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">digits_found</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">matched_scaledown</span><span class="plain-syntax"> *= </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">number_base</span><span class="plain-syntax">; </span><span class="identifier-syntax">point_at</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">tot</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_index</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)) </span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tot</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">)*</span><span class="identifier-syntax">tot</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> != -1) { </span><span class="comment-syntax"> i.e., if the range of this LPE is finite</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">tot</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">tot</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> + </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tot</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">)*(</span><span class="identifier-syntax">tot</span><span class="plain-syntax"> - </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tot</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">max_16_bit</span><span class="plain-syntax">) </span><span class="identifier-syntax">overflow_16_bit_flag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">tot</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">max_32_bit</span><span class="plain-syntax">) </span><span class="identifier-syntax">overflow_32_bit_flag</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">tot</span><span class="plain-syntax"> = </span><span class="identifier-syntax">matched_number</span><span class="plain-syntax"> + </span><span class="identifier-syntax">tot</span><span class="plain-syntax">;</span>
@ -789,29 +794,31 @@ which is annoying. So we have a mechanism to suppress duplicates:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max</span><span class="plain-syntax"> = </span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">min_val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">max_val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> + </span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">prototype_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_number</span><span class="plain-syntax">(4, &amp;</span><span class="identifier-syntax">max</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_number</span><span class="plain-syntax">(4, &amp;</span><span class="identifier-syntax">min_val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_number</span><span class="plain-syntax">(5, &amp;</span><span class="identifier-syntax">max_val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">element_overflow_at</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_index</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"first"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"second"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"third"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"fourth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"fifth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"sixth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"seventh"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"eighth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"ninth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">9</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"tenth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(5, </span><span class="string-syntax">"eventual"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"first"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"second"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"third"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"fourth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"fifth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"sixth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"seventh"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"eighth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"ninth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">9</span><span class="plain-syntax">: </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"tenth"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_text</span><span class="plain-syntax">(6, </span><span class="string-syntax">"eventual"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_ElementOverflow</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"In the sentence %1, you use the notation '%2' to write a constant value. "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"But the notation was specified as '%3', which means that the %5 numerical "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"part should range between 0 and %4."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="string-syntax">"But the notation was specified as '%3', which means that the %6 numerical "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"part should range between %4 and %5."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
</pre>
@ -1100,7 +1107,8 @@ note that the following uses the raw text of the word.
<span class="plain-syntax"> </span><span class="reserved-syntax">literal_pattern_element</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lpe</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">lp_elements</span><span class="plain-syntax">[</span><span class="identifier-syntax">ec</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">m</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="3-lp.html#SP24" class="function-link"><span class="function-syntax">LiteralPatterns::write_val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">m</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">v</span><span class="plain-syntax">/(</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">)) % </span><span class="identifier-syntax">m</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">number_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">print_with_leading_zeros</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">v</span><span class="plain-syntax">/(</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">)) % </span><span class="identifier-syntax">m</span><span class="plain-syntax"> + </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">number_base</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">print_with_leading_zeros</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ec</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-lp.html#SP23_3_1" class="named-paragraph-link"><span class="named-paragraph">Index the fractional part of the value</span><span class="named-paragraph-number">23.3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ec</span><span class="plain-syntax">++;</span>
@ -1399,7 +1407,7 @@ middle of either angle-escapes or the material in between.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">j</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">lpe_notation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax"> = { </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">)+</span><span class="identifier-syntax">i</span><span class="plain-syntax">-1,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Wide::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lexer::word_raw_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">)+</span><span class="identifier-syntax">i</span><span class="plain-syntax">-1)) - </span><span class="constant-syntax">1</span><span class="plain-syntax"> };</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Wide::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lexer::word_raw_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">)+</span><span class="identifier-syntax">i</span><span class="plain-syntax">-1)) - </span><span class="constant-syntax">1</span><span class="plain-syntax"> };</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-lp.html#SP25_7_2_2" class="named-paragraph-link"><span class="named-paragraph">Compile unescaped notation between from and to</span><span class="named-paragraph-number">25.7.2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
@ -1450,6 +1458,7 @@ material or else names for parts about which nothing else is said.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="comment-syntax"> LOG("Scan escape &lt;%S&gt;\n", angles);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::trim_white_space</span><span class="plain-syntax">(</span><span class="identifier-syntax">angles</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">AW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">angles</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="function-syntax">&lt;quoted-text&gt;</span><span class="plain-syntax">(</span><span class="identifier-syntax">AW</span><span class="plain-syntax">)) {</span>
@ -1485,7 +1494,9 @@ character ones.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">from</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">to</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">from</span><span class="plain-syntax">.</span><span class="element-syntax">char_pos</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">to</span><span class="plain-syntax">.</span><span class="element-syntax">char_pos</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> LOG("Scan word %W, %d to %W, %d\n",</span>
<span class="plain-syntax"> </span><span class="comment-syntax"> Wordings::one_word(from.wn), from.char_pos, Wordings::one_word(to.wn), to.char_pos);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">from</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">to</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax">) || ((</span><span class="identifier-syntax">from</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">to</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">from</span><span class="plain-syntax">.</span><span class="element-syntax">char_pos</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">to</span><span class="plain-syntax">.</span><span class="element-syntax">char_pos</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">NW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">.</span><span class="element-syntax">wn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text_of_word</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::word_raw_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">NW</span><span class="plain-syntax">)+</span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
@ -1634,7 +1645,8 @@ this is deferred until all elements exist, at which point we &mdash;
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">element_name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Want %W have %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-lp.html#SP25_12" class="named-paragraph-link"><span class="named-paragraph">Log this literal pattern in full</span><span class="named-paragraph-number">25.12</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Here, want %W have %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(...),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the part names after 'with' do not exactly match those named "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"in the specification itself"</span><span class="plain-syntax">,</span>
@ -1656,9 +1668,10 @@ this is deferred until all elements exist, at which point we &mdash;
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">O</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">MAX_DIGITS_MASK_LSO</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_digits</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">O</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">MAX_DIGITS_MASK_LSO</span><span class="plain-syntax">) / </span><span class="identifier-syntax">MAX_DIGITS_LSO</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">O</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">MAXIMUM_LSO</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_max_ANNOT</span><span class="plain-syntax">) + </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_min_ANNOT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe_max_ANNOT</span><span class="plain-syntax">) - </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">O</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">MAX_DIGITS_MASK_LSO</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> + </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;=lpe-&gt;</span><span class="element-syntax">max_digits</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">/</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">number_base</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(...),</span>
@ -1753,7 +1766,8 @@ optional, and it must not be the first.
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">min_digits</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_digits</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1000000</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%d to %d digits "</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">min_digits</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">max_digits</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">print_with_leading_zeros</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"printed with leading zeros "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"range 0 to %d "</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"range %d to %d "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> + </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"range unlimited "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"(base %d) "</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">number_base</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"- multiplier %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">);</span>
@ -1764,7 +1778,7 @@ optional, and it must not be the first.
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-lp.html#SP25">&#167;25</a>.</li></ul>
<ul class="endnotetexts"><li>This code is used in <a href="3-lp.html#SP25">&#167;25</a>, <a href="3-lp.html#SP25_10">&#167;25.10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP26" class="paragraph-anchor"></a><b>&#167;26. </b>Group names are created when first seen; the following recognises one which
has been seen before.
</p>
@ -1921,13 +1935,18 @@ For instance, defining:
<span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::begin</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">offset_addition</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">offset_addition</span><span class="plain-syntax">, </span><span class="string-syntax">" + %d"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">==0)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- ({full}/%d) -) "</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- ({full}/%d%S) -) "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">, </span><span class="identifier-syntax">offset_addition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">1</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- (({full}/%d)%%%d) -) "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- (({full}/%d)%%%d%S) -) "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">, </span><span class="identifier-syntax">offset_addition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- ({full}%%%d) -) "</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- ({full}%%%d%S) -) "</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_range</span><span class="plain-syntax">, </span><span class="identifier-syntax">offset_addition</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">XW</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Feeds::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::phrasual_length</span><span class="plain-syntax">(</span><span class="identifier-syntax">XW</span><span class="plain-syntax">) &gt;= </span><span class="identifier-syntax">MAX_WORDS_PER_PHRASE</span><span class="plain-syntax"> + </span><span class="constant-syntax">5</span><span class="plain-syntax">)</span>
@ -1935,6 +1954,7 @@ For instance, defining:
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Sentences::make_node</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">XW</span><span class="plain-syntax">, </span><span class="character-syntax">'.'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">offset_addition</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-lp.html#SP29">&#167;29</a>.</li></ul>
@ -1977,10 +1997,14 @@ For instance, the dollars-and-cents example compiles:
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" (- ("</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;lp-&gt;</span><span class="element-syntax">no_lp_elements</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">literal_pattern_element</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lpe</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">lp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">lp_elements</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">"("</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">&gt;0) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">"+"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax"> != </span><span class="constant-syntax">1</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">"%d*"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_multiplier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">"{part%d}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">" - %d)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">lpe</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">element_offset</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">, </span><span class="string-syntax">") -) "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Feeds::feed_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">print_rule_buff</span><span class="plain-syntax">);</span>

View file

@ -1,6 +1,6 @@
Total memory consumption was 138261K = 135 MB
---- was used for 2115190 objects, in 374468 frames in 0 x 800K = 0K = 0 MB:
---- was used for 2115191 objects, in 374469 frames in 0 x 800K = 0K = 0 MB:
30.5% inter_tree_node_array 60 x 8192 = 491520 objects, 43255680 bytes
19.1% text_stream_array 4813 x 100 = 481300 objects, 27106816 bytes
@ -143,7 +143,7 @@ Total memory consumption was 138261K = 135 MB
---- semver_range 42 objects, 4368 bytes
---- use_option 32 objects, 4352 bytes
---- either_or_property_data 62 objects, 3968 bytes
---- parse_node_annotation_type 120 objects, 3840 bytes
---- parse_node_annotation_type 121 objects, 3872 bytes
---- method_set 108 objects, 3456 bytes
---- definition 48 objects, 3456 bytes
---- property_setting_bp_data 86 objects, 3440 bytes
@ -269,5 +269,5 @@ Total memory consumption was 138261K = 135 MB
---- code generation workspace for objects 3488 bytes in 19 claims
0.1% emitter array storage 281184 bytes in 2006 claims
-137.-4% was overhead - -194581688 bytes = -190021K = -185 MB
-137.-4% was overhead - -194581720 bytes = -190021K = -185 MB

View file

@ -1,29 +1,29 @@
100.0% in inform7 run
67.5% in compilation to Inter
44.6% in //Sequence::undertake_queued_tasks//
67.9% in compilation to Inter
45.0% in //Sequence::undertake_queued_tasks//
4.9% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
1.9% in //ImperativeDefinitions::assess_all//
1.9% in //RTPhrasebook::compile_entries//
1.5% in //RTKindConstructors::compile//
1.1% in //Sequence::lint_inter//
0.7% in //ImperativeDefinitions::compile_first_block//
0.7% in //Sequence::undertake_queued_tasks//
0.3% in //CompletionModule::compile//
0.3% in //ImperativeDefinitions::compile_first_block//
0.3% in //InferenceSubjects::emit_all//
0.3% in //MajorNodes::pass_2//
0.3% in //Sequence::undertake_queued_tasks//
0.3% in //Sequence::undertake_queued_tasks//
0.3% in //World::stage_V//
5.0% not specifically accounted for
28.2% in running Inter pipeline
9.5% in step 14/15: generate inform6 -> auto.inf
6.8% in step 5/15: load-binary-kits
7.2% in step 5/15: load-binary-kits
6.1% in step 6/15: make-synoptic-module
1.9% in step 9/15: make-identifiers-unique
0.3% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls
2.3% not specifically accounted for
1.9% not specifically accounted for
3.4% in supervisor
0.8% not specifically accounted for
0.4% not specifically accounted for

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "Architecture16Kit",
"version": "10.2.0-beta+6W80"
"version": "10.2.0-beta+6W81"
},
"compatibility": "16-bit",
"kit-details": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "Architecture32Kit",
"version": "10.2.0-beta+6W80"
"version": "10.2.0-beta+6W81"
},
"compatibility": "32-bit",
"kit-details": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "BasicInformKit",
"version": "10.2.0-beta+6W80"
"version": "10.2.0-beta+6W81"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "CommandParserKit",
"version": "10.2.0-beta+6W80"
"version": "10.2.0-beta+6W81"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "EnglishLanguageKit",
"version": "10.2.0-beta+6W80"
"version": "10.2.0-beta+6W81"
},
"needs": [ {
"need": {

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "WorldModelKit",
"version": "10.2.0-beta+6W80"
"version": "10.2.0-beta+6W81"
},
"needs": [ {
"need": {

View file

@ -284,7 +284,7 @@ by a bracketed list of up to three options in any order.
<lp-part> ==> { 0, RP[1] }
<lp-part> ::=
<np-unparsed-bal> ( <lp-part-option-list> ) | ==> { 0, LPRequests::mark(RP[1], R[2], <<max_part_val>>) }
<np-unparsed-bal> ( <lp-part-option-list> ) | ==> { 0, LPRequests::mark(RP[1], R[2], <<min_part_val>>, <<max_part_val>>) }
<np-unparsed-bal> ==> { 0, RP[1] }
<lp-part-option-list> ::=
@ -301,7 +301,7 @@ by a bracketed list of up to three options in any order.
with leading zeros | ==> { WITH_LEADING_ZEROS_LSO, - }
without leading zeros | ==> { WITHOUT_LEADING_ZEROS_LSO, - }
in <number-base> | ==> { BASE_LSO*R[1], - }
<cardinal-number> to <cardinal-number> | ==> <<max_part_val>> = R[2]; @<Apply range@>;
<cardinal-number> to <cardinal-number> | ==> <<min_part_val>> = R[1]; <<max_part_val>> = R[2]; @<Apply range@>;
up to <cardinal-number> <number-base> digit/digits | ==> @<Apply based max digit count@>;
up to <cardinal-number> digit/digits | ==> @<Apply max digit count@>;
<cardinal-number> <number-base> digit/digits | ==> @<Apply based digit count@>;
@ -309,11 +309,11 @@ by a bracketed list of up to three options in any order.
...... ==> @<Issue PM_BadLPPartOption problem@>
@<Apply range@> =
if (R[1] != 0)
if (R[1] > R[2])
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...),
"the range in a named part has to begin at 0",
"for the moment at least.");
==> { MAXIMUM_LSO, - };
"the minimum value for a named part cannot be greater than the maximum",
"or it would be impossible for any value of this kind to exist.");
==> { MINIMUM_LSO + MAXIMUM_LSO, - };
@<Apply max digit count@> =
if (R[1] < 1)
@ -370,6 +370,7 @@ literal_pattern_name *LPRequests::compose(literal_pattern_name *A, literal_patte
@d WITH_LEADING_ZEROS_LSO 0x00000004
@d WITHOUT_LEADING_ZEROS_LSO 0x00000008
@d MAXIMUM_LSO 0x00000010
@d MINIMUM_LSO 0x00000020
@d BASE_LSO 0x00000100
@d BASE_MASK_LSO 0x0000ff00
@d MIN_DIGITS_LSO 0x00010000
@ -378,10 +379,11 @@ literal_pattern_name *LPRequests::compose(literal_pattern_name *A, literal_patte
@d MAX_DIGITS_MASK_LSO 0x7f000000
=
parse_node *LPRequests::mark(parse_node *A, int N, int M) {
parse_node *LPRequests::mark(parse_node *A, int N, int MI, int MA) {
if (A) {
Annotations::write_int(A, lpe_options_ANNOT, N);
if (N & MAXIMUM_LSO) Annotations::write_int(A, lpe_max_ANNOT, M);
if (N & MINIMUM_LSO) Annotations::write_int(A, lpe_min_ANNOT, MI);
if (N & MAXIMUM_LSO) Annotations::write_int(A, lpe_max_ANNOT, MA);
}
return A;
}

View file

@ -416,6 +416,7 @@ void CoreSyntax::grant_L2_permissions(void) {
@e evaluation_ANNOT /* |parse_node|: result of evaluating the text */
@e explicit_gender_marker_ANNOT /* |int|: used by PROPER NOUN nodes for evident genders */
@e lpe_options_ANNOT /* |int|: options set for a literal pattern part */
@e lpe_min_ANNOT /* |int|: value offset for a literal pattern part */
@e lpe_max_ANNOT /* |int|: maximum value for a literal pattern part */
@e multiplicity_ANNOT /* |int|: e.g., 5 for "five gold rings" */
@e new_relation_here_ANNOT /* |binary_predicate|: new relation as subject of "relates" sentence */
@ -466,6 +467,8 @@ void CoreSyntax::declare_L3_annotations(void) {
lpe_options_ANNOT, CoreSyntax::write_lpe_options_ANNOT);
Annotations::declare_type(
lpe_max_ANNOT, CoreSyntax::write_lpe_max_ANNOT);
Annotations::declare_type(
lpe_min_ANNOT, CoreSyntax::write_lpe_min_ANNOT);
Annotations::declare_type(
multiplicity_ANNOT, CoreSyntax::write_multiplicity_ANNOT);
Annotations::declare_type(
@ -521,6 +524,9 @@ void CoreSyntax::write_lpe_options_ANNOT(text_stream *OUT, parse_node *p) {
void CoreSyntax::write_lpe_max_ANNOT(text_stream *OUT, parse_node *p) {
WRITE(" {lpe max: %d}", Annotations::read_int(p, lpe_max_ANNOT));
}
void CoreSyntax::write_lpe_min_ANNOT(text_stream *OUT, parse_node *p) {
WRITE(" {lpe offset: %d}", Annotations::read_int(p, lpe_min_ANNOT));
}
void CoreSyntax::write_multiplicity_ANNOT(text_stream *OUT, parse_node *p) {
if (Annotations::read_int(p, multiplicity_ANNOT))
WRITE(" {multiplicity %d}", Annotations::read_int(p, multiplicity_ANNOT));
@ -597,6 +603,7 @@ void CoreSyntax::grant_L3_permissions(void) {
Annotations::allow(PROPER_NOUN_NT, defn_language_ANNOT);
Annotations::allow(PROPER_NOUN_NT, lpe_options_ANNOT);
Annotations::allow(PROPER_NOUN_NT, lpe_max_ANNOT);
Annotations::allow(PROPER_NOUN_NT, lpe_min_ANNOT);
Annotations::allow(PROPER_NOUN_NT, multiplicity_ANNOT);
Annotations::allow(UNPARSED_NOUN_NT, new_relation_here_ANNOT);
Annotations::allow(PROPER_NOUN_NT, new_relation_here_ANNOT);

View file

@ -151,11 +151,7 @@ void RTLiteralPatterns::compilation_agent(compilation_subtask *t) {
EmitCode::up();
EmitCode::inv(EQ_BIP);
EmitCode::down();
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lpe->element_multiplier));
EmitCode::up();
@<Evaluate LPE value to be printed@>;
EmitCode::val_number(0);
EmitCode::up();
EmitCode::up();
@ -175,11 +171,7 @@ void RTLiteralPatterns::compilation_agent(compilation_subtask *t) {
EmitCode::inv(PRINTNUMBER_BIP);
}
EmitCode::down();
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lpe->element_multiplier));
EmitCode::up();
@<Evaluate LPE value to be printed@>;
if (lpe->number_base != 10)
EmitCode::val_number((inter_ti) (lpe->number_base));
EmitCode::up();
@ -213,15 +205,7 @@ void RTLiteralPatterns::compilation_agent(compilation_subtask *t) {
EmitCode::inv(PRINTNUMBER_BIP);
}
EmitCode::down();
EmitCode::inv(MODULO_BIP);
EmitCode::down();
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lpe->element_multiplier));
EmitCode::up();
EmitCode::val_number((inter_ti) (lpe->element_range));
EmitCode::up();
@<Evaluate LPE value to be printed@>;
if (lpe->number_base != 10)
EmitCode::val_number((inter_ti) (lpe->number_base));
EmitCode::up();
@ -231,23 +215,23 @@ void RTLiteralPatterns::compilation_agent(compilation_subtask *t) {
@<Print leading zeros@> =
if (lpe->print_with_leading_zeros) {
int max_printable = lpe->element_range + lpe->element_offset;
if (lpe->max_digits < 1000000) {
int b = 1;
for (int d = 1; d <= lpe->max_digits; d++)
b = b * lpe->number_base;
max_printable = b - 1;
}
int pow = 1;
while (lpe->element_range > pow) pow = pow * lpe->number_base;
while (max_printable > pow)
pow = pow * lpe->number_base;
for (; pow>1; pow = pow/lpe->number_base)
if (lpe->element_range > pow) {
if (max_printable > pow) {
EmitCode::inv(IF_BIP);
EmitCode::down();
EmitCode::inv(LT_BIP);
EmitCode::down();
EmitCode::inv(MODULO_BIP);
EmitCode::down();
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lpe->element_multiplier));
EmitCode::up();
EmitCode::val_number((inter_ti) (lpe->element_range));
EmitCode::up();
@<Evaluate LPE value to be printed@>;
EmitCode::val_number((inter_ti) (pow));
EmitCode::up();
EmitCode::code();
@ -261,18 +245,38 @@ void RTLiteralPatterns::compilation_agent(compilation_subtask *t) {
}
}
@<Evaluate LPE value to be printed@> =
if (lpe->element_offset != 0) {
EmitCode::inv(PLUS_BIP);
EmitCode::down();
}
if (lpe->element_range >= 0) {
EmitCode::inv(MODULO_BIP);
EmitCode::down();
}
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lpe->element_multiplier));
EmitCode::up();
if (lpe->element_range >= 0) {
EmitCode::val_number((inter_ti) (lpe->element_range));
EmitCode::up();
}
if (lpe->element_offset != 0) {
EmitCode::val_number((inter_ti) (lpe->element_offset));
EmitCode::up();
}
@<Truncate the printed form here if subsequent numerical parts are zero@> =
if (oc == ec) {
literal_pattern_element *lpe = &(lp->lp_elements[ec]);
if (ec == 0) {
EmitCode::inv(IF_BIP);
EmitCode::down();
EmitCode::inv(EQ_BIP);
EmitCode::down();
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lp->lp_elements[ec].element_multiplier));
EmitCode::up();
@<Evaluate LPE value to be printed@>;
EmitCode::val_number(0);
EmitCode::up();
EmitCode::code();
@ -285,15 +289,7 @@ void RTLiteralPatterns::compilation_agent(compilation_subtask *t) {
EmitCode::down();
EmitCode::inv(EQ_BIP);
EmitCode::down();
EmitCode::inv(MODULO_BIP);
EmitCode::down();
EmitCode::inv(DIVIDE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, value_s);
EmitCode::val_number((inter_ti) (lp->lp_elements[ec].element_multiplier));
EmitCode::up();
EmitCode::val_number((inter_ti) (lp->lp_elements[ec].element_range));
EmitCode::up();
@<Evaluate LPE value to be printed@>;
EmitCode::val_number(0);
EmitCode::up();
EmitCode::code();
@ -1168,13 +1164,42 @@ sets the |parsed_number| global to the value matched.
EmitCode::up();
}
if (lpe->element_index > 0) {
if (lpe->element_offset != 0) {
EmitCode::inv(STORE_BIP);
EmitCode::down();
EmitCode::ref_symbol(K_value, gprk.tot_s);
EmitCode::inv(MINUS_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, gprk.tot_s);
EmitCode::val_number((inter_ti) lpe->element_offset);
EmitCode::up();
EmitCode::up();
}
if (lpe->element_range > 0) {
inter_ti min_val = 0;
inter_ti max_val = (inter_ti) (lpe->element_range);
EmitCode::inv(IF_BIP);
EmitCode::down();
EmitCode::inv(LT_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, gprk.tot_s);
EmitCode::val_number(min_val);
EmitCode::up();
EmitCode::code();
EmitCode::down();
EmitCode::inv(JUMP_BIP);
EmitCode::down();
EmitCode::lab(failed_label);
EmitCode::up();
EmitCode::up();
EmitCode::up();
EmitCode::inv(IF_BIP);
EmitCode::down();
EmitCode::inv(GE_BIP);
EmitCode::down();
EmitCode::val_symbol(K_value, gprk.tot_s);
EmitCode::val_number((inter_ti) lpe->element_range);
EmitCode::val_number(max_val);
EmitCode::up();
EmitCode::code();
EmitCode::down();

View file

@ -112,6 +112,7 @@ The rightmost element $e_{n-1}$ is the least significant numerically.
=
typedef struct literal_pattern_element {
int element_index; /* the value $i$ placing this within its LP, where $0\leq i<n$ */
int element_offset; /* amount by which outward values differ from stored ones */
int element_range; /* the value $r_i$ for this LP */
int element_multiplier; /* the value $m_i$ for this LP */
@ -189,6 +190,7 @@ literal_pattern_element *parsing_new_element = NULL;
literal_pattern_element LiteralPatterns::lpe_new(int i, int r, int sgn) {
literal_pattern_element lpe;
if (i == 0) lpe.element_range = -1; else lpe.element_range = r;
lpe.element_offset = 0;
lpe.element_multiplier = 1;
lpe.element_index = i;
lpe.element_name = EMPTY_WORDING;
@ -508,8 +510,11 @@ on unusual platforms.
while ((point_at > 0) && (point_at < digits_found)) {
matched_scaledown *= lpe->number_base; point_at++;
}
if ((tot >= lpe->element_range) && (lpe->element_index > 0)) element_overflow_at = lpe;
tot = (lpe->element_multiplier)*tot;
if (lpe->element_range != -1) { /* i.e., if the range of this LPE is finite */
if ((tot < lpe->element_offset) || (tot >= lpe->element_offset + lpe->element_range))
element_overflow_at = lpe;
}
tot = (lpe->element_multiplier)*(tot - lpe->element_offset);
if (tot > max_16_bit) overflow_16_bit_flag = TRUE;
if (tot > max_32_bit) overflow_32_bit_flag = TRUE;
tot = matched_number + tot;
@ -617,29 +622,31 @@ which is annoying. So we have a mechanism to suppress duplicates:
@ The more specific problem of an internal overflow:
@<Report a problem because one element in the notation overflows@> =
int max = element_overflow_at->element_range - 1;
int min_val = element_overflow_at->element_offset;
int max_val = element_overflow_at->element_offset + element_overflow_at->element_range - 1;
Problems::quote_source(1, current_sentence);
Problems::quote_wording(2, W);
Problems::quote_wording(3, lp->prototype_text);
Problems::quote_number(4, &max);
Problems::quote_number(4, &min_val);
Problems::quote_number(5, &max_val);
switch (element_overflow_at->element_index) {
case 0: Problems::quote_text(5, "first"); break;
case 1: Problems::quote_text(5, "second"); break;
case 2: Problems::quote_text(5, "third"); break;
case 3: Problems::quote_text(5, "fourth"); break;
case 4: Problems::quote_text(5, "fifth"); break;
case 5: Problems::quote_text(5, "sixth"); break;
case 6: Problems::quote_text(5, "seventh"); break;
case 7: Problems::quote_text(5, "eighth"); break;
case 8: Problems::quote_text(5, "ninth"); break;
case 9: Problems::quote_text(5, "tenth"); break;
default: Problems::quote_text(5, "eventual"); break;
case 0: Problems::quote_text(6, "first"); break;
case 1: Problems::quote_text(6, "second"); break;
case 2: Problems::quote_text(6, "third"); break;
case 3: Problems::quote_text(6, "fourth"); break;
case 4: Problems::quote_text(6, "fifth"); break;
case 5: Problems::quote_text(6, "sixth"); break;
case 6: Problems::quote_text(6, "seventh"); break;
case 7: Problems::quote_text(6, "eighth"); break;
case 8: Problems::quote_text(6, "ninth"); break;
case 9: Problems::quote_text(6, "tenth"); break;
default: Problems::quote_text(6, "eventual"); break;
}
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_ElementOverflow));
Problems::issue_problem_segment(
"In the sentence %1, you use the notation '%2' to write a constant value. "
"But the notation was specified as '%3', which means that the %5 numerical "
"part should range between 0 and %4.");
"But the notation was specified as '%3', which means that the %6 numerical "
"part should range between %4 and %5.");
Problems::issue_problem_end();
return NULL;
@ -893,7 +900,8 @@ note that the following uses the raw text of the word.
literal_pattern_element *lpe = &(lp->lp_elements[ec]);
int m = lpe->element_range;
LiteralPatterns::write_val(OUT, m,
(v/(lpe->element_multiplier)) % m, lpe->number_base, lpe->print_with_leading_zeros);
(v/(lpe->element_multiplier)) % m + lpe->element_offset,
lpe->number_base, lpe->print_with_leading_zeros);
if (ec == 0) @<Index the fractional part of the value@>;
}
ec++;
@ -1145,7 +1153,7 @@ middle of either angle-escapes or the material in between.
if (j == 0) {
if (i > 0) {
lpe_notation_pos to = { Wordings::first_wn(NW)+i-1,
Wide::len(Lexer::word_raw_text(Wordings::last_wn(NW)+i-1)) - 1 };
Wide::len(Lexer::word_raw_text(Wordings::first_wn(NW)+i-1)) - 1 };
@<Compile unescaped notation between from and to@>;
}
} else {
@ -1191,6 +1199,7 @@ middle of either angle-escapes or the material in between.
material or else names for parts about which nothing else is said.
@<Act on angle-bracketed escape@> =
// LOG("Scan escape <%S>\n", angles);
Str::trim_white_space(angles);
wording AW = Feeds::feed_text(angles);
if (<quoted-text>(AW)) {
@ -1221,7 +1230,9 @@ word to play with, we optimise by making a word token instead of a run of
character ones.
@<Compile unescaped notation between from and to@> =
if ((from.wn < to.wn) || (from.char_pos <= to.char_pos)) {
// LOG("Scan word %W, %d to %W, %d\n",
// Wordings::one_word(from.wn), from.char_pos, Wordings::one_word(to.wn), to.char_pos);
if ((from.wn < to.wn) || ((from.wn == to.wn) && (from.char_pos <= to.char_pos))) {
wording NW = Wordings::new(from.wn, to.wn);
for (int i=0; i<Wordings::length(NW); i++) {
wchar_t *text_of_word = Lexer::word_raw_text(Wordings::first_wn(NW)+i);
@ -1342,7 +1353,8 @@ this is deferred until all elements exist, at which point we --
if (Wordings::empty(lpe->element_name)) {
lpe->element_name = Node::get_text(p);
} else if (Wordings::match(lpe->element_name, Node::get_text(p)) == FALSE) {
LOG("Want %W have %W\n", lpe->element_name, Node::get_text(p));
@<Log this literal pattern in full@>;
LOG("Here, want %W have %W\n", lpe->element_name, Node::get_text(p));
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...),
"the part names after 'with' do not exactly match those named "
"in the specification itself",
@ -1364,9 +1376,10 @@ this is deferred until all elements exist, at which point we --
if (O & MAX_DIGITS_MASK_LSO)
lpe->max_digits = ((O & MAX_DIGITS_MASK_LSO) / MAX_DIGITS_LSO);
if (O & MAXIMUM_LSO) {
lpe->element_range = Annotations::read_int(p, lpe_max_ANNOT) + 1;
lpe->element_offset = Annotations::read_int(p, lpe_min_ANNOT);
lpe->element_range = Annotations::read_int(p, lpe_max_ANNOT) - lpe->element_offset + 1;
if (O & MAX_DIGITS_MASK_LSO) {
int n = lpe->element_range - 1;
int n = lpe->element_offset + lpe->element_range - 1;
for (int i=1; i<=lpe->max_digits; i++) n = n/lpe->number_base;
if (n != 0)
StandardProblems::sentence_problem(Task::syntax_tree(), _p_(...),
@ -1452,7 +1465,8 @@ optional, and it must not be the first.
else if ((lpe->min_digits > 1) || (lpe->max_digits < 1000000))
LOG("%d to %d digits ", lpe->min_digits, lpe->max_digits);
if (lpe->print_with_leading_zeros) LOG("printed with leading zeros ");
if (lpe->element_range >= 0) LOG("range 0 to %d ", lpe->element_range);
if (lpe->element_range >= 0) LOG("range %d to %d ",
lpe->element_offset, lpe->element_offset + lpe->element_range);
else LOG("range unlimited ");
LOG("(base %d) ", lpe->number_base);
LOG("- multiplier %d\n", lpe->element_multiplier);
@ -1600,13 +1614,18 @@ To define which number is cents part of ( full - price ) : |(- ({full}%100) -)|.
id = Feeds::begin();
TEMPORARY_TEXT(print_rule_buff)
TEMPORARY_TEXT(offset_addition)
if (lpe->element_offset != 0)
WRITE_TO(offset_addition, " + %d", lpe->element_offset);
if (i==0)
WRITE_TO(print_rule_buff, " (- ({full}/%d) -) ", lpe->element_multiplier);
WRITE_TO(print_rule_buff, " (- ({full}/%d%S) -) ",
lpe->element_multiplier, offset_addition);
else if (lpe->element_multiplier > 1)
WRITE_TO(print_rule_buff, " (- (({full}/%d)%%%d) -) ",
lpe->element_multiplier, lpe->element_range);
WRITE_TO(print_rule_buff, " (- (({full}/%d)%%%d%S) -) ",
lpe->element_multiplier, lpe->element_range, offset_addition);
else
WRITE_TO(print_rule_buff, " (- ({full}%%%d) -) ", lpe->element_range);
WRITE_TO(print_rule_buff, " (- ({full}%%%d%S) -) ",
lpe->element_range, offset_addition);
Feeds::feed_text(print_rule_buff);
XW = Feeds::end(id);
if (Wordings::phrasual_length(XW) >= MAX_WORDS_PER_PHRASE + 5)
@ -1614,6 +1633,7 @@ To define which number is cents part of ( full - price ) : |(- ({full}%100) -)|.
else
Sentences::make_node(Task::syntax_tree(), XW, '.');
DISCARD_TEXT(print_rule_buff)
DISCARD_TEXT(offset_addition)
}
@ And similarly, a packing phrase to calculate the value given its elements.
@ -1651,10 +1671,14 @@ To decide which price is price with dollars part ( part0 - a number ) cents part
WRITE_TO(print_rule_buff, " (- (");
for (int i=0; i<lp->no_lp_elements; i++) {
literal_pattern_element *lpe = &(lp->lp_elements[i]);
if (lpe->element_offset != 0)
WRITE_TO(print_rule_buff, "(");
if (i>0) WRITE_TO(print_rule_buff, "+");
if (lpe->element_multiplier != 1)
WRITE_TO(print_rule_buff, "%d*", lpe->element_multiplier);
WRITE_TO(print_rule_buff, "{part%d}", i);
if (lpe->element_offset != 0)
WRITE_TO(print_rule_buff, " - %d)", lpe->element_offset);
}
WRITE_TO(print_rule_buff, ") -) ");
Feeds::feed_text(print_rule_buff);