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

Adapted parser to the new truncated dictionary word bit provided by I6

This commit is contained in:
Graham Nelson 2024-03-12 08:54:17 +00:00
parent 81053713c3
commit 8ba38acec7
27 changed files with 263 additions and 147 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
[Version](notes/versioning.md): 10.2.0-beta+6X36 'Krypton' (26 February 2024)
[Version](notes/versioning.md): 10.2.0-beta+6X37 'Krypton' (12 March 2024)
## About Inform

View file

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 26 February 2024
Build Number: 6X36
Build Date: 12 March 2024
Build Number: 6X37

View file

@ -64,7 +64,7 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture16Kit</a></li><li><b>Input Output Template</b></li></ul></div>
<p class="purpose">Access to the keyboard and to textual windows.</p>
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Transcript support</a></li><li><a href="S-io.html#SP2">&#167;2. Variables and Arrays</a></li><li><a href="S-io.html#SP3">&#167;3. Dictionary words</a></li><li><a href="S-io.html#SP4">&#167;4. Keyboard Input</a></li><li><a href="S-io.html#SP5">&#167;5. Buffer Functions</a></li><li><a href="S-io.html#SP6">&#167;6. Dictionary Functions</a></li><li><a href="S-io.html#SP7">&#167;7. Command Tables</a></li><li><a href="S-io.html#SP8">&#167;8. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP9">&#167;9. Action functions</a></li><li><a href="S-io.html#SP10">&#167;10. The Screen</a></li><li><a href="S-io.html#SP11">&#167;11. Window Colours</a></li><li><a href="S-io.html#SP12">&#167;12. Main Window</a></li><li><a href="S-io.html#SP13">&#167;13. Status Line</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Transcript support</a></li><li><a href="S-io.html#SP2">&#167;2. Dictionary Parameters</a></li><li><a href="S-io.html#SP3">&#167;3. Variables and Arrays</a></li><li><a href="S-io.html#SP4">&#167;4. Dictionary words</a></li><li><a href="S-io.html#SP5">&#167;5. Keyboard Input</a></li><li><a href="S-io.html#SP6">&#167;6. Buffer Functions</a></li><li><a href="S-io.html#SP7">&#167;7. Dictionary Functions</a></li><li><a href="S-io.html#SP8">&#167;8. Command Tables</a></li><li><a href="S-io.html#SP9">&#167;9. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP10">&#167;10. Action functions</a></li><li><a href="S-io.html#SP11">&#167;11. The Screen</a></li><li><a href="S-io.html#SP12">&#167;12. Window Colours</a></li><li><a href="S-io.html#SP13">&#167;13. Main Window</a></li><li><a href="S-io.html#SP14">&#167;14. Status Line</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Transcript support. </b>This is a mode in which the transcript of text in the main window is being
written out to an external file.
@ -92,12 +92,24 @@ only if scripting is on.
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Variables and Arrays. </b></p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Dictionary Parameters. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> #</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax"> = </span><span class="constant-syntax">6</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> #</span><span class="identifier-syntax">dict_par2</span><span class="plain-syntax"> = </span><span class="constant-syntax">7</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_META</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_PLURAL</span><span class="plain-syntax"> = </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_PREP</span><span class="plain-syntax"> = </span><span class="constant-syntax">8</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_SING</span><span class="plain-syntax"> = </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_BIT6</span><span class="plain-syntax"> = </span><span class="constant-syntax">32</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_TRUNC</span><span class="plain-syntax"> = </span><span class="constant-syntax">64</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_NOUN</span><span class="plain-syntax"> = </span><span class="constant-syntax">128</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Variables and Arrays. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">xcommsdir</span><span class="plain-syntax">; </span><span class="comment-syntax">true if command recording is on</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">INPUT_BUFFER_LEN</span><span class="plain-syntax"> = </span><span class="constant-syntax">120</span><span class="plain-syntax">; </span><span class="comment-syntax">Length of buffer array</span>
@ -112,7 +124,7 @@ only if scripting is on.
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">dict_entry_size</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">dict_end</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
only for debugging output, so the false positives here (where an address is in
the dictionary table, but mid-word) really do not matter.
</p>
@ -124,7 +136,7 @@ the dictionary table, but mid-word) really do not matter.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Keyboard Input. </b>The VM must provide three routines for keyboard input:
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Keyboard Input. </b>The VM must provide three routines for keyboard input:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">VM_KeyChar()</span></span> waits for a key to be pressed and then returns the
@ -155,7 +167,7 @@ to document all of that.
<span class="plain-syntax"> </span><span class="reserved-syntax">read</span><span class="plain-syntax"> </span><span class="identifier-syntax">a_buffer</span><span class="plain-syntax"> </span><span class="identifier-syntax">a_table</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
typed from the keyboard; a "parse buffer" is an array which resolves this
into individual words, pointing to the relevant entries in the dictionary
structure. Because each VM has its own format for each of these arrays (not
@ -218,7 +230,7 @@ languages of play.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">b</span><span class="plain-syntax">-&gt;1 &lt; </span><span class="identifier-syntax">b</span><span class="plain-syntax">-&gt;0) (</span><span class="identifier-syntax">b</span><span class="plain-syntax">-&gt;1)++;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
This is a data structure containing, in compressed form, the text of all the
words to be recognised by tokenisation (above). In I6 for Z, a dictionary word
value is represented at run-time by its record number in the dictionary,
@ -244,7 +256,7 @@ convert between record numbers and dictionary addresses.
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_DictionaryAddressToNumber</span><span class="plain-syntax"> </span><span class="identifier-syntax">w</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">w</span><span class="plain-syntax">-(</span><span class="identifier-syntax">HDR_DICTIONARY</span><span class="plain-syntax">--&gt;0 + </span><span class="constant-syntax">7</span><span class="plain-syntax">))/</span><span class="identifier-syntax">DICT_ENTRY_BYTES</span><span class="plain-syntax">; ];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_NumberToDictionaryAddress</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">HDR_DICTIONARY</span><span class="plain-syntax">--&gt;0 + </span><span class="constant-syntax">7</span><span class="plain-syntax"> + </span><span class="identifier-syntax">DICT_ENTRY_BYTES</span><span class="plain-syntax">*</span><span class="identifier-syntax">n</span><span class="plain-syntax">; ];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Command Tables. </b>The VM is also generated containing a data structure for the grammar
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Command Tables. </b>The VM is also generated containing a data structure for the grammar
produced by I6's <span class="extract"><span class="extract-syntax">Verb</span></span> and <span class="extract"><span class="extract-syntax">Extend</span></span> directives: this is essentially a
list of command verbs such as DROP or PUSH, together with a list of
synonyms, and then the grammar for the subsequent commands to be
@ -263,7 +275,7 @@ recognised by the parser.
<span class="plain-syntax"> </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"'"</span><span class="plain-syntax">, (</span><span class="identifier-syntax">address</span><span class="plain-syntax">) </span><span class="identifier-syntax">VM_NumberToDictionaryAddress</span><span class="plain-syntax">(</span><span class="identifier-syntax">j</span><span class="plain-syntax">), </span><span class="string-syntax">"' "</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
in a single byte in dictionary entries, but they did so counting downwards, so
that verb number 0 was stored as 255, 1 as 254, and so on. Inform followed
suit so that debugging of Inform 1 could be aided by using the then-available
@ -284,7 +296,7 @@ routine was added to concentrate lookups of this field in one place.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">$ff</span><span class="plain-syntax">-(</span><span class="identifier-syntax">dword</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par2</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Action functions. </b>This looks up the address of a function like <span class="extract"><span class="extract-syntax">TakeSub</span></span> from the table of
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Action functions. </b>This looks up the address of a function like <span class="extract"><span class="extract-syntax">TakeSub</span></span> from the table of
"action subroutines".
</p>
@ -293,7 +305,7 @@ routine was added to concentrate lookups of this field in one place.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> #</span><span class="identifier-syntax">actions_table</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">act</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
to refer only to two of these, the main window and the status line, but
others may also exist from time to time. Windows have unique ID numbers:
the special window ID \(-1\) means "all windows" or "the entire screen",
@ -324,7 +336,7 @@ in order to keep it accurate.
<span class="plain-syntax">[ </span><span class="identifier-syntax">VM_ScreenHeight</span><span class="plain-syntax">; </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">HDR_SCREENHLINES</span><span class="plain-syntax">-&gt;0); ];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Window Colours. </b>Each window can have its own foreground and background colours.
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Window Colours. </b>Each window can have its own foreground and background colours.
</p>
<p class="commentary">The colour of individual letters or words of type is not controllable in
@ -363,7 +375,7 @@ which is greatly superior in this respect).
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Main Window. </b>The part of the screen on which commands and responses are printed, which
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Main Window. </b>The part of the screen on which commands and responses are printed, which
ordinarily occupies almost all of the screen area.
</p>
@ -382,7 +394,7 @@ emulates the Glulx model of window rather than text colours.
<span class="plain-syntax"> </span><span class="identifier-syntax">statuswin_current</span><span class="plain-syntax"> = </span><span class="reserved-syntax">false</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Status Line. </b>Despite the name, the status line need not be a single line at the top of
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Status Line. </b>Despite the name, the status line need not be a single line at the top of
the screen: that's only the conventional default arrangement. It can expand
to become the equivalent of an old-fashioned VT220 terminal, with menus
and grids and mazes displayed lovingly in character graphics, or it can

