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:
parent
81053713c3
commit
8ba38acec7
|
@ -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
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
Prerelease: beta
|
||||
Build Date: 26 February 2024
|
||||
Build Number: 6X36
|
||||
Build Date: 12 March 2024
|
||||
Build Number: 6X37
|
||||
|
|
|
@ -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">§1. Transcript support</a></li><li><a href="S-io.html#SP2">§2. Variables and Arrays</a></li><li><a href="S-io.html#SP3">§3. Dictionary words</a></li><li><a href="S-io.html#SP4">§4. Keyboard Input</a></li><li><a href="S-io.html#SP5">§5. Buffer Functions</a></li><li><a href="S-io.html#SP6">§6. Dictionary Functions</a></li><li><a href="S-io.html#SP7">§7. Command Tables</a></li><li><a href="S-io.html#SP8">§8. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP9">§9. Action functions</a></li><li><a href="S-io.html#SP10">§10. The Screen</a></li><li><a href="S-io.html#SP11">§11. Window Colours</a></li><li><a href="S-io.html#SP12">§12. Main Window</a></li><li><a href="S-io.html#SP13">§13. Status Line</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="S-io.html#SP1">§1. Transcript support</a></li><li><a href="S-io.html#SP2">§2. Dictionary Parameters</a></li><li><a href="S-io.html#SP3">§3. Variables and Arrays</a></li><li><a href="S-io.html#SP4">§4. Dictionary words</a></li><li><a href="S-io.html#SP5">§5. Keyboard Input</a></li><li><a href="S-io.html#SP6">§6. Buffer Functions</a></li><li><a href="S-io.html#SP7">§7. Dictionary Functions</a></li><li><a href="S-io.html#SP8">§8. Command Tables</a></li><li><a href="S-io.html#SP9">§9. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP10">§10. Action functions</a></li><li><a href="S-io.html#SP11">§11. The Screen</a></li><li><a href="S-io.html#SP12">§12. Window Colours</a></li><li><a href="S-io.html#SP13">§13. Main Window</a></li><li><a href="S-io.html#SP14">§14. Status Line</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§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>§2. Variables and Arrays. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§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>§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>§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>§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>§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>§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>§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>§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">->1 < </span><span class="identifier-syntax">b</span><span class="plain-syntax">->0) (</span><span class="identifier-syntax">b</span><span class="plain-syntax">->1)++;</span>
|
||||
<span class="plain-syntax">];</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§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>§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">-->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">-->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>§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>§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>§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>§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">->#</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>§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>§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">--></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>§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>§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">->0); ];</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§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>§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>§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>§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>§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>§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
|
||||
|
|
|
@ -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">§1. Rocks</a></li><li><a href="S-io.html#SP2">§2. Transcript support</a></li><li><a href="S-io.html#SP3">§3. Variables and Arrays</a></li><li><a href="S-io.html#SP4">§4. Dictionary words</a></li><li><a href="S-io.html#SP5">§5. Keyboard Input</a></li><li><a href="S-io.html#SP6">§6. Buffer Functions</a></li><li><a href="S-io.html#SP7">§7. Dictionary Functions</a></li><li><a href="S-io.html#SP8">§8. Command Tables</a></li><li><a href="S-io.html#SP9">§9. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP10">§10. Action functions</a></li><li><a href="S-io.html#SP11">§11. Glulx-Only Printing Routines</a></li><li><a href="S-io.html#SP12">§12. The Screen</a></li><li><a href="S-io.html#SP13">§13. Window Colours</a></li><li><a href="S-io.html#SP14">§14. Main Window</a></li><li><a href="S-io.html#SP15">§15. Status Line</a></li><li><a href="S-io.html#SP16">§16. Quotation Boxes</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="S-io.html#SP1">§1. Rocks</a></li><li><a href="S-io.html#SP2">§2. Transcript support</a></li><li><a href="S-io.html#SP3">§3. Dictionary Parameters</a></li><li><a href="S-io.html#SP4">§4. Variables and Arrays</a></li><li><a href="S-io.html#SP5">§5. Dictionary words</a></li><li><a href="S-io.html#SP6">§6. Keyboard Input</a></li><li><a href="S-io.html#SP7">§7. Buffer Functions</a></li><li><a href="S-io.html#SP8">§8. Dictionary Functions</a></li><li><a href="S-io.html#SP9">§9. Command Tables</a></li><li><a href="S-io.html#SP10">§10. Extracting Verb Numbers</a></li><li><a href="S-io.html#SP11">§11. Action functions</a></li><li><a href="S-io.html#SP12">§12. Glulx-Only Printing Routines</a></li><li><a href="S-io.html#SP13">§13. The Screen</a></li><li><a href="S-io.html#SP14">§14. Window Colours</a></li><li><a href="S-io.html#SP15">§15. Main Window</a></li><li><a href="S-io.html#SP16">§16. Status Line</a></li><li><a href="S-io.html#SP17">§17. Quotation Boxes</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§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>§3. Variables and Arrays. </b></p>
|
||||
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§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>§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"> --> </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"> --> </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"> --> </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>§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>§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>§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>§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>§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>§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">-->0 < </span><span class="identifier-syntax">INPUT_BUFFER_LEN</span><span class="plain-syntax">) (</span><span class="identifier-syntax">b</span><span class="plain-syntax">-->0)++;</span>
|
||||
<span class="plain-syntax">];</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§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>§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>§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>§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>§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>§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>§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>§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">-->(</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>§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>§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>§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>§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">-->0;</span>
|
||||
<span class="plain-syntax">];</span>
|
||||
</pre>
|
||||
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§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>§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">&1) + </span><span class="constant-syntax">$ff00</span><span class="plain-syntax">*(</span><span class="identifier-syntax">c</span><span class="plain-syntax">&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">&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>§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>§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>§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>§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>§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>§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.
|
||||
|
|
|
@ -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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && ((</span><span class="identifier-syntax">verb_word</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> > </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">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && (</span><span class="identifier-syntax">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> > </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"> >= </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">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && (</span><span class="identifier-syntax">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && (</span><span class="identifier-syntax">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"> && (</span><span class="identifier-syntax">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</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">&1) && ~~</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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) && ~~</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">->#</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">&1) && ~~</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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </span><span class="identifier-syntax">DICTPAR1_VERB</span><span class="plain-syntax">) && ~~</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"> && </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"> > </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"> >= </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"> & </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">->#</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"> & </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"> & </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"> & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">;</span>
|
||||
<span class="comment-syntax"> if (b & 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"> & </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"> & </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>§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"><=</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">--></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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">)&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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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"><</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">)) & </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"> <= </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">) && (</span><span class="identifier-syntax">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) &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">) && (</span><span class="identifier-syntax">l</span><span class="plain-syntax">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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>
|
||||
|
|
|
@ -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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->#</span><span class="identifier-syntax">dict_par1</span><span class="plain-syntax">) & </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">->0;</span>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "BasicInformKit",
|
||||
"version": "10.2.0-beta+6X36"
|
||||
"version": "10.2.0-beta+6X37"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "CommandParserKit",
|
||||
"version": "10.2.0-beta+6X36"
|
||||
"version": "10.2.0-beta+6X37"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "EnglishLanguageKit",
|
||||
"version": "10.2.0-beta+6X36"
|
||||
"version": "10.2.0-beta+6X37"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"is": {
|
||||
"type": "kit",
|
||||
"title": "WorldModelKit",
|
||||
"version": "10.2.0-beta+6X36"
|
||||
"version": "10.2.0-beta+6X37"
|
||||
},
|
||||
"needs": [ {
|
||||
"need": {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
> > Morgue Office
|
||||
(Testing.)
|
||||
|
||||
>[1] test monetary
|
||||
>[1] test dollars
|
||||
(Testing.)
|
||||
|
||||
>[2] drop all
|
||||
|
|
|
@ -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".
|
||||
|
||||
|
|
Loading…
Reference in a new issue