View file

@ -64,7 +64,7 @@ MathJax = {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../extensions.html">Kits</a></li><li><a href="index.html">Architecture32Kit</a></li><li><b>Input Output Template</b></li></ul></div>
<p class="purpose">Access to the keyboard and to textual windows.</p>
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Rocks</a></li><li><a href="S-io.html#SP2">&#167;2. Transcript support</a></li><li><a href="S-io.html#SP3">&#167;3. Variables and Arrays</a></li><li><a href="S-io.html#SP4">&#167;4. Dictionary words</a></li><li><a href="S-io.html#SP5">&#167;5. Keyboard Input</a></li><li><a href="S-io.html#SP6">&#167;6. Buffer Functions</a></li><li><a href="S-io.html#SP7">&#167;7. Dictionary Functions</a></li><li><a href="S-io.html#SP8">&#167;8. Command Tables</a></li><li><a href="S-io.html#SP9">&#167;9. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP10">&#167;10. Action functions</a></li><li><a href="S-io.html#SP11">&#167;11. Glulx-Only Printing Routines</a></li><li><a href="S-io.html#SP12">&#167;12. The Screen</a></li><li><a href="S-io.html#SP13">&#167;13. Window Colours</a></li><li><a href="S-io.html#SP14">&#167;14. Main Window</a></li><li><a href="S-io.html#SP15">&#167;15. Status Line</a></li><li><a href="S-io.html#SP16">&#167;16. Quotation Boxes</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="S-io.html#SP1">&#167;1. Rocks</a></li><li><a href="S-io.html#SP2">&#167;2. Transcript support</a></li><li><a href="S-io.html#SP3">&#167;3. Dictionary Parameters</a></li><li><a href="S-io.html#SP4">&#167;4. Variables and Arrays</a></li><li><a href="S-io.html#SP5">&#167;5. Dictionary words</a></li><li><a href="S-io.html#SP6">&#167;6. Keyboard Input</a></li><li><a href="S-io.html#SP7">&#167;7. Buffer Functions</a></li><li><a href="S-io.html#SP8">&#167;8. Dictionary Functions</a></li><li><a href="S-io.html#SP9">&#167;9. Command Tables</a></li><li><a href="S-io.html#SP10">&#167;10. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP11">&#167;11. Action functions</a></li><li><a href="S-io.html#SP12">&#167;12. Glulx-Only Printing Routines</a></li><li><a href="S-io.html#SP13">&#167;13. The Screen</a></li><li><a href="S-io.html#SP14">&#167;14. Window Colours</a></li><li><a href="S-io.html#SP15">&#167;15. Main Window</a></li><li><a href="S-io.html#SP16">&#167;16. Status Line</a></li><li><a href="S-io.html#SP17">&#167;17. Quotation Boxes</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Rocks. </b>These are unique ID codes used to mark resources; think of them as inedible
cookies.
@ -126,13 +126,25 @@ only if scripting is on: this always succeeds.
<span class="plain-syntax"> </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Variables and Arrays. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Dictionary Parameters. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICT_ENTRY_BYTES</span><span class="plain-syntax"> = </span><span class="constant-syntax">12</span><span class="plain-syntax">+</span><span class="identifier-syntax">DICT_WORD_SIZE</span><span class="plain-syntax">*</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> #</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DICT_WORD_SIZE</span><span class="plain-syntax">*</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax">+4+1;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> #</span><span class="identifier-syntax">dict_par2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DICT_WORD_SIZE</span><span class="plain-syntax">*</span><span class="identifier-syntax">WORDSIZE</span><span class="plain-syntax">+4+3;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_META</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_PLURAL</span><span class="plain-syntax"> = </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_PREP</span><span class="plain-syntax"> = </span><span class="constant-syntax">8</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_SING</span><span class="plain-syntax"> = </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_BIT6</span><span class="plain-syntax"> = </span><span class="constant-syntax">32</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_TRUNC</span><span class="plain-syntax"> = </span><span class="constant-syntax">64</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">DICTPAR1_NOUN</span><span class="plain-syntax"> = </span><span class="constant-syntax">128</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Variables and Arrays. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_event</span><span class="plain-syntax"> --&gt; </span><span class="constant-syntax">4</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_arguments</span><span class="plain-syntax"> </span><span class="identifier-syntax">buffer</span><span class="plain-syntax"> </span><span class="constant-syntax">28</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_mainwin</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
@ -154,7 +166,7 @@ only if scripting is on: this always succeeds.
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse</span><span class="plain-syntax"> --&gt; </span><span class="identifier-syntax">PARSE_BUFFER_LEN</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse2</span><span class="plain-syntax"> --&gt; </span><span class="identifier-syntax">PARSE_BUFFER_LEN</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Dictionary words. </b>This tests whether an address is probably that of a dictionary word. It's used
only for debugging output, so the false positives here really do not matter.
</p>
@ -164,7 +176,7 @@ only for debugging output, so the false positives here really do not matter.
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Keyboard Input. </b>The VM must provide three routines for keyboard input:
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Keyboard Input. </b>The VM must provide three routines for keyboard input:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">VM_KeyChar()</span></span> waits for a key to be pressed and then returns the
@ -330,7 +342,7 @@ to document all of that.
<span class="character-syntax"> }</span>
<span class="character-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Buffer Functions. </b>A "buffer", in this sense, is an array containing a stream of characters
typed from the keyboard; a "parse buffer" is an array which resolves this
into individual words, pointing to the relevant entries in the dictionary
structure. Because each VM has its own format for each of these arrays (not
@ -463,7 +475,7 @@ languages of play, and is not called in the template.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">b</span><span class="plain-syntax">--&gt;0 &lt; </span><span class="identifier-syntax">INPUT_BUFFER_LEN</span><span class="plain-syntax">) (</span><span class="identifier-syntax">b</span><span class="plain-syntax">--&gt;0)++;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Dictionary Functions. </b>Again, the dictionary structure is differently arranged on the different VMs.
This is a data structure containing, in compressed form, the text of all the
words to be recognised by tokenisation (above). In I6 for Glulx, a dictionary
word is represented at run-time by its record's address in the dictionary.
@ -500,7 +512,7 @@ since, on Glulx, they are the same, these are each the identity function.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Command Tables. </b>The VM is also generated containing a data structure for the grammar
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Command Tables. </b>The VM is also generated containing a data structure for the grammar
produced by I6's <span class="extract"><span class="extract-syntax">Verb</span></span> and <span class="extract"><span class="extract-syntax">Extend</span></span> directives: this is essentially a
list of command verbs such as DROP or PUSH, together with a list of
synonyms, and then the grammar for the subsequent commands to be
@ -522,7 +534,7 @@ recognised by the parser.
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Extracting Verb Numbers. </b>A long tale of woe lies behind the following. Infocom games stored verb numbers
in a single byte in dictionary entries, but they did so counting downwards, so
that verb number 0 was stored as 255, 1 as 254, and so on. Inform followed
suit so that debugging of Inform 1 could be aided by using the then-available
@ -546,7 +558,7 @@ routine was added to concentrate lookups of this field in one place.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">verbnum</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. Action functions. </b>This looks up the address of a function like <span class="extract"><span class="extract-syntax">TakeSub</span></span> from the table of
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Action functions. </b>This looks up the address of a function like <span class="extract"><span class="extract-syntax">TakeSub</span></span> from the table of
"action subroutines".
</p>
@ -559,7 +571,7 @@ compared to the Z-machine's: hence the <span class="extract"><span class="extrac
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> #</span><span class="identifier-syntax">actions_table</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">act</span><span class="plain-syntax">+1);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. Glulx-Only Printing Routines. </b>Partly because of the smallness of the range of representable values in
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Glulx-Only Printing Routines. </b>Partly because of the smallness of the range of representable values in
the Z-machine, there is little run-time type-checking that can be done:
for instance a dictionary address cannot be distinguished from a function
address because they are encoded differently, so that a function address
@ -712,7 +724,7 @@ set stored here is once again ZSCII, not Unicode.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">AnyToStrArr</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. The Screen. </b>Our generic screen model is that the screen is made up of windows: we tend
to refer only to two of these, the main window and the status line, but
others may also exist from time to time. Windows have unique ID numbers:
the special window ID \(-1\) means "all windows" or "the entire screen",
@ -749,7 +761,7 @@ make little sense there.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gg_arguments</span><span class="plain-syntax">--&gt;0;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. Window Colours. </b>Our generic screen model is that the screen is made up of windows, each of
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Window Colours. </b>Our generic screen model is that the screen is made up of windows, each of
which can have its own foreground and background colours.
</p>
@ -817,7 +829,7 @@ which is greatly superior in this respect).
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">$ff0000</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&amp;1) + </span><span class="constant-syntax">$ff00</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&amp;2 ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) + </span><span class="constant-syntax">$ff</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&amp;4 ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. Main Window. </b>The part of the screen on which commands and responses are printed, which
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Main Window. </b>The part of the screen on which commands and responses are printed, which
ordinarily occupies almost all of the screen area.
</p>
@ -831,7 +843,7 @@ status line, to the main window.
<span class="plain-syntax"> </span><span class="identifier-syntax">statuswin_current</span><span class="plain-syntax">=0;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Status Line. </b>Despite the name, the status line need not be a single line at the top of
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Status Line. </b>Despite the name, the status line need not be a single line at the top of
the screen: that's only the conventional default arrangement. It can expand
to become the equivalent of an old-fashioned VT220 terminal, with menus
and grids and mazes displayed lovingly in character graphics, or it can
@ -867,7 +879,7 @@ line; line 2 is underneath, and so on; columns are similarly numbered from
<span class="plain-syntax"> </span><span class="identifier-syntax">statuswin_current</span><span class="plain-syntax">=1;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Quotation Boxes. </b>On the Z-machine, quotation boxes are produced by stretching the status line,
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. Quotation Boxes. </b>On the Z-machine, quotation boxes are produced by stretching the status line,
but on Glulx they usually occupy windows of their own. If it isn't possible
to create such a window, so that <span class="extract"><span class="extract-syntax">gg_quotewin</span></span> is zero below, the quotation
text just appears in the main window.

View file

@ -226,8 +226,7 @@ be read or written by the parser.
<span class="plain-syntax"> </span><span class="comment-syntax">pragmatically useful results</span>
<span class="plain-syntax"> </span><span class="comment-syntax">(Not a flag: possible values 0, 1, 2)</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">dict_flags_of_noun</span><span class="plain-syntax">; </span><span class="comment-syntax">Of the noun currently being parsed</span>
<span class="plain-syntax"> </span><span class="comment-syntax">(a bitmap in #dict_par1 format)</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">current_noun_is_plural</span><span class="plain-syntax">; </span><span class="comment-syntax">True or false</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">pronoun__word</span><span class="plain-syntax">; </span><span class="comment-syntax">Saved value</span>
<span class="identifier-syntax">Global</span><span class="plain-syntax"> </span><span class="identifier-syntax">pronoun__obj</span><span class="plain-syntax">; </span><span class="comment-syntax">Saved value</span>
@ -932,7 +931,7 @@ fairly thorough description of its output, which is written into the
<span class="plain-syntax"> </span><span class="comment-syntax">If the first word is not listed as a verb, it must be a direction</span>
<span class="plain-syntax"> </span><span class="comment-syntax">or the name of someone to talk to</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> || ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">1</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">verb_word</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> || ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">So is the first word an object contained in the special object "compass"</span>
<span class="plain-syntax"> </span><span class="comment-syntax">(i.e., a direction)? This needs use of NounDomain, a routine which</span>
<span class="plain-syntax"> </span><span class="comment-syntax">does the object matching, returning the object number, or 0 if none found,</span>
@ -991,7 +990,7 @@ fairly thorough description of its output, which is written into the
<span class="plain-syntax"> </span><span class="identifier-syntax">scope_reason</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PARSING_REASON</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> == </span><span class="identifier-syntax">REPARSE_CODE</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">ReParse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> == </span><span class="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">verb_word</span><span class="plain-syntax"> &amp;&amp; ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">NotConversation</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">verb_word</span><span class="plain-syntax"> &amp;&amp; ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">NotConversation</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">best_etype</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MISSINGPERSON_PE</span><span class="plain-syntax">; </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">GiveError</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -1009,7 +1008,7 @@ fairly thorough description of its output, which is written into the
<span class="plain-syntax"> </span><span class="comment-syntax">name and the comma (eg, throw out "dwarf sdfgsdgs, go north").</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">j</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">verb_word</span><span class="plain-syntax"> &amp;&amp; ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">NotConversation</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">verb_word</span><span class="plain-syntax"> &amp;&amp; ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">NotConversation</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">best_etype</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TOTALK_PE</span><span class="plain-syntax">; </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">GiveError</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -1045,7 +1044,7 @@ fairly thorough description of its output, which is written into the
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> .</span><span class="identifier-syntax">NotConversation</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">verb_word</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> || ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">1</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">verb_word</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> || ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">verb_word</span><span class="plain-syntax"> = </span><span class="identifier-syntax">UnknownVerb</span><span class="plain-syntax">(</span><span class="identifier-syntax">verb_word</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">verb_word</span><span class="plain-syntax"> ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">VerbAccepted</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">best_etype</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VERB_PE</span><span class="plain-syntax">;</span>
@ -1056,7 +1055,7 @@ fairly thorough description of its output, which is written into the
<span class="plain-syntax"> </span><span class="comment-syntax">We now definitely have a verb, not a direction, whether we got here by the</span>
<span class="plain-syntax"> </span><span class="comment-syntax">"take ..." or "person, take ..." method. Get the meta flag for this verb:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">2</span><span class="plain-syntax">)/2;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_META</span><span class="plain-syntax">)/2;</span>
<span class="plain-syntax"> </span><span class="comment-syntax">You can't order other people to "full score" for you, and so on...</span>
@ -1178,7 +1177,7 @@ and similarly for <span class="extract"><span class="extract-syntax">multiinside
<span class="plain-syntax"> </span><span class="reserved-syntax">do</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWord</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">until</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">num_words</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">8</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">l</span><span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_PREP</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">wn</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">num_words</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DEBUG</span><span class="plain-syntax">;</span>
@ -1204,9 +1203,9 @@ and similarly for <span class="extract"><span class="extract-syntax">multiinside
<span class="plain-syntax"> </span><span class="reserved-syntax">do</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWord</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">until</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">num_words</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">8</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">l</span><span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_PREP</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">l</span><span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">8</span><span class="plain-syntax">) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_PREP</span><span class="plain-syntax">) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax">lookahead failed</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DEBUG</span><span class="plain-syntax">;</span>
@ -2557,8 +2556,7 @@ because we want to allow duplicates).
<span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax"> = </span><span class="identifier-syntax">wn</span><span class="plain-syntax">; </span><span class="identifier-syntax">first_word</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LanguageIsVerb</span><span class="plain-syntax">(</span><span class="identifier-syntax">buffer2</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse2</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">); </span><span class="identifier-syntax">wn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">j</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first_word</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">j</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((0 ~= </span><span class="identifier-syntax">j</span><span class="plain-syntax">&amp;1) &amp;&amp; ~~</span><span class="identifier-syntax">LanguageVerbMayBeName</span><span class="plain-syntax">(</span><span class="identifier-syntax">first_word</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">first_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) &amp;&amp; ~~</span><span class="identifier-syntax">LanguageVerbMayBeName</span><span class="plain-syntax">(</span><span class="identifier-syntax">first_word</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM_CopyBuffer</span><span class="plain-syntax">(</span><span class="identifier-syntax">buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">buffer2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">RECONSTRUCT_INPUT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -2642,8 +2640,7 @@ because we want to allow duplicates).
<span class="plain-syntax"> </span><span class="comment-syntax">parser to get on with and forget about the question...</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">first_word</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">j</span><span class="plain-syntax"> = </span><span class="identifier-syntax">first_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((0 ~= </span><span class="identifier-syntax">j</span><span class="plain-syntax">&amp;1) &amp;&amp; ~~</span><span class="identifier-syntax">LanguageVerbMayBeName</span><span class="plain-syntax">(</span><span class="identifier-syntax">first_word</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">first_word</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) &amp;&amp; ~~</span><span class="identifier-syntax">LanguageVerbMayBeName</span><span class="plain-syntax">(</span><span class="identifier-syntax">first_word</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VM_CopyBuffer</span><span class="plain-syntax">(</span><span class="identifier-syntax">buffer</span><span class="plain-syntax">, </span><span class="identifier-syntax">buffer2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">RECONSTRUCT_INPUT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -3811,15 +3808,14 @@ if it was a match because of inadequate input).
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nomatch</span><span class="plain-syntax"> &amp;&amp; </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dict_flags_of_noun</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">current_noun_is_plural</span><span class="plain-syntax"> = </span><span class="reserved-syntax">false</span><span class="plain-syntax">;</span>
<span class="comment-syntax"> If input has run out then always match, with only quality 0 (this saves</span>
<span class="comment-syntax"> time).</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">num_words</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nomatch</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</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">indef_mode</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">dict_flags_of_noun</span><span class="plain-syntax"> = </span><span class="constant-syntax">$$01110000</span><span class="plain-syntax">; </span><span class="comment-syntax">Reject "plural" bit</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">indef_mode</span><span class="plain-syntax"> ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">current_noun_is_plural</span><span class="plain-syntax"> = </span><span class="reserved-syntax">false</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MakeMatch</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">,0);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DEBUG</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">parser_trace</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">5</span><span class="plain-syntax">) </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">" Matched (0)^"</span><span class="plain-syntax">;</span>
@ -3838,10 +3834,9 @@ if it was a match because of inadequate input).
<span class="plain-syntax"> .</span><span class="identifier-syntax">MMbyPN</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">parser_action</span><span class="plain-syntax"> == ##</span><span class="identifier-syntax">PluralFound</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dict_flags_of_noun</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dict_flags_of_noun</span><span class="plain-syntax"> | </span><span class="constant-syntax">4</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">parser_action</span><span class="plain-syntax"> == ##</span><span class="identifier-syntax">PluralFound</span><span class="plain-syntax">) </span><span class="identifier-syntax">current_noun_is_plural</span><span class="plain-syntax"> = </span><span class="reserved-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">dict_flags_of_noun</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">4</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">current_noun_is_plural</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">allow_plurals</span><span class="plain-syntax">) </span><span class="identifier-syntax">k</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">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">indef_mode</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
@ -3879,12 +3874,12 @@ if it was a match because of inadequate input).
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">threshold</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">dict_flags_of_noun</span><span class="plain-syntax"> = </span><span class="identifier-syntax">RelevantNounBits</span><span class="plain-syntax">(</span><span class="identifier-syntax">w</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_noun_is_plural</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TreatNounAsPlural</span><span class="plain-syntax">(</span><span class="identifier-syntax">w</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">w</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWord</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">Refers</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">wn</span><span class="plain-syntax">-1)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">threshold</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">w</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dict_flags_of_noun</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dict_flags_of_noun</span><span class="plain-syntax"> | (</span><span class="identifier-syntax">RelevantNounBits</span><span class="plain-syntax">(</span><span class="identifier-syntax">w</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_noun_is_plural</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_noun_is_plural</span><span class="plain-syntax"> | (</span><span class="identifier-syntax">TreatNounAsPlural</span><span class="plain-syntax">(</span><span class="identifier-syntax">w</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">w</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWord</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
@ -3892,11 +3887,14 @@ if it was a match because of inadequate input).
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">MMbyPN</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">RelevantNounBits</span><span class="plain-syntax"> </span><span class="identifier-syntax">w</span><span class="plain-syntax"> </span><span class="identifier-syntax">b</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">w</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</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">w</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</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">b</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$$10000</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$$01110000</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">b</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">$$01110100</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">TreatNounAsPlural</span><span class="plain-syntax"> </span><span class="identifier-syntax">w</span><span class="plain-syntax"> </span><span class="identifier-syntax">b</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">w</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">w</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">;</span>
<span class="comment-syntax"> if (b &amp; DICTPAR1_SING) rfalse;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">b</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">DICTPAR1_TRUNC</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</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">b</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">DICTPAR1_PLURAL</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
<p class="commentary firstcommentary"><a id="SP56" class="paragraph-anchor"></a><b>&#167;56. Refers. </b><span class="extract"><span class="extract-syntax">Refers</span></span> works out whether the word at number wnum can refer to the object
@ -3953,7 +3951,7 @@ if it is a pronoun,
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">j</span><span class="plain-syntax">=1 : </span><span class="identifier-syntax">j</span><span class="plain-syntax">&lt;=</span><span class="identifier-syntax">s</span><span class="plain-syntax"> : </span><span class="identifier-syntax">j</span><span class="plain-syntax">=</span><span class="identifier-syntax">j</span><span class="plain-syntax">+3)</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="identifier-syntax">LanguagePronouns</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">j</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">j</span><span class="plain-syntax">+2;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">i</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">)&amp;128 == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</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="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_NOUN</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</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">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
</pre>
@ -4053,7 +4051,7 @@ Manual}, 4th edition.
<span class="plain-syntax"> </span><span class="reserved-syntax">for</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">n</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">w</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWordStopped</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">w</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">THEN1__WD</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">COMMA_WORD</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> -1) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">RelevantNounBits</span><span class="plain-syntax">(</span><span class="identifier-syntax">w</span><span class="plain-syntax">)) &amp; </span><span class="constant-syntax">$$00000100</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">TreatNounAsPlural</span><span class="plain-syntax">(</span><span class="identifier-syntax">w</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parser_action</span><span class="plain-syntax"> = ##</span><span class="identifier-syntax">PluralFound</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">outcome</span><span class="plain-syntax"> = </span><span class="reserved-syntax">true</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -4243,7 +4241,7 @@ is defined in the Standard Rules, not here.
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">wn</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">num_words</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWordStopped</span><span class="plain-syntax">(); </span><span class="identifier-syntax">wn</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> == </span><span class="identifier-syntax">THEN1__WD</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ( (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> ~= -1 </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp;8 ) { </span><span class="identifier-syntax">wn</span><span class="plain-syntax">++; </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; } </span><span class="comment-syntax">if preposition</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">l</span><span class="plain-syntax"> ~= -1 </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">l</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_PREP</span><span class="plain-syntax">) { </span><span class="identifier-syntax">wn</span><span class="plain-syntax">++; </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; } </span><span class="comment-syntax">if preposition</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</span><span class="plain-syntax"> == </span><span class="identifier-syntax">ALL1__WD</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">ALL2__WD</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">ALL3__WD</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">ALL4__WD</span><span class="plain-syntax"> </span><span class="reserved-syntax">or</span><span class="plain-syntax"> </span><span class="identifier-syntax">ALL5__WD</span><span class="plain-syntax">) { </span><span class="identifier-syntax">wn</span><span class="plain-syntax">++; </span><span class="reserved-syntax">continue</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SafeSkipDescriptors</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="comment-syntax">save the current match state</span>

View file

@ -374,9 +374,9 @@ out the I6 command verb grammar for the supplied command.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">ShowVerbSub</span><span class="plain-syntax"> </span><span class="identifier-syntax">address</span><span class="plain-syntax"> </span><span class="identifier-syntax">lines</span><span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> </span><span class="identifier-syntax">x</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">; </span><span class="identifier-syntax">x</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NextWordStopped</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">x</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> || ((</span><span class="identifier-syntax">x</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">1</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">x</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax"> || ((</span><span class="identifier-syntax">x</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Try typing ~showverb~ and then the name of a verb."</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">x</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">2</span><span class="plain-syntax">)/2;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">meta</span><span class="plain-syntax"> = ((</span><span class="identifier-syntax">x</span><span class="plain-syntax">-&gt;#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">DICTPAR1_META</span><span class="plain-syntax">)/2;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DictionaryWordToVerbNum</span><span class="plain-syntax">(</span><span class="identifier-syntax">x</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">address</span><span class="plain-syntax"> = </span><span class="identifier-syntax">VM_CommandTableAddress</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">lines</span><span class="plain-syntax"> = </span><span class="identifier-syntax">address</span><span class="plain-syntax">-&gt;0;</span>

View file

@ -218,6 +218,7 @@ we will need for the code we are compiling. But this seems a good time to make i
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"!%% $ZCODE_LESS_DICT_DATA=1;\n"</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">"!%% $LONG_DICT_FLAG_BUG=0;\n"</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">"!%% $DICT_IMPLICIT_SINGULAR=1;\n"</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">"!%% $DICT_TRUNCATE_FLAG=1;\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">omit_ur</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"!%% $OMIT_UNUSED_ROUTINES=1;\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
</pre>

View file

@ -31,9 +31,15 @@ These are the changes delivered in version 6.42 of the Inform compiler.
<h3>Features added</h3>
<ul>
<li><p>A new dictionary flag has been introduced, "singular", which is set for any non that is not a plural.
<li><p>A new dictionary word flag has been introduced, "singular", which is set for any noun that is not a plural.
This can be explicitly set or not set in a dictionary word with the <tt>'//s'</tt> syntax, i.e. <tt>'word//s'</tt> to set it,
or <tt>'word//~s'</tt> to not set it.
<li><p>A new setting <tt>$DICT_TRUNCATE_FLAG</tt> has been added. If this is set to 1, then bit 6 of the dictionary
word flag is set for any word whose source code definition is truncated to fit in the dictionary. In <tt>--trace dict</tt>
listings, this is shown as "tr" when the flag is set.
Without this option, bit 6 of the dictionary word flag is set for all verbs (which is the old behavior, redundant with bit 1).
If the compiler truncates only the <tt>//p</tt> flag (as in <tt>$LONG_DICT_FLAG_BUG</tt>), that does not count as truncating
the dictionary word: the only relevant test is whether or not characters were dropped.
</ul>
<h3>Bugs fixed</h3>

View file

@ -1295,8 +1295,9 @@ typedef struct operator_s
/* (DICT_IMPLICIT_SINGULAR sets this for all
non-plural nouns) */
#define BIT5_DFLAG 32 /* not used */
#define BIT6_DFLAG 64 /* set for verbs, for historical reasons only --
not used */
#define TRUNC_DFLAG 64 /* if DICT_TRUNCATE_FLAG, indicates truncated
dict words; otherwise, set for verbs, for
historical reasons only */
#define NOUN_DFLAG 128 /* used as a noun (set by '//n') */
/* (set for every word that appears outside
of verb grammar) */
@ -2607,6 +2608,7 @@ extern int WARN_UNUSED_ROUTINES, OMIT_UNUSED_ROUTINES;
extern int STRIP_UNREACHABLE_LABELS;
extern int OMIT_SYMBOL_TABLE;
extern int DICT_IMPLICIT_SINGULAR;
extern int DICT_TRUNCATE_FLAG;
extern int LONG_DICT_FLAG_BUG;
extern int TRANSCRIPT_FORMAT;

View file

@ -271,6 +271,7 @@ int OMIT_UNUSED_ROUTINES; /* 0: no, 1: yes */
int STRIP_UNREACHABLE_LABELS; /* 0: no, 1: yes (default) */
int OMIT_SYMBOL_TABLE; /* 0: no, 1: yes */
int DICT_IMPLICIT_SINGULAR; /* 0: no, 1: yes */
int DICT_TRUNCATE_FLAG; /* 0: no, 1: yes */
int LONG_DICT_FLAG_BUG; /* 0: no bug, 1: bug (default for historic reasons) */
int TRANSCRIPT_FORMAT; /* 0: classic, 1: prefixed */
@ -321,6 +322,7 @@ static void list_memory_sizes(void)
printf("| %25s = %-7d |\n","STRIP_UNREACHABLE_LABELS",STRIP_UNREACHABLE_LABELS);
printf("| %25s = %-7d |\n","OMIT_SYMBOL_TABLE",OMIT_SYMBOL_TABLE);
printf("| %25s = %-7d |\n","DICT_IMPLICIT_SINGULAR",DICT_IMPLICIT_SINGULAR);
printf("| %25s = %-7d |\n","DICT_TRUNCATE_FLAG",DICT_TRUNCATE_FLAG);
printf("| %25s = %-7d |\n","LONG_DICT_FLAG_BUG",LONG_DICT_FLAG_BUG);
printf("+--------------------------------------+\n");
}
@ -356,6 +358,7 @@ extern void set_memory_sizes(void)
STRIP_UNREACHABLE_LABELS = 1;
OMIT_SYMBOL_TABLE = 0;
DICT_IMPLICIT_SINGULAR = 0;
DICT_TRUNCATE_FLAG = 0;
LONG_DICT_FLAG_BUG = 1;
TRANSCRIPT_FORMAT = 0;
@ -518,8 +521,15 @@ static void explain_parameter(char *command)
{
printf(
" DICT_IMPLICIT_SINGULAR, if set to 1, will cause dict words in noun \n\
context to have the '//s' flag if the '//p' flag is not set. \n\
retained.\n");
context to have the '//s' flag if the '//p' flag is not set. \n");
return;
}
if (strcmp(command,"DICT_TRUNCATE_FLAG")==0)
{
printf(
" DICT_TRUNCATE_FLAG, if set to 1, will set bit 6 of a dict word if the \n\
word is truncated (extends beyond DICT_WORD_SIZE). If 0, bit 6 will be \n\
set for verbs (legacy behavior). \n");
return;
}
if (strcmp(command,"LONG_DICT_FLAG_BUG")==0)
@ -765,7 +775,7 @@ static void set_trace_option(char *command)
really about memory allocation.
*/
extern void memory_command(char *command)
{ int i, k, flag=0; int32 j;
{ int i, k;
for (k=0; command[k]!=0; k++)
if (islower(command[k])) command[k]=toupper(command[k]);
@ -786,7 +796,10 @@ extern void memory_command(char *command)
for (i=0; command[i]!=0; i++)
{ if (command[i]=='=')
{ command[i]=0;
{
int flag = 0;
int32 j = 0;
command[i]=0;
if (!parse_memory_setting(command+i+1, command, &j)) {
return;
}
@ -950,6 +963,12 @@ extern void memory_command(char *command)
if (DICT_IMPLICIT_SINGULAR > 1 || DICT_IMPLICIT_SINGULAR < 0)
DICT_IMPLICIT_SINGULAR = 1;
}
if (strcmp(command,"DICT_TRUNCATE_FLAG")==0)
{
DICT_TRUNCATE_FLAG=j, flag=1;
if (DICT_TRUNCATE_FLAG > 1 || DICT_TRUNCATE_FLAG < 0)
DICT_TRUNCATE_FLAG = 1;
}
if (strcmp(command,"LONG_DICT_FLAG_BUG")==0)
{
LONG_DICT_FLAG_BUG=j, flag=1;

View file

@ -1923,6 +1923,14 @@ static void dictionary_prepare_z(char *dword, uchar *optresult)
int dictsize = (version_number==3) ? 6 : 9;
/* Flag to set if a dict word is truncated. We only do this if
DICT_TRUNCATE_FLAG, however. */
int truncflag = (DICT_TRUNCATE_FLAG ? TRUNC_DFLAG : NONE_DFLAG);
/* Will be set to suppress dict flags if we're past the size limit.
But only if LONG_DICT_FLAG_BUG. */
int truncbug = FALSE;
prepared_dictflags_pos = 0;
prepared_dictflags_neg = 0;
@ -1934,6 +1942,7 @@ static void dictionary_prepare_z(char *dword, uchar *optresult)
negflag = FALSE;
for (j+=2; dword[j] != 0; j++)
{
if (truncbug) continue; /* do not set flags */
switch(dword[j])
{
case '~':
@ -1973,7 +1982,7 @@ static void dictionary_prepare_z(char *dword, uchar *optresult)
/* LONG_DICT_FLAG_BUG emulates the old behavior where we stop looping
at dictsize. */
if (LONG_DICT_FLAG_BUG && i>=dictsize)
break;
truncbug = TRUE;
k=(int) dword[j];
if (k==(int) '\'')
@ -2003,7 +2012,8 @@ apostrophe in", dword);
{ if ((k2 == -5) || (k2 <= -0x100))
char_error("Character can be printed but not input:", k);
else
{ /* Use 4 more Z-chars to encode a ZSCII escape sequence */
{ /* Use 4 more Z-chars to encode a ZSCII escape sequence.
If the last character can't be written, set TRUNC flag. */
if (i<dictsize)
wd[i++] = 5;
if (i<dictsize)
@ -2013,6 +2023,8 @@ apostrophe in", dword);
wd[i++] = k2/32;
if (i<dictsize)
wd[i++] = k2%32;
else
prepared_dictflags_pos |= truncflag;
}
}
else
@ -2021,6 +2033,8 @@ apostrophe in", dword);
wd[i++]=3+(k2/26); /* Change alphabet for symbols */
if (i<dictsize)
wd[i++]=6+(k2%26); /* Write the Z character */
else
prepared_dictflags_pos |= truncflag;
}
}
@ -2063,6 +2077,14 @@ static void dictionary_prepare_g(char *dword, uchar *optresult)
int32 unicode;
int negflag;
/* Flag to set if a dict word is truncated. We only do this if
DICT_TRUNCATE_FLAG, however. */
int truncflag = (DICT_TRUNCATE_FLAG ? TRUNC_DFLAG : NONE_DFLAG);
/* Will be set to suppress dict flags if we're past the size limit.
But only if LONG_DICT_FLAG_BUG. */
int truncbug = FALSE;
prepared_dictflags_pos = 0;
prepared_dictflags_neg = 0;
@ -2071,6 +2093,7 @@ static void dictionary_prepare_g(char *dword, uchar *optresult)
/* The rest of the word is dict flags. Run through them. */
negflag = FALSE;
for (j+=2; dword[j] != 0; j++) {
if (truncbug) continue; /* do not set flags */
switch(dword[j]) {
case '~':
if (!dword[j+1])
@ -2109,7 +2132,7 @@ static void dictionary_prepare_g(char *dword, uchar *optresult)
/* LONG_DICT_FLAG_BUG emulates the old behavior where we stop looping
at DICT_WORD_SIZE. */
if (LONG_DICT_FLAG_BUG && i>=DICT_WORD_SIZE)
break;
truncbug = TRUE;
k= ((unsigned char *)dword)[j];
if (k=='\'')
@ -2145,6 +2168,8 @@ Define DICT_CHAR_SIZE=4 for a Unicode-compatible dictionary.");
if (DICT_CHAR_SIZE == 1) {
if (i<DICT_WORD_SIZE)
prepared_sort[i++] = k;
else
prepared_dictflags_pos |= truncflag;
}
else {
if (i<DICT_WORD_SIZE) {
@ -2154,6 +2179,9 @@ Define DICT_CHAR_SIZE=4 for a Unicode-compatible dictionary.");
prepared_sort[4*i+3] = (k) & 0xFF;
i++;
}
else {
prepared_dictflags_pos |= truncflag;
}
}
}
@ -2686,15 +2714,21 @@ static void recursively_show_z(int node, int level)
printf("s ");
else
printf(" ");
if (DICT_TRUNCATE_FLAG) {
if (flags & TRUNC_DFLAG)
printf("tr ");
else
printf(" ");
}
if (flags & PREP_DFLAG)
{ if (grammar_version_number == 1)
printf("preposition:%d ", (int) p[res+2]);
else
printf("preposition ");
}
if ((flags & METAVERB_DFLAG) == METAVERB_DFLAG)
printf("metaverb:%d ", (int) p[res+1]);
else if ((flags & METAVERB_DFLAG) == VERB_DFLAG)
if (flags & META_DFLAG)
printf("meta");
if (flags & VERB_DFLAG)
printf("verb:%d ", (int) p[res+1]);
printf("\n");
}
@ -2753,11 +2787,17 @@ static void recursively_show_g(int node, int level)
printf("s ");
else
printf(" ");
if (DICT_TRUNCATE_FLAG) {
if (flags & TRUNC_DFLAG)
printf("tr ");
else
printf(" ");
}
if (flags & PREP_DFLAG)
printf("preposition ");
if ((flags & METAVERB_DFLAG) == METAVERB_DFLAG)
printf("metaverb:%d ", verbnum);
else if ((flags & METAVERB_DFLAG) == VERB_DFLAG)
if (flags & META_DFLAG)
printf("meta");
if (flags & VERB_DFLAG)
printf("verb:%d ", verbnum);
printf("\n");
}

View file

@ -1030,8 +1030,11 @@ extern void make_verb(void)
for (i=0, pos=0; i<no_given; i++) {
char *wd = English_verbs_given+pos;
int flags = VERB_DFLAG
+ (DICT_TRUNCATE_FLAG ? NONE_DFLAG : TRUNC_DFLAG)
+ (meta_verb_flag ? META_DFLAG : NONE_DFLAG);
dictionary_add(wd,
VERB_DFLAG + BIT6_DFLAG + ((meta_verb_flag)?META_DFLAG:NONE_DFLAG),
flags,
(glulx_mode)?(0xffff-Inform_verb):(0xff-Inform_verb), 0);
register_verb(wd, Inform_verb);
pos += (strlen(wd) + 1);

View file

@ -1,11 +1,11 @@
Total memory consumption was 139593K = 136 MB
Total memory consumption was 139616K = 136 MB
---- was used for 2127510 objects, in 374866 frames in 0 x 800K = 0K = 0 MB:
---- was used for 2128651 objects, in 374885 frames in 0 x 800K = 0K = 0 MB:
30.2% inter_tree_node_array 60 x 8192 = 491520 objects, 43255680 bytes
19.4% text_stream_array 4927 x 100 = 492700 objects, 27748864 bytes
19.4% text_stream_array 4928 x 100 = 492800 objects, 27754496 bytes
17.7% linked_list 45410 objects, 25429600 bytes
9.9% inter_symbol_array 134 x 1024 = 137216 objects, 14274752 bytes
10.0% inter_symbol_array 135 x 1024 = 138240 objects, 14381280 bytes
9.7% inter_error_stash_array 106 x 1024 = 108544 objects, 13897024 bytes
7.4% parse_node 133803 objects, 10704240 bytes
5.3% verb_conjugation 164 objects, 7610912 bytes
@ -19,10 +19,10 @@ Total memory consumption was 139593K = 136 MB
1.3% package_request 21353 objects, 1879064 bytes
1.2% vocabulary_entry_array 164 x 100 = 16400 objects, 1842048 bytes
1.1% dict_entry_array 501 x 100 = 50100 objects, 1619232 bytes
1.0% inter_symbols_table 26889 objects, 1505784 bytes
1.0% inter_symbols_table 26897 objects, 1506232 bytes
1.0% match_trie_array 11 x 1000 = 11000 objects, 1496352 bytes
1.0% i6_schema_array 24 x 100 = 2400 objects, 1440768 bytes
0.9% inter_package 26889 objects, 1290672 bytes
0.9% inter_package 26897 objects, 1291056 bytes
0.7% map_data 677 objects, 1137360 bytes
0.7% id_body 980 objects, 1121120 bytes
0.7% adjective_meaning 208 objects, 1030016 bytes
@ -36,7 +36,7 @@ Total memory consumption was 139593K = 136 MB
0.3% local_variable_array 49 x 100 = 4900 objects, 471968 bytes
0.2% verb_usage 1148 objects, 394912 bytes
0.2% rule 478 objects, 374752 bytes
0.2% dictionary 7767 objects, 372816 bytes
0.2% dictionary 7768 objects, 372864 bytes
0.2% verb_form 388 objects, 350752 bytes
0.2% noun 2395 objects, 287400 bytes
0.1% compilation_subtask 3388 objects, 271040 bytes
@ -262,17 +262,17 @@ Total memory consumption was 139593K = 136 MB
---- loop_over_scope 1 object, 40 bytes
---- kind_template_definition 1 object, 40 bytes
99.9% was used for memory not allocated for objects:
100.0% was used for memory not allocated for objects:
62.3% text stream storage 89194148 bytes in 512749 claims
3.8% dictionary storage 5497920 bytes in 7767 claims
62.4% text stream storage 89216108 bytes in 512895 claims
3.8% dictionary storage 5498432 bytes in 7768 claims
---- sorting 2624 bytes in 531 claims
5.0% source text 7200000 bytes in 3 claims
7.5% source text details 10800000 bytes in 2 claims
0.1% documentation fragments 262144 bytes in 1 claim
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
3.1% inter symbols storage 4572672 bytes in 28263 claims
3.1% inter symbols storage 4573696 bytes in 28271 claims
11.7% inter bytecode storage 16757556 bytes in 15 claims
4.3% inter links storage 6222976 bytes in 11 claims
0.1% inter tree location list storage 191232 bytes in 32 claims
@ -282,5 +282,5 @@ Total memory consumption was 139593K = 136 MB
---- code generation workspace for objects 3528 bytes in 19 claims
0.1% emitter array storage 281184 bytes in 2006 claims
-136.-6% was overhead - -195289208 bytes = -190712K = -186 MB
-136.-6% was overhead - -195402248 bytes = -190822K = -186 MB

View file

@ -1,28 +1,28 @@
100.0% in inform7 run
67.5% in compilation to Inter
46.1% in //Sequence::undertake_queued_tasks//
4.1% in //MajorNodes::pre_pass//
3.8% in //MajorNodes::pass_1//
67.7% in compilation to Inter
45.9% in //Sequence::undertake_queued_tasks//
4.2% in //MajorNodes::pre_pass//
3.5% in //MajorNodes::pass_1//
1.9% in //ImperativeDefinitions::assess_all//
1.5% in //RTKindConstructors::compile//
1.5% in //RTPhrasebook::compile_entries//
1.1% in //Sequence::lint_inter//
0.7% in //Sequence::undertake_queued_tasks//
0.3% in //CompletionModule::compile//
0.3% in //ImperativeDefinitions::compile_first_block//
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//
4.6% not specifically accounted for
27.4% in running Inter pipeline
9.1% in step 14/15: generate inform6 -> auto.inf
6.8% in step 5/15: load-binary-kits
6.1% in step 6/15: make-synoptic-module
5.5% not specifically accounted for
27.6% in running Inter pipeline
8.9% in step 14/15: generate inform6 -> auto.inf
7.0% in step 5/15: load-binary-kits
5.8% 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
1.9% not specifically accounted for
4.1% in supervisor
2.4% not specifically accounted for
3.8% in supervisor
0.8% not specifically accounted for

View file

@ -27,12 +27,24 @@ only if scripting is on.
rtrue;
];
@h Variables and Arrays.
@h Dictionary Parameters.
=
Constant #dict_par1 = 6;
Constant #dict_par2 = 7;
Constant DICTPAR1_VERB = 1;
Constant DICTPAR1_META = 2;
Constant DICTPAR1_PLURAL = 4;
Constant DICTPAR1_PREP = 8;
Constant DICTPAR1_SING = 16;
Constant DICTPAR1_BIT6 = 32;
Constant DICTPAR1_TRUNC = 64;
Constant DICTPAR1_NOUN = 128;
@h Variables and Arrays.
=
Global xcommsdir; ! true if command recording is on
Constant INPUT_BUFFER_LEN = 120; ! Length of buffer array

View file

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

View file

@ -61,13 +61,25 @@ Global gg_scriptstr = 0;
rtrue;
];
@h Variables and Arrays.
@h Dictionary Parameters.
=
Constant DICT_ENTRY_BYTES = 12+DICT_WORD_SIZE*WORDSIZE;
Constant #dict_par1 = DICT_WORD_SIZE*WORDSIZE+4+1;
Constant #dict_par2 = DICT_WORD_SIZE*WORDSIZE+4+3;
Constant DICTPAR1_VERB = 1;
Constant DICTPAR1_META = 2;
Constant DICTPAR1_PLURAL = 4;
Constant DICTPAR1_PREP = 8;
Constant DICTPAR1_SING = 16;
Constant DICTPAR1_BIT6 = 32;
Constant DICTPAR1_TRUNC = 64;
Constant DICTPAR1_NOUN = 128;
@h Variables and Arrays.
=
Array gg_event --> 4;
Array gg_arguments buffer 28;
Global gg_mainwin = 0;

View file

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

View file

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

View file

@ -159,8 +159,7 @@ Global take_all_rule; ! Slightly different rules apply to "take al
! pragmatically useful results
! (Not a flag: possible values 0, 1, 2)
Global dict_flags_of_noun; ! Of the noun currently being parsed
! (a bitmap in #dict_par1 format)
Global current_noun_is_plural; ! True or false
Global pronoun__word; ! Saved value
Global pronoun__obj; ! Saved value
@ -854,7 +853,7 @@ Is the command a direction name, and so an implicit GO? If so, go to (K).
! If the first word is not listed as a verb, it must be a direction
! or the name of someone to talk to
if (verb_word == 0 || ((verb_word->#dict_par1) & 1) == 0) {
if (verb_word == 0 || ((verb_word->#dict_par1) & DICTPAR1_VERB) == 0) {
! So is the first word an object contained in the special object "compass"
! (i.e., a direction)? This needs use of NounDomain, a routine which
! does the object matching, returning the object number, or 0 if none found,
@ -913,7 +912,7 @@ Is anyone being addressed?
scope_reason = PARSING_REASON;
if (l == REPARSE_CODE) jump ReParse;
if (l == 0) {
if (verb_word && ((verb_word->#dict_par1) & 1)) jump NotConversation;
if (verb_word && ((verb_word->#dict_par1) & DICTPAR1_VERB)) jump NotConversation;
best_etype = MISSINGPERSON_PE; jump GiveError;
}
@ -931,7 +930,7 @@ Is anyone being addressed?
! name and the comma (eg, throw out "dwarf sdfgsdgs, go north").
if (wn ~= j) {
if (verb_word && ((verb_word->#dict_par1) & 1)) jump NotConversation;
if (verb_word && ((verb_word->#dict_par1) & DICTPAR1_VERB)) jump NotConversation;
best_etype = TOTALK_PE; jump GiveError;
}
@ -967,7 +966,7 @@ Get the verb: try all the syntax lines for that verb.
=
.NotConversation;
if (verb_word == 0 || ((verb_word->#dict_par1) & 1) == 0) {
if (verb_word == 0 || ((verb_word->#dict_par1) & DICTPAR1_VERB) == 0) {
verb_word = UnknownVerb(verb_word);
if (verb_word ~= 0) jump VerbAccepted;
best_etype = VERB_PE;
@ -978,7 +977,7 @@ Get the verb: try all the syntax lines for that verb.
! We now definitely have a verb, not a direction, whether we got here by the
! "take ..." or "person, take ..." method. Get the meta flag for this verb:
meta = ((verb_word->#dict_par1) & 2)/2;
meta = ((verb_word->#dict_par1) & DICTPAR1_META)/2;
! You can't order other people to "full score" for you, and so on...
@ -1101,7 +1100,7 @@ and similarly for |multiinside|.
do {
l = NextWord();
} until ((wn > num_words) ||
(l && (l->#dict_par1) & 8 ~= 0));
(l && (l->#dict_par1) & DICTPAR1_PREP ~= 0));
if (wn > num_words) {
#Ifdef DEBUG;
@ -1127,9 +1126,9 @@ and similarly for |multiinside|.
do {
l = NextWord();
} until ((wn >= num_words) ||
(l && (l->#dict_par1) & 8 ~= 0));
(l && (l->#dict_par1) & DICTPAR1_PREP ~= 0));
if (l && (l->#dict_par1) & 8) continue;
if (l && (l->#dict_par1) & DICTPAR1_PREP) continue;
! lookahead failed
#Ifdef DEBUG;
@ -2468,8 +2467,7 @@ because we want to allow duplicates).
j = wn; first_word = LanguageIsVerb(buffer2, parse2, 1); wn = j;
}
if (first_word ~= 0) {
j = first_word->#dict_par1;
if ((0 ~= j&1) && ~~LanguageVerbMayBeName(first_word)) {
if (((first_word->#dict_par1) & DICTPAR1_VERB) && ~~LanguageVerbMayBeName(first_word)) {
VM_CopyBuffer(buffer, buffer2);
jump RECONSTRUCT_INPUT;
}
@ -2553,8 +2551,7 @@ because we want to allow duplicates).
! parser to get on with and forget about the question...
if (first_word ~= 0) {
j = first_word->#dict_par1;
if ((0 ~= j&1) && ~~LanguageVerbMayBeName(first_word)) {
if (((first_word->#dict_par1) & DICTPAR1_VERB) && ~~LanguageVerbMayBeName(first_word)) {
VM_CopyBuffer(buffer, buffer2);
jump RECONSTRUCT_INPUT;
}
@ -3701,15 +3698,14 @@ if it was a match because of inadequate input).
if (nomatch && obj == 0) return 0;
dict_flags_of_noun = 0;
current_noun_is_plural = false;
! If input has run out then always match, with only quality 0 (this saves
! time).
if (wn > num_words) {
if (nomatch) return 0;
if (indef_mode ~= 0)
dict_flags_of_noun = $$01110000; ! Reject "plural" bit
if (indef_mode ~= 0) current_noun_is_plural = false;
MakeMatch(obj,0);
#Ifdef DEBUG;
if (parser_trace >= 5) print " Matched (0)^";
@ -3728,10 +3724,9 @@ if it was a match because of inadequate input).
.MMbyPN;
if (parser_action == ##PluralFound)
dict_flags_of_noun = dict_flags_of_noun | 4;
if (parser_action == ##PluralFound) current_noun_is_plural = true;
if (dict_flags_of_noun & 4) {
if (current_noun_is_plural) {
if (~~allow_plurals) k = 0;
else {
if (indef_mode == 0) {
@ -3769,12 +3764,12 @@ if it was a match because of inadequate input).
}
threshold = 1;
dict_flags_of_noun = RelevantNounBits(w);
current_noun_is_plural = TreatNounAsPlural(w);
w = NextWord();
while (Refers(obj, wn-1)) {
threshold++;
if (w)
dict_flags_of_noun = dict_flags_of_noun | (RelevantNounBits(w));
current_noun_is_plural = current_noun_is_plural | (TreatNounAsPlural(w));
w = NextWord();
}
@ -3782,11 +3777,14 @@ if it was a match because of inadequate input).
jump MMbyPN;
];
[ RelevantNounBits w b;
if (w == 0) return 0;
b = w->#dict_par1;
if (b & $$10000) return b & $$01110000;
return b & $$01110100;
[ TreatNounAsPlural w b;
if (w) {
b = w->#dict_par1;
! if (b & DICTPAR1_SING) rfalse;
if (b & DICTPAR1_TRUNC) rfalse;
if (b & DICTPAR1_PLURAL) rtrue;
}
rfalse;
];
@h Refers.
@ -3842,7 +3840,7 @@ if it is a pronoun,
for (j=1 : j<=s : j=j+3)
if (i == LanguagePronouns-->j)
return j+2;
if ((i->#dict_par1)&128 == 0) rfalse;
if ((i->#dict_par1) & DICTPAR1_NOUN == 0) rfalse;
return i;
];
@ -3940,7 +3938,7 @@ Manual}, 4th edition.
for (i=0:i<n:i++) {
w = NextWordStopped();
if (w == 0 or THEN1__WD or COMMA_WORD or -1) break;
if ((RelevantNounBits(w)) & $$00000100) {
if (TreatNounAsPlural(w)) {
parser_action = ##PluralFound;
outcome = true;
}
@ -4130,7 +4128,7 @@ Array alt_match_list --> (MATCH_LIST_WORDS+1);
while (wn <= num_words) {
l = NextWordStopped(); wn--;
if (l == THEN1__WD) break;
if ( (l ~= -1 or 0) && (l->#dict_par1) &8 ) { wn++; continue; } ! if preposition
if ((l ~= -1 or 0) && (l->#dict_par1) & DICTPAR1_PREP) { wn++; continue; } ! if preposition
if (l == ALL1__WD or ALL2__WD or ALL3__WD or ALL4__WD or ALL5__WD) { wn++; continue; }
SafeSkipDescriptors();
! save the current match state

View file

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

View file

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

View file

@ -323,9 +323,9 @@ out the I6 command verb grammar for the supplied command.
=
[ ShowVerbSub address lines meta i x;
wn = 2; x = NextWordStopped();
if (x == 0 || ((x->#dict_par1) & 1) == 0)
if (x == 0 || ((x->#dict_par1) & DICTPAR1_VERB) == 0)
"Try typing ~showverb~ and then the name of a verb.";
meta = ((x->#dict_par1) & 2)/2;
meta = ((x->#dict_par1) & DICTPAR1_META)/2;
i = DictionaryWordToVerbNum(x);
address = VM_CommandTableAddress(i);
lines = address->0;

View file

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

View file

@ -145,6 +145,7 @@ See the Inform 6 Technical Manual for more on these oddities.
WRITE("!%% $ZCODE_LESS_DICT_DATA=1;\n");
WRITE("!%% $LONG_DICT_FLAG_BUG=0;\n");
WRITE("!%% $DICT_IMPLICIT_SINGULAR=1;\n");
WRITE("!%% $DICT_TRUNCATE_FLAG=1;\n");
if (omit_ur) WRITE("!%% $OMIT_UNUSED_ROUTINES=1;\n");
CodeGen::deselect(gen, saved);

View file

@ -11,7 +11,7 @@
> > Morgue Office
(Testing.)
>[1] test monetary
>[1] test dollars
(Testing.)
>[2] drop all

View file

@ -165,11 +165,11 @@ After each instance of the multiply-giving action, we need to clear the variable
The player carries a knitted cap. The price of the knitted cap is $2.
Test me with "test monetary / purloin three dollars / test multi-line / purloin three dollars / purloin pie / purloin cap / test specificity / purloin three dollars / test largesse / test mixed-gift".
Test me with "test dollars / purloin three dollars / test multi-line / purloin three dollars / purloin pie / purloin cap / test specificity / purloin three dollars / test largesse / test mixed-gift".
Test multi-line with "give dollar and pie to attendant. give dollars and cap to attendant".
Test monetary with "drop all / give dollar to Morgue Attendant / give dollars to Morgue Attendant / get dollars / give dollars to morgue attendant / purloin three dollars / drop dollars / give dollars to Morgue Attendant".
Test dollars with "drop all / give dollar to Morgue Attendant / give dollars to Morgue Attendant / get dollars / give dollars to morgue attendant / purloin three dollars / drop dollars / give dollars to Morgue Attendant".
Test specificity with "give three dollars to Morgue Attendant".