mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
4199 lines
632 KiB
HTML
4199 lines
632 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>4/am</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
|
|
<!--Weave of '5/lp' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">★</a></li><li><a href="index.html">core</a></li><li><a href="index.html#5">Chapter 5: Nouns</a></li><li><b>Literal Patterns</b></li></ul><p class="purpose">To manage the possible notations with which literal values can be written.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Definitions</a></li><li><a href="#SP9">§9. Creating patterns, tokens and elements</a></li><li><a href="#SP12">§12. Listing LPs</a></li><li><a href="#SP17">§17. Optional break points</a></li><li><a href="#SP18">§18. Matching an LP in the source text</a></li><li><a href="#SP19">§19. Matching an LP at run-time</a></li><li><a href="#SP20">§20. Indexing literal patterns for a given kind</a></li><li><a href="#SP23">§23. Printing values in an LP's notation to the index at compile-time</a></li><li><a href="#SP27">§27. Printing the I6 variable |value| out in an LP's notation at run-time</a></li><li><a href="#SP31">§31. Creating new literal patterns</a></li><li><a href="#SP40">§40. I7 phrases to print values in specified ways</a></li><li><a href="#SP41">§41. I7 phrases to pack and unpack the value</a></li><li><a href="#SP42">§42. The kind's list</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>Literals are excerpts of text which explicitly specify values, rather than
|
|
by indirectly naming them. "15" is a literal but "the score" is not, even
|
|
if it happens to have the value 15. Inform contains specific code to parse
|
|
literals such as
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>-314, "Morocco leather", 10:41 PM</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">(see "Lexer.w" and "Parsing Literals.w"), but it also has a system
|
|
allowing the user to create new notations for quasi-numerical kinds of value.
|
|
For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>16:9 specifies an aspect ratio.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">establishes a new notation for writing literal aspect ratios. This notation
|
|
is stored internally as a "literal pattern", and the code to handle it
|
|
is found in this section. (No other sorts of literal are parsed here.)
|
|
Each kind of value has a linked list of literal notations which can specify
|
|
it, if any. We sometimes need to iterate through the this list, and can do
|
|
so with the following macro:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::list_of_literal_forms</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">); </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">=</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>LPs with just a single numerical part to them (like "20 yards" rather than
|
|
"16:9") are of special interest for holding scientific measurements, and
|
|
we provide elaborate extra features for this form of LP.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">A given kind can have many different LPs to represent it, and this is
|
|
especially convenient for physics — it means we can give ways to describe
|
|
mass (a kind of value) in grams, kilograms or tonnes (all literal patterns).
|
|
Among these, one LP is special and is called the "benchmark" for the kind —
|
|
it is the default notation, the one considered most natural, and other LPs for
|
|
the same kind are scaled relative to this. For instance, the benchmark for
|
|
mass might be the notation "1 kg"; the notations "1 g" and "1 tonne" would
|
|
then be scaled down by 1000, or scaled up by 1000, as compared with the
|
|
benchmark.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Syntactically, a literal pattern is a series of "tokens", of which more
|
|
below. Some tokens are simply fixed lettering or wording, but others
|
|
represent positions where "elements" — the numerical parts — appear. In
|
|
the "16:9" notation, there are three tokens — an element token, a fixed
|
|
colon, and another element token. At least one of the tokens has to be a
|
|
element token.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_ELEMENTS_PER_LITERAL</span><span class="plain"> 8</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_TOKENS_PER_LITERAL</span><span class="plain"> 100</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_specified</span><span class="plain">; </span> <span class="comment">the kind of the result: i.e., what it specifies</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">next_for_this_kind</span><span class="plain">; </span> <span class="comment">continuing list for this kind</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">prototype_text</span><span class="plain">; </span> <span class="comment">where the prototype specification is</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_lp_tokens</span><span class="plain">; </span> <span class="comment">number of tokens in parse_node</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_token</span><span class="plain"> </span><span class="identifier">lp_tokens</span><span class="plain">[</span><span class="constant">MAX_TOKENS_PER_LITERAL</span><span class="plain">];</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_lp_elements</span><span class="plain">; </span> <span class="comment">how many tokens are numbers</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_element</span><span class="plain"> </span><span class="identifier">lp_elements</span><span class="plain">[</span><span class="constant">MAX_ELEMENTS_PER_LITERAL</span><span class="plain">];</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">number_signed</span><span class="plain">; </span> <span class="comment">for instance -10 cm would be allowed if this is set</span>
|
|
|
|
<span class="comment">used when we have a sequence of alternative notations for the same unit</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">primary_alternative</span><span class="plain">; </span> <span class="comment">first of a set of alternatives?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">next_alternative_lp</span><span class="plain">; </span> <span class="comment">continuing list of alternatives</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">singular_form_only</span><span class="plain">; </span> <span class="comment">print using this notation only for 1 unit</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">plural_form_only</span><span class="plain">; </span> <span class="comment">print using this notation for 2 units, 0.5 units, etc.</span>
|
|
|
|
<span class="comment">used when printing and calculating values</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">scaling_transformation</span><span class="plain"> </span><span class="identifier">scaling</span><span class="plain">; </span> <span class="comment">how to convert apparent to actual values</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">equivalent_unit</span><span class="plain">; </span> <span class="comment">is this just an equivalent to another LP?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">benchmark</span><span class="plain">; </span> <span class="comment">is this the benchmark LP for its kind?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_resort</span><span class="plain">; </span> <span class="comment">is this the last possible LP to use when printing a value of the kind?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">marked_for_printing</span><span class="plain">; </span> <span class="comment">used in compiling printing routines</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">jump_label</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">literal_pattern</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure literal_pattern is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">LITERAL_PATTERNS</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>There are three sorts of token: character, word and element. Each token can
|
|
be a whole word, or only part of a word. For instance, in
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>28kg net specifies a weight.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">we have a sequence of four tokens: an element token, marked as beginning a
|
|
word; a character token <code class="display"><span class="extract">k</span></code>; a character token <code class="display"><span class="extract">g</span></code>; and a word token <code class="display"><span class="extract">net</span></code>,
|
|
which necessarily begins a word. Word boundaries in the source text must
|
|
match those in the specification, so this notation does not match the text
|
|
"41 kg net", for instance.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">WORD_LPT</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">CHARACTER_LPT</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ELEMENT_LPT</span><span class="plain"> 3</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_token</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_word_at</span><span class="plain">; </span> <span class="comment">does token start a new word?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lpt_type</span><span class="plain">; </span> <span class="comment">one of the three constants defined above</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">token_char</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">CHARACTER_LPT</span></code> only; the character to match</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">token_wn</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">WORD_LPT</span></code> only; word number in source text of the prototype</span>
|
|
<span class="plain">} </span><span class="reserved">literal_pattern_token</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure literal_pattern_token is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>A value notated this way is like an old-school Pascal packed integer,
|
|
where a small data structure was joined into a single word of data. For
|
|
instance, in the "16:9" example, e_0:e_1 would be stored as
|
|
e_0r_1+e_1 where r_1 = 10 is one more than the maximum value of e_1.
|
|
So "4:3" would be stored as 4.(9+1) + 3 = 43.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">More formally, we call the numbers in such a literal its "elements". In the
|
|
case of "16:9", there are two elements, e_0 = 16 and e_1 = 9. The general
|
|
formula is:
|
|
N = Σ_{i=0}^{n-1} e_i. Π_{j>i} r_j
|
|
where (e_0, e_1, ..., e_{n-1}) are the values and r_j, the "range",
|
|
is the constraint such that 0<= e_j < r_j.
|
|
Note that r_0 is never required, since e_0 is constrained in size only
|
|
by the need for N to fit into a single virtual machine integer. The value
|
|
m_i = Π_{j>i} r_j
|
|
is called the "multiplier", and note that m_{n-1} = 1. Conversely,
|
|
e_i = N/m_0 if i=0, and N/m_i ~mod~ r_i otherwise.
|
|
The rightmost element e_{n-1} is the least significant numerically.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_element</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">element_index</span><span class="plain">; </span> <span class="comment">the value i placing this within its LP, where 0<= i<n</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">element_range</span><span class="plain">; </span> <span class="comment">the value r_i for this LP</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">element_multiplier</span><span class="plain">; </span> <span class="comment">the value m_i for this LP</span>
|
|
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">element_name</span><span class="plain">; </span> <span class="comment">if we define a name for the element</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_real</span><span class="plain">; </span> <span class="comment">store as a real number, not an integer?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">without_leading_zeros</span><span class="plain">; </span> <span class="comment">normally without?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">element_optional</span><span class="plain">; </span> <span class="comment">can we truncate the LP here?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">preamble_optional</span><span class="plain">; </span> <span class="comment">if so, can we lose the preamble as well?</span>
|
|
<span class="plain">} </span><span class="reserved">literal_pattern_element</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure literal_pattern_element is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>For the sake of printing, we can specify which notation is to be used in
|
|
printing a value back. For instance,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>1 tonne (in tonnes, singular) specifies a mass scaled up by 1000.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">assigns the name "in tonnes" to this notation for writing a mass. There can
|
|
be several notation associated with "in tonnes":
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>2 tonnes (in tonnes, plural) specifies a mass scaled up by 1000.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">and hence the linked list of LPs associated with a single "literal pattern
|
|
name". Moreover, a given kind of value can support multiple named notations;
|
|
mass might also support "in kilograms" and "in grams", for instance.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_name</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">notation_name</span><span class="plain">; </span> <span class="comment">name for this notation, if any; e.g. "in centimetres"</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">can_use_this_lp</span><span class="plain">; </span> <span class="comment">list of LPs used under this name</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">; </span> <span class="comment">other names for the same kind</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">next_with_rp</span><span class="plain">; </span> <span class="comment">used in parsing only: list applied to one notation</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lpn_compiled_already</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">literal_pattern_name</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure literal_pattern_name is accessed in 3/pd, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ss, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 8/ec, 8/ed, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Creating patterns, tokens and elements. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::lp_new</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain">);</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_alternative_lp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::new</span><span class="plain">(</span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">LP_SCALED_AT</span><span class="plain">, 1, 1.0, 0, 0.0);</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>jump_label</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lp_new is used in <a href="#SP34_9">§34.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern_token</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lpt_new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">nw</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_token</span><span class="plain"> </span><span class="identifier">lpt</span><span class="plain">;</span>
|
|
<span class="identifier">lpt</span><span class="element">.new_word_at</span><span class="plain"> = </span><span class="identifier">nw</span><span class="plain">;</span>
|
|
<span class="identifier">lpt</span><span class="element">.lpt_type</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="identifier">lpt</span><span class="element">.token_char</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">lpt</span><span class="element">.token_wn</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lpt</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lpt_new is used in <a href="#SP34_10">§34.10</a>, <a href="#SP34_10_1">§34.10.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lpe_new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sgn</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> </span><span class="identifier">lpe</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 0) </span><span class="identifier">lpe</span><span class="element">.element_range</span><span class="plain"> = -1; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">lpe</span><span class="element">.element_range</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span>
|
|
<span class="identifier">lpe</span><span class="element">.element_multiplier</span><span class="plain"> = 1;</span>
|
|
<span class="identifier">lpe</span><span class="element">.element_index</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">lpe</span><span class="element">.element_name</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">lpe</span><span class="element">.preamble_optional</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lpe</span><span class="element">.element_optional</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lpe</span><span class="element">.without_leading_zeros</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lpe</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lpe_new is used in <a href="#SP34_10_1">§34.10.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Listing LPs. </b>A routine to append a LP to the linked list of LPs for a given kind. But
|
|
it's a little more involved because this is where we calculate the scale
|
|
factors which relate LPs in the list, and also because we need to keep the
|
|
list in a particular order.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">PM_ZMachineOverflow2_issued</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::list_add</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">list_head</span><span class="plain">,</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">new_lp</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">using_integer_scaling</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list_head</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><<span class="cwebmacro">Begin a new list with just the new LP in it</span> <span class="cwebmacronumber">12.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Add the new LP to the existing list</span> <span class="cwebmacronumber">12.2</span>><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Correct the "last resort" flags in the list of LPs</span> <span class="cwebmacronumber">12.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Automatically enable signed literals if there are scaled LPs in the list</span> <span class="cwebmacronumber">12.4</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list_head</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::list_add is used in <a href="#SP42">§42</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12_1"></a><b>§12.1. </b>When the new LP is the first one, it can only be scaled in absolute terms:
|
|
"scaled at", which specifies its M value.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Begin a new list with just the new LP in it</span> <span class="cwebmacronumber">12.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Kinds::Scalings::determine_M</span><span class="plain">(&(</span><span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">,</span>
|
|
<span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain">, </span><span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">);</span>
|
|
<span class="identifier">list_head</span><span class="plain"> = </span><span class="identifier">new_lp</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP12">§12</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12_2"></a><b>§12.2. </b>But if other LPs already exist, then absolute scalings are forbidden. The
|
|
new LP must be scaled up or down relative to existing notations, or pegged
|
|
equivalent to an exact value.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Add the new LP to the existing list</span> <span class="cwebmacronumber">12.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="identifier">scaling_transformation</span><span class="plain"> *</span><span class="identifier">benchmark_sc</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain">) </span><span class="identifier">benchmark_sc</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rescale_factor</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::determine_M</span><span class="plain">(&(</span><span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">), </span><span class="identifier">benchmark_sc</span><span class="plain">,</span>
|
|
<span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain">, </span><span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rescale_factor</span><span class="plain"> != 1)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain"> != </span><span class="identifier">new_lp</span><span class="plain">) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain"> =</span>
|
|
<span class="identifier">Kinds::Scalings::enlarge</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">rescale_factor</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">list_head</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lp_list_add_inner</span><span class="plain">(</span><span class="identifier">list_head</span><span class="plain">, </span><span class="identifier">new_lp</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">()) && (</span><span class="identifier">PM_ZMachineOverflow2_issued</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Scalings::quantum</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">) > 32767) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ZMachineOverflow2</span><span class="plain">),</span>
|
|
<span class="string">"you've set up literal specifications needing a range of "</span>
|
|
<span class="string">"values too broad to be stored at run-time"</span><span class="plain">,</span>
|
|
<span class="string">"at least with the Settings for this project as they currently are. "</span>
|
|
<span class="string">"(Change to Glulx to be allowed to use much larger numbers; "</span>
|
|
<span class="string">"or for really enormous values, use real arithmetic.)"</span><span class="plain">);</span>
|
|
<span class="identifier">PM_ZMachineOverflow2_issued</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP12">§12</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12_3"></a><b>§12.3. </b>Within the list, exactly one LP is marked with the <code class="display"><span class="extract">last_resort</span></code> flag: the
|
|
last one not marked as an equivalent unit. (You can only be equivalent to
|
|
something already there, so it's not possible for all the LPs in the list to
|
|
be equivalent.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Correct the "last resort" flags in the list of LPs</span> <span class="cwebmacronumber">12.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, *</span><span class="identifier">last_resorter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">) {</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>last_resort</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">last_resorter</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_resorter</span><span class="plain">) </span><span class="identifier">last_resorter</span><span class="plain">-</span><span class="element">>last_resort</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP12">§12</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12_4"></a><b>§12.4. </b>Inform is ordinarily a bit picky about not allowing negative values within
|
|
these notations, unless they have explicitly been defined to allow it. That
|
|
makes sense for basically combinatorial notations (room 1 to room 64, say)
|
|
but would be a nonsense for scientific measurements where we intend to perform
|
|
arithmetic. So:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Automatically enable signed literals if there are scaled LPs in the list</span> <span class="cwebmacronumber">12.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scalings_exist</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Scalings::involves_scale_change</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">))</span>
|
|
<span class="identifier">scalings_exist</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scalings_exist</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP12">§12</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>The actual insertion of the new LP into the list is carried out here, and
|
|
is complicated by the fact that we need to keep these in a special order.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::lp_list_add_inner</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">list_head</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">new_lp</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, *</span><span class="identifier">lp_prev</span><span class="plain">;</span>
|
|
<span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list_head</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_lp</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">list_head</span><span class="plain">; </span><span class="identifier">lp_prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LiteralPatterns::lp_precedes</span><span class="plain">(</span><span class="identifier">new_lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">)) {</span>
|
|
<span class="identifier">new_lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp_prev</span><span class="plain">) </span><span class="identifier">lp_prev</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain"> = </span><span class="identifier">new_lp</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">list_head</span><span class="plain"> = </span><span class="identifier">new_lp</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list_head</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">lp_prev</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">lp_prev</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain"> = </span><span class="identifier">new_lp</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">list_head</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lp_list_add_inner is used in <a href="#SP12_2">§12.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b>Highly scaled values come before less scaled ones; otherwise plural forms
|
|
come before singular ones; and otherwise an earlier-defined LP comes before
|
|
a later one.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lp_precedes</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::compare</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">s</span><span class="plain"> > 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">s</span><span class="plain"> < 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain"> < </span><span class="identifier">B</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lp_precedes is used in <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. </b>One member of the list is the "benchmark", as noted above.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::get_benchmark</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain">)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::get_benchmark is used in <a href="#SP16">§16</a>, <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. </b>And this returns the multiplier of the benchmark, which is important for
|
|
performing multiplications (see "Dimensions").
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::scale_factor</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">benchmark_lp</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::get_benchmark</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">benchmark_lp</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">Kinds::Scalings::get_integer_multiplier</span><span class="plain">(</span><span class="identifier">benchmark_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::scale_factor appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Optional break points. </b>Sometimes the pattern allows later numerical elements to be skipped, in which
|
|
case they are understood to be 0.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::at_optional_break_point</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">ec</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ec</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">) && </span> <span class="comment">i.e., if there are still numerical elements to supply</span>
|
|
<span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.element_optional</span><span class="plain">) && </span> <span class="comment">but which are optional</span>
|
|
<span class="plain">((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.preamble_optional</span><span class="plain">) || </span> <span class="comment">and either the preamble tokens are also optional</span>
|
|
<span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.lpt_type</span><span class="plain"> == </span><span class="constant">ELEMENT_LPT</span><span class="plain">))) </span> <span class="comment">or we're at the number token</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::at_optional_break_point is used in <a href="#SP18_1">§18.1</a>, <a href="#SP19">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Matching an LP in the source text. </b>Given an excerpt <code class="display"><span class="extract">(w1, w2)</span></code>, we try to parse it as a constant value written
|
|
in the LP notation: if it passes, we return the kind of value, and if not
|
|
we return <code class="display"><span class="extract">NULL</span></code>.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">waive_lp_overflows</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_LP_problem_at</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">double</span><span class="plain"> </span><span class="identifier">latest_constructed_real</span><span class="plain"> = 0.0;</span>
|
|
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::match</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">found</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">matched_number</span><span class="plain"> = 0, </span><span class="identifier">overflow_16_bit_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">overflow_32_bit_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">sign_used_at</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">element_overflow_at</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="comment">if the excerpt is longer than the maximum length of such a notation, give up quickly:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) > </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Try to match the excerpt against the whole prototype or up to an optional break</span> <span class="cwebmacronumber">18.1</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sign_used_at</span><span class="plain">) </span><<span class="cwebmacro">Check that a negative number can be used in this notation</span> <span class="cwebmacronumber">18.2</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">waive_lp_overflows</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">element_overflow_at</span><span class="plain">) </span><<span class="cwebmacro">Report a problem because one element in the notation overflows</span> <span class="cwebmacronumber">18.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Check that the value found lies within the range which the VM can hold</span> <span class="cwebmacronumber">18.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain">*</span><span class="identifier">found</span><span class="plain"> = </span><span class="identifier">matched_number</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::match is used in 10/pl (<a href="10-pl.html#SP1">§1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1"></a><b>§18.1. </b>Scanning the tokens one at a time. The scan position is represented as a
|
|
word number <code class="display"><span class="extract">wn</span></code> together with a character position within the word, <code class="display"><span class="extract">wpos</span></code>.
|
|
The <code class="display"><span class="extract">wpos</span></code> value -1 means that word <code class="display"><span class="extract">wn</span></code> has not yet been started.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Try to match the excerpt against the whole prototype or up to an optional break</span> <span class="cwebmacronumber">18.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain">, </span><span class="identifier">wn</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">), </span><span class="identifier">wpos</span><span class="plain"> = -1, </span><span class="identifier">ec</span><span class="plain"> = 0, </span><span class="identifier">matched_scaledown</span><span class="plain"> = 1, </span><span class="identifier">parsed_as_real</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">wd</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">));</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain">=0; </span><span class="identifier">tc</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain">; </span><span class="identifier">tc</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wn</span><span class="plain"> > </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">wpos</span><span class="plain"> == -1) </span> <span class="comment">i.e., if we are cleanly at a word boundary</span>
|
|
<span class="plain">&& (</span><span class="functiontext">LiteralPatterns::at_optional_break_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">ec</span><span class="plain">, </span><span class="identifier">tc</span><span class="plain">))) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.lpt_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WORD_LPT</span><span class="plain">: </span><<span class="cwebmacro">Match a fixed word token within a literal pattern</span> <span class="cwebmacronumber">18.1.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CHARACTER_LPT</span><span class="plain">: </span><<span class="cwebmacro">Match a character token within a literal pattern</span> <span class="cwebmacronumber">18.1.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ELEMENT_LPT</span><span class="plain">: </span><<span class="cwebmacro">Match an element token within a literal pattern</span> <span class="cwebmacronumber">18.1.3</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown literal pattern token type"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wpos</span><span class="plain"> >= 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">we need to end cleanly, not in mid-word</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wn</span><span class="plain"> <= </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">and we need to have used up all of the excerpt</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parsed_as_real</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">loses_accuracy</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">scaling_transformation</span><span class="plain"> </span><span class="identifier">sc</span><span class="plain"> =</span>
|
|
<span class="identifier">Kinds::Scalings::contract</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">matched_scaledown</span><span class="plain">, &</span><span class="identifier">loses_accuracy</span><span class="plain">);</span>
|
|
<span class="identifier">matched_number</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::quanta_to_value</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">, </span><span class="identifier">matched_number</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">loses_accuracy</span><span class="plain">) </span><<span class="cwebmacro">Report a problem because not enough accuracy is available</span> <span class="cwebmacronumber">18.1.4</span>><span class="plain">;</span>
|
|
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_16_bit</span><span class="plain"> = 32767</span><span class="identifier">LL</span><span class="plain">, </span><span class="identifier">max_32_bit</span><span class="plain"> = 2147483647</span><span class="identifier">LL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">matched_number</span><span class="plain"> > </span><span class="identifier">max_16_bit</span><span class="plain">) </span><span class="identifier">overflow_16_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">matched_number</span><span class="plain"> > </span><span class="identifier">max_32_bit</span><span class="plain">) </span><span class="identifier">overflow_32_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sign_used_at</span><span class="plain">) </span><span class="identifier">matched_number</span><span class="plain"> = -</span><span class="identifier">matched_number</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">push</span>
|
|
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">ignored</span><span class="plain"> </span><span class="string">"-Wsign-conversion"</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sign_used_at</span><span class="plain">) </span><span class="identifier">matched_number</span><span class="plain"> = </span><span class="identifier">matched_number</span><span class="plain"> | 0</span><span class="identifier">x80000000</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">pop</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18">§18</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1_1"></a><b>§18.1.1. </b>A word token matches an exact word (but allowing for variation in casing).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Match a fixed word token within a literal pattern</span> <span class="cwebmacronumber">18.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wpos</span><span class="plain"> >= 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">if we're still in the middle of the last word, we must fail</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_words</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_wn</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">wn</span><span class="plain">++;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18_1">§18.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1_2"></a><b>§18.1.2. </b>A character token matches only a single character — note the case insensitivity
|
|
here, because of the use of <code class="display"><span class="extract">tolower</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Match a character token within a literal pattern</span> <span class="cwebmacronumber">18.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wpos</span><span class="plain"> == -1) { </span><span class="identifier">wpos</span><span class="plain"> = 0; </span><span class="identifier">wd</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">); } </span> <span class="comment">start parsing the interior of a word</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::tolower</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]) != </span><span class="identifier">Characters::tolower</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_char</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == 0) { </span><span class="identifier">wn</span><span class="plain">++; </span><span class="identifier">wpos</span><span class="plain"> = -1; } </span> <span class="comment">and stop parsing the interior of a word</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18_1">§18.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1_3"></a><b>§18.1.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Match an element token within a literal pattern</span> <span class="cwebmacronumber">18.1.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">++]); </span> <span class="comment">fetch details of next number</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wpos</span><span class="plain"> == -1) { </span><span class="identifier">wpos</span><span class="plain"> = 0; </span><span class="identifier">wd</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">wn</span><span class="plain">); } </span> <span class="comment">start parsing the interior of a word</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'-'</span><span class="plain">) { </span><span class="identifier">sign_used_at</span><span class="plain"> = </span><span class="identifier">lpe</span><span class="plain">; </span><span class="identifier">wpos</span><span class="plain">++; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">)) </span><<span class="cwebmacro">Match a real number element token</span> <span class="cwebmacronumber">18.1.3.2</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Match an integer number element token</span> <span class="cwebmacronumber">18.1.3.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == 0) { </span><span class="identifier">wn</span><span class="plain">++; </span><span class="identifier">wpos</span><span class="plain"> = -1; } </span> <span class="comment">and stop parsing the interior of a word</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18_1">§18.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1_3_1"></a><b>§18.1.3.1. </b>There are three different sorts of overflow:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(1) The calculation of the packed value exceeding the range which an integer
|
|
can store on a 16-bit virtual machine;
|
|
</li><li>(2) Ditto, but on a 32-bit virtual machine; and
|
|
</li><li>(3) One of the numerical elements inside the notation being given out of range.
|
|
</li></ul>
|
|
<p class="inwebparagraph">We report none of these as a problem immediately — only if the pattern would
|
|
otherwise match.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The following assumes that <code class="display"><span class="extract">long long int</span></code> is at least 64-bit, so that it
|
|
can hold any 32-bit integer multiplied by 10, and also any product of two
|
|
32-bit numbers. This is true for all modern <code class="display"><span class="extract">gcc</span></code> implementations and is
|
|
required by PM_, but was not required by C90, so it is just possible that
|
|
this could cause trouble on unusual platforms.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Match an integer number element token</span> <span class="cwebmacronumber">18.1.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tot</span><span class="plain"> = 0, </span><span class="identifier">max_32_bit</span><span class="plain">, </span><span class="identifier">max_16_bit</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">digits_found</span><span class="plain"> = 0, </span><span class="identifier">point_at</span><span class="plain"> = -1;</span>
|
|
<span class="identifier">max_16_bit</span><span class="plain"> = 32767</span><span class="identifier">LL</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sign_used_at</span><span class="plain">) </span><span class="identifier">max_16_bit</span><span class="plain"> = 32768</span><span class="identifier">LL</span><span class="plain">;</span>
|
|
<span class="identifier">max_32_bit</span><span class="plain"> = 2147483647</span><span class="identifier">LL</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sign_used_at</span><span class="plain">) </span><span class="identifier">max_32_bit</span><span class="plain"> = 2147483648</span><span class="identifier">LL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">])) ||</span>
|
|
<span class="plain">((</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'.'</span><span class="plain">) && (</span><span class="identifier">Kinds::Scalings::get_integer_multiplier</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">) > 1) && (</span><span class="identifier">point_at</span><span class="plain"> == -1))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'.'</span><span class="plain">) { </span><span class="identifier">point_at</span><span class="plain"> = </span><span class="identifier">digits_found</span><span class="plain">; </span><span class="identifier">wpos</span><span class="plain">++; </span><span class="reserved">continue</span><span class="plain">; }</span>
|
|
<span class="identifier">tot</span><span class="plain"> = 10*</span><span class="identifier">tot</span><span class="plain"> + (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++] - </span><span class="character">'0'</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > </span><span class="identifier">max_16_bit</span><span class="plain">) </span><span class="identifier">overflow_16_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > </span><span class="identifier">max_32_bit</span><span class="plain">) </span><span class="identifier">overflow_32_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">digits_found</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">point_at</span><span class="plain"> == 0) || (</span><span class="identifier">point_at</span><span class="plain"> == </span><span class="identifier">digits_found</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">digits_found</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">point_at</span><span class="plain"> > 0) && (</span><span class="identifier">point_at</span><span class="plain"> < </span><span class="identifier">digits_found</span><span class="plain">)) {</span>
|
|
<span class="identifier">matched_scaledown</span><span class="plain"> *= 10; </span><span class="identifier">point_at</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tot</span><span class="plain"> >= </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">) && (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_index</span><span class="plain"> > 0)) </span><span class="identifier">element_overflow_at</span><span class="plain"> = </span><span class="identifier">lpe</span><span class="plain">;</span>
|
|
<span class="identifier">tot</span><span class="plain"> = (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">)*</span><span class="identifier">tot</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > </span><span class="identifier">max_16_bit</span><span class="plain">) </span><span class="identifier">overflow_16_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > </span><span class="identifier">max_32_bit</span><span class="plain">) </span><span class="identifier">overflow_32_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">tot</span><span class="plain"> = </span><span class="identifier">matched_number</span><span class="plain"> + </span><span class="identifier">tot</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > </span><span class="identifier">max_16_bit</span><span class="plain">) </span><span class="identifier">overflow_16_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > </span><span class="identifier">max_32_bit</span><span class="plain">) </span><span class="identifier">overflow_32_bit_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">matched_number</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">tot</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18_1_3">§18.1.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1_3_2"></a><b>§18.1.3.2. </b>In real arithmetic, though, overflow isn't a problem, since we can use the
|
|
infinities to represent arbitrarily large numbers.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Match a real number element token</span> <span class="cwebmacronumber">18.1.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">point_at</span><span class="plain"> = -1, </span><span class="identifier">mult_at</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">])) || ((</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'.'</span><span class="plain">) && (</span><span class="identifier">point_at</span><span class="plain"> == -1))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'.'</span><span class="plain">) </span><span class="identifier">point_at</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">);</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">) == 0) || (</span><span class="identifier">point_at</span><span class="plain"> == </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">)-1)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Literals::ismultiplicationsign</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">])) {</span>
|
|
<span class="identifier">mult_at</span><span class="plain"> = </span><span class="identifier">wpos</span><span class="plain">;</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'1'</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]); </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'0'</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]); </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'^'</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]); </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'+'</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">] == </span><span class="character">'-'</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">])) {</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">, </span><span class="identifier">wd</span><span class="plain">[</span><span class="identifier">wpos</span><span class="plain">++]);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">real_buffer</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">point_at</span><span class="plain"> == -1) && (</span><span class="identifier">mult_at</span><span class="plain"> == -1)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">>(</span><span class="identifier">Wordings::first_word</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">matched_number</span><span class="plain"> = <<</span><span class="identifier">r</span><span class="plain">>>;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">signbit</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">matched_number</span><span class="plain"> < 0) { </span><span class="identifier">signbit</span><span class="plain"> = 1; </span><span class="identifier">matched_number</span><span class="plain"> = -</span><span class="identifier">matched_number</span><span class="plain">; }</span>
|
|
<span class="identifier">matched_number</span><span class="plain"> = </span><span class="functiontext">Literals::construct_float</span><span class="plain">(</span><span class="identifier">signbit</span><span class="plain">, </span><span class="identifier">matched_number</span><span class="plain">, 0, 0);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">real</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">digits</span><span class="plain">>(</span><span class="identifier">Wordings::first_word</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">matched_number</span><span class="plain"> = <<</span><span class="identifier">r</span><span class="plain">>>;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">latest_constructed_real</span><span class="plain"> =</span>
|
|
<span class="identifier">Kinds::Scalings::real_quanta_to_value</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">latest_constructed_real</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">signbit</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">latest_constructed_real</span><span class="plain"> < 0) {</span>
|
|
<span class="identifier">latest_constructed_real</span><span class="plain"> = -</span><span class="identifier">latest_constructed_real</span><span class="plain">;</span>
|
|
<span class="identifier">signbit</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">matched_number</span><span class="plain"> = </span><span class="functiontext">Literals::construct_float</span><span class="plain">(</span><span class="identifier">signbit</span><span class="plain">, </span><span class="identifier">latest_constructed_real</span><span class="plain">, 0, 0);</span>
|
|
<span class="identifier">parsed_as_real</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18_1_3">§18.1.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_2"></a><b>§18.2. </b>Problem messages here have a tendency to be repeated, in some situations,
|
|
which is annoying. So we have a mechanism to suppress duplicates:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">ISSUING_LP_PROBLEM</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_LP_problem_at</span><span class="plain"> == </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">last_LP_problem_at</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check that a negative number can be used in this notation</span> <span class="cwebmacronumber">18.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sign_used_at</span><span class="plain">-</span><span class="element">>element_index</span><span class="plain"> != 0) {</span>
|
|
<span class="constant">ISSUING_LP_PROBLEM</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NegationInternal</span><span class="plain">),</span>
|
|
<span class="string">"a negative number can't be used in the middle of a constant"</span><span class="plain">,</span>
|
|
<span class="string">"and the minus sign makes it look as if that's what you are "</span>
|
|
<span class="string">"trying here."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="constant">ISSUING_LP_PROBLEM</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NegationForbidden</span><span class="plain">),</span>
|
|
<span class="string">"the minus sign is not allowed here"</span><span class="plain">,</span>
|
|
<span class="string">"since this is a kind of value which only allows positive "</span>
|
|
<span class="string">"values to be written."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18">§18</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_3"></a><b>§18.3. </b>The out of range problem messages:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check that the value found lies within the range which the VM can hold</span> <span class="cwebmacronumber">18.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">overflow_32_bit_flag</span><span class="plain">) {</span>
|
|
<span class="constant">ISSUING_LP_PROBLEM</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_EvenOverflow</span><span class="plain">-</span><span class="identifier">G</span><span class="plain">),</span>
|
|
<span class="string">"you use a literal specification to make a value which is too large"</span><span class="plain">,</span>
|
|
<span class="string">"even for a story file compiled with the Glulx setting. (You can "</span>
|
|
<span class="string">"see the size limits for each way of writing a value on the Kinds "</span>
|
|
<span class="string">"page of the Index.)"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">overflow_16_bit_flag</span><span class="plain">) && (</span><span class="functiontext">VirtualMachines::is_16_bit</span><span class="plain">())) {</span>
|
|
<span class="constant">ISSUING_LP_PROBLEM</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ZMachineOverflow</span><span class="plain">),</span>
|
|
<span class="string">"you use a literal specification to make a value which is too large"</span><span class="plain">,</span>
|
|
<span class="string">"at least with the Settings for this project as they currently are. "</span>
|
|
<span class="string">"(Change to Glulx to be allowed to use much larger numbers; "</span>
|
|
<span class="string">"meanwhile, you can see the size limits for each way of writing a "</span>
|
|
<span class="string">"value on the Kinds page of the Index.)"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18">§18</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_4"></a><b>§18.4. </b>The more specific problem of an internal overflow:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Report a problem because one element in the notation overflows</span> <span class="cwebmacronumber">18.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain"> = </span><span class="identifier">element_overflow_at</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain"> - 1;</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_number</span><span class="plain">(4, &</span><span class="identifier">max</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">element_overflow_at</span><span class="plain">-</span><span class="element">>element_index</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> 0: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"first"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"second"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"third"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 3: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"fourth"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 4: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"fifth"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 5: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"sixth"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 6: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"seventh"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 7: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"eighth"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 8: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"ninth"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 9: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"tenth"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">Problems::quote_text</span><span class="plain">(5, </span><span class="string">"eventual"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ElementOverflow</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, you use the notation '%2' to write a constant value. "</span>
|
|
<span class="string">"But the notation was specified as '%3', which means that the %5 numerical "</span>
|
|
<span class="string">"part should range between 0 and %4."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18">§18</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18_1_4"></a><b>§18.1.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Report a problem because not enough accuracy is available</span> <span class="cwebmacronumber">18.1.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPTooLittleAccuracy</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, you use the notation '%2' to write a constant value. "</span>
|
|
<span class="string">"But to store that, I would need greater accuracy than this kind of "</span>
|
|
<span class="string">"value has - see the Kinds page of the Index for the range it has."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP18_1">§18.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Matching an LP at run-time. </b>The following routine compiles an I6 general parsing routine (GPR) to match
|
|
typed input in the correct notation. It amounts to printing out a version of
|
|
the above routine, but ported to I6, and with the token loop "rolled out"
|
|
so that no <code class="display"><span class="extract">tc</span></code> and <code class="display"><span class="extract">ec</span></code> variables are needed at run-time, and simplified
|
|
by having the numerical overflow detection removed. (It's a little slow to
|
|
perform that check within the VM.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Properly speaking this is not an entire GPR, but only a segment of one,
|
|
and we should compile code which allows execution to reach the end if and only
|
|
if we fail to make a match.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::gpr</span><span class="plain">(</span><span class="identifier">gpr_kit</span><span class="plain"> *</span><span class="identifier">gprk</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">label</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain">, </span><span class="identifier">ec</span><span class="plain">;</span>
|
|
<span class="functiontext">LiteralPatterns::comment_use_of_lp</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">SL</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SL</span><span class="plain">, </span><span class="string">".Succeeded_LP_%d"</span><span class="plain">, </span><span class="identifier">label</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">succeeded_label</span><span class="plain"> = </span><span class="identifier">Produce::reserve_label</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">SL</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">SL</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FL</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">FL</span><span class="plain">, </span><span class="string">".Failed_LP_%d"</span><span class="plain">, </span><span class="identifier">label</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">failed_label</span><span class="plain"> = </span><span class="identifier">Produce::reserve_label</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">FL</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">FL</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain">=0, </span><span class="identifier">ec</span><span class="plain">=0; </span><span class="identifier">tc</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain">; </span><span class="identifier">tc</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lookahead</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tc</span><span class="plain">+1<</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain">) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">+1]</span><span class="element">.lpt_type</span><span class="plain"> == </span><span class="constant">CHARACTER_LPT</span><span class="plain">))</span>
|
|
<span class="identifier">lookahead</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">+1]</span><span class="element">.token_char</span><span class="plain">;</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NEXTWORDSTOPPED_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTDECREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">to_label</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.preamble_optional</span><span class="plain">) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.lpt_type</span><span class="plain"> == </span><span class="constant">ELEMENT_LPT</span><span class="plain">))</span>
|
|
<span class="identifier">to_label</span><span class="plain"> = </span><span class="identifier">failed_label</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LiteralPatterns::at_optional_break_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">ec</span><span class="plain">, </span><span class="identifier">tc</span><span class="plain">))</span>
|
|
<span class="identifier">to_label</span><span class="plain"> = </span><span class="identifier">succeeded_label</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">to_label</span><span class="plain"> = </span><span class="identifier">failed_label</span><span class="plain">;</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) -1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">to_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.lpt_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WORD_LPT</span><span class="plain">: </span><<span class="cwebmacro">Compile I6 code to match a fixed word token within a literal pattern</span> <span class="cwebmacronumber">19.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CHARACTER_LPT</span><span class="plain">: </span><<span class="cwebmacro">Compile I6 code to match a character token within a literal pattern</span> <span class="cwebmacronumber">19.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ELEMENT_LPT</span><span class="plain">: </span><<span class="cwebmacro">Compile I6 code to match an element token within a literal pattern</span> <span class="cwebmacronumber">19.3</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown literal pattern token type"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">Produce::place_label</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">succeeded_label</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">BITWISEOR_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0</span><span class="identifier">x80000000</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">TIMES_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) -1);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">PARSED_NUMBER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Kinds::Scalings::compile_quanta_to_value</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">,</span>
|
|
<span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">PARSED_NUMBER_HL</span><span class="plain">), </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">, </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IFDEBUG_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">GE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">PARSER_TRACE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 3);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">" [parsed value "</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINTNUMBER_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">PARSED_NUMBER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">EXP</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">EXP</span><span class="plain">, </span><span class="string">" by: %W]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EXP</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">EXP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">RETURN_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">GPR_NUMBER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::place_label</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::gpr appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_1"></a><b>§19.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to match a fixed word token within a literal pattern</span> <span class="cwebmacronumber">19.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="string">"%N"</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_wn</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_dword</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_2"></a><b>§19.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to match a character token within a literal pattern</span> <span class="cwebmacronumber">19.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">lower_form</span><span class="plain"> = </span><span class="identifier">Characters::tolower</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_char</span><span class="plain">);</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">upper_form</span><span class="plain"> = </span><span class="identifier">Characters::toupper</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_char</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">upper_form</span><span class="plain"> != </span><span class="identifier">lower_form</span><span class="plain">) { </span><span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">); </span><span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">()); }</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">lower_form</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">upper_form</span><span class="plain"> != </span><span class="identifier">lower_form</span><span class="plain">) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MINUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">upper_form</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">upper_form</span><span class="plain"> != </span><span class="identifier">lower_form</span><span class="plain">) { </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">()); }</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<<span class="cwebmacro">Compile I6 code to exit mid-word parsing if at end of a word</span> <span class="cwebmacronumber">19.2.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_3"></a><b>§19.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to match an element token within a literal pattern</span> <span class="cwebmacronumber">19.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">++]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ec</span><span class="plain"> == 1) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'-'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain">) && (</span><span class="identifier">ec</span><span class="plain"> == 1)) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) -1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Compile I6 code to match a real number here</span> <span class="cwebmacronumber">19.3.1</span>>
|
|
<span class="reserved">else</span>
|
|
<<span class="cwebmacro">Compile I6 code to match an integer here</span> <span class="cwebmacronumber">19.3.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Compile I6 code to exit mid-word parsing if at end of a word</span> <span class="cwebmacronumber">19.2.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_3_1"></a><b>§19.3.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to match a real number here</span> <span class="cwebmacronumber">19.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">March forwards through decimal digits</span> <span class="cwebmacronumber">19.3.1.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NEXTWORDSTOPPED_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MINUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">THEN1__WD_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">March forwards through decimal digits</span> <span class="cwebmacronumber">19.3.1.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NEXTWORDSTOPPED_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'x'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NEXTWORDSTOPPED_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IFELSE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 3);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'1'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'0'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'^'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 3);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 3);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">OR_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'+'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="character">'-'</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">March forwards through decimal digits</span> <span class="cwebmacronumber">19.3.1.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTDECREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">FLOATPARSE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Site::veneer_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">FLOAT_NAN_VSYMB</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19_3">§19.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_3_1_1"></a><b>§19.3.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">March forwards through decimal digits</span> <span class="cwebmacronumber">19.3.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">WHILE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">GE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">DIGITTOVALUE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19_3_1">§19.3.1</a> (three times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_3_2"></a><b>§19.3.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to match an integer here</span> <span class="cwebmacronumber">19.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">WHILE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">GE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">DIGITTOVALUE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">DIGITTOVALUE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Kinds::Scalings::compile_scale_and_add</span><span class="plain">(</span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">, 10, 0, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">, </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_index</span><span class="plain"> > 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">GE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">Kinds::Scalings::compile_scale_and_add</span><span class="plain">(</span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">, </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">, 0, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">, </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">matched_number_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">tot_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::get_integer_multiplier</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">M</span><span class="plain"> > 1) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NEXTWORDSTOPPED_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MINUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">THEN1__WD_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PLUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 2);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">M</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">WHILE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">GT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MODULO_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 10);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">GE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">DIGITTOVALUE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">w_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">TIMES_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">DIGITTOVALUE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 10);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Kinds::Scalings::compile_scale_and_add</span><span class="plain">(</span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">x_s</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">sgn_s</span><span class="plain">,</span>
|
|
<span class="plain">1, 0, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">w_s</span><span class="plain">, </span><span class="identifier">failed_label</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">f_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 10);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19_3">§19.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_2_1"></a><b>§19.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to enter mid-word parsing if not already in it</span> <span class="cwebmacronumber">19.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_addr_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WORDADDRESS_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WORDLENGTH_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19_2">§19.2</a>, <a href="#SP19_3">§19.3</a>, <a href="#SP19_3_1">§19.3.1</a> (three times), <a href="#SP19_3_2">§19.3.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_2_2"></a><b>§19.2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to exit mid-word parsing if at end of a word</span> <span class="cwebmacronumber">19.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">wpos_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">cur_len_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">WN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">gprk</span><span class="plain">-></span><span class="identifier">mid_word_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19_2">§19.2</a>, <a href="#SP19_3">§19.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. Indexing literal patterns for a given kind. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::index_all</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, *</span><span class="identifier">benchmark_lp</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::get_benchmark</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">B</span><span class="plain"> = 1, </span><span class="identifier">scalings_exist</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">benchmark_lp</span><span class="plain">) </span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::get_integer_multiplier</span><span class="plain">(</span><span class="identifier">benchmark_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Scalings::involves_scale_change</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">))</span>
|
|
<span class="identifier">scalings_exist</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Index the list of possible LPs for the kind, not counting equivalents</span> <span class="cwebmacronumber">20.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Index the list of possible LPs for the kind, only counting equivalents</span> <span class="cwebmacronumber">20.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Index the possible names for these notations, as ways of printing them back</span> <span class="cwebmacronumber">20.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::index_all is used in 13/ki (<a href="13-ki.html#SP1_8">§1.8</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_1"></a><b>§20.1. </b>Each entry in this list is, in principle, a list all by itself — of
|
|
alternatives such as "1 tonne" vs "2 tonnes", which aren't different
|
|
enough to be listed separately. Of these exactly one is the "primary"
|
|
alternative.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Index the list of possible LPs for the kind, not counting equivalents</span> <span class="cwebmacronumber">20.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">)</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<i>Written as:</i>"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">scalings_exist</span><span class="plain">) && (</span><span class="identifier">benchmark_lp</span><span class="plain">)) {</span>
|
|
<span class="functiontext">LiteralPatterns::index_lp_possibilities</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2"></a><b>§20.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Index the list of possible LPs for the kind, only counting equivalents</span> <span class="cwebmacronumber">20.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain">)) {</span>
|
|
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<i>With these equivalent units:</i>"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">LiteralPatterns::index_lp_possibilities</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">);</span>
|
|
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_3"></a><b>§20.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Index the possible names for these notations, as ways of printing them back</span> <span class="cwebmacronumber">20.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">, </span><span class="reserved">literal_pattern_name</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">)) {</span>
|
|
<span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn2</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lpn2</span><span class="plain"> = </span><span class="identifier">lpn</span><span class="plain">; </span><span class="identifier">lpn2</span><span class="plain">; </span><span class="identifier">lpn2</span><span class="plain"> = </span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> == </span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>can_use_this_lp</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string"><i>Can be printed back:</i>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">f</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">);</span>
|
|
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">NextLPN</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">NextLPN</span><span class="plain">: ;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. </b>And here we list of alternatives followed by the relationship this notation
|
|
has to the benchmark, e.g., "where 1 tonne = 1000 kg".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::index_lp_possibilities</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">benchmark_lp</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&nbsp;&nbsp;&nbsp;&nbsp;"</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::index_lp_possibility</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" <i>where</i> "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Scalings::compare</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">) < 0) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" <i>where</i> "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Scalings::compare</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">) > 0) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" <i>where</i> "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::index_lp_possibilities is used in <a href="#SP20_1">§20.1</a>, <a href="#SP20_2">§20.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b>This is where the list of alternatives, "1 tonne" followed by "2 tonnes",
|
|
say, is produced:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::index_lp_possibility</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">benchmark_lp</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> == </span><span class="identifier">benchmark_lp</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<b>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain">)</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">Kinds::Scalings::enlarge</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, 2));</span>
|
|
<span class="reserved">else</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> == </span><span class="identifier">benchmark_lp</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</b>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_alternative_lp</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" <i>or</i> "</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::index_lp_possibility</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_alternative_lp</span><span class="plain">, </span><span class="identifier">benchmark_lp</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::index_lp_possibility is used in <a href="#SP21">§21</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. Printing values in an LP's notation to the index at compile-time. </b>This front-end routine chooses the most appropriate notation to use when
|
|
indexing a given value. For instance, a mass of 1000000 is best expressed
|
|
as "1 tonne", not "1000000 grams".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::index_value</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp_list</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp_possibility</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">v</span><span class="plain"> == 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain">) {</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_value_specific</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp_possibility</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">Kinds::Scalings::quantum</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">) != </span><span class="identifier">k</span><span class="plain">)) {</span>
|
|
<span class="identifier">lp_possibility</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="identifier">k</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::quantum</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">v</span><span class="plain"> >= </span><span class="identifier">Kinds::Scalings::quantum</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">)) {</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_value_specific</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp_possibility</span><span class="plain">) </span><span class="functiontext">LiteralPatterns::lp_index_value_specific</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp_possibility</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lp_index_value_specific</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp_list</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::index_value is used in 13/ki (<a href="13-ki.html#SP5_1_1">§5.1.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24"></a><b>§24. </b>Here we index the benchmark value. Pursuing our example of mass, if the
|
|
benchmark is 1 kilogram, then the following indexes the value 1000 in
|
|
kilograms, resulting in "1 kg". (This will always effectively look like
|
|
"1 something", whatever the something is.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::index_benchmark_value</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="identifier">LITERAL_FORMS_LOOP</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain">) {</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"1"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::index_benchmark_value appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. </b>We are rather formal when printing values to the index, so we choose not
|
|
to make use of optional truncation.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lp_index_quantum_value</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">scaling_transformation</span><span class="plain"> </span><span class="identifier">sc</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">double</span><span class="plain"> </span><span class="identifier">real_v</span><span class="plain"> = 0.0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">))</span>
|
|
<span class="identifier">real_v</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::real_quantum</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">v</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::quantum</span><span class="plain">(</span><span class="identifier">sc</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_value_specific_inner</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">real_v</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lp_index_value_specific</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="reserved">double</span><span class="plain"> </span><span class="identifier">alt_value</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">alt_value</span><span class="plain">;</span>
|
|
<span class="reserved">double</span><span class="plain"> </span><span class="identifier">real_v</span><span class="plain"> = </span><span class="identifier">alt_value</span><span class="plain">;</span>
|
|
<span class="functiontext">LiteralPatterns::lp_index_value_specific_inner</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">real_v</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::lp_index_value_specific_inner</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">, </span><span class="reserved">double</span><span class="plain"> </span><span class="identifier">real_v</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain">, </span><span class="identifier">ec</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain">=0, </span><span class="identifier">ec</span><span class="plain">=0; </span><span class="identifier">tc</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain">; </span><span class="identifier">tc</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tc</span><span class="plain">>0) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.new_word_at</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.lpt_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WORD_LPT</span><span class="plain">: </span><<span class="cwebmacro">Index a fixed word token within a literal pattern</span> <span class="cwebmacronumber">25.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CHARACTER_LPT</span><span class="plain">: </span><<span class="cwebmacro">Index a character token within a literal pattern</span> <span class="cwebmacronumber">25.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ELEMENT_LPT</span><span class="plain">: </span><<span class="cwebmacro">Index an element token within a literal pattern</span> <span class="cwebmacronumber">25.3</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown literal pattern token type"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lp_index_quantum_value is used in <a href="#SP21">§21</a>, <a href="#SP22">§22</a>, <a href="#SP24">§24</a>.</p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lp_index_value_specific is used in <a href="#SP23">§23</a>.</p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::lp_index_value_specific_inner appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25_1"></a><b>§25.1. </b>We parse in a case-insensitive way, but print back case-sensitively —
|
|
note that the following uses the raw text of the word.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Index a fixed word token within a literal pattern</span> <span class="cwebmacronumber">25.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain"> > 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%<N"</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_wn</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP25">§25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25_2"></a><b>§25.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Index a character token within a literal pattern</span> <span class="cwebmacronumber">25.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">HTMLFiles::char_out</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_char</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP25">§25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25_3"></a><b>§25.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Index an element token within a literal pattern</span> <span class="cwebmacronumber">25.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">)) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%g"</span><span class="plain">, </span><span class="identifier">Kinds::Scalings::real_value_to_quanta</span><span class="plain">(</span><span class="identifier">real_v</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">));</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">remainder</span><span class="plain">;</span>
|
|
<span class="identifier">Kinds::Scalings::value_to_quanta</span><span class="plain">(</span><span class="identifier">v</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, &</span><span class="identifier">v</span><span class="plain">, &</span><span class="identifier">remainder</span><span class="plain">);</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ec</span><span class="plain"> == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">v</span><span class="plain">/(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">prototype</span><span class="plain"> = </span><span class="string">"%d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.new_word_at</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>without_leading_zeros</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">prototype</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::leading_zero_prototype</span><span class="plain">(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="identifier">prototype</span><span class="plain">, (</span><span class="identifier">v</span><span class="plain">/(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">)) % (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ec</span><span class="plain"> == 0) </span><<span class="cwebmacro">Index the fractional part of the value</span> <span class="cwebmacronumber">25.3.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ec</span><span class="plain">++;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP25">§25</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25_3_1"></a><b>§25.3.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Index the fractional part of the value</span> <span class="cwebmacronumber">25.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ranger</span><span class="plain"> = 1, </span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::get_integer_multiplier</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">M</span><span class="plain"> > </span><span class="identifier">ranger</span><span class="plain">) </span><span class="identifier">ranger</span><span class="plain"> = </span><span class="identifier">ranger</span><span class="plain">*10;</span>
|
|
<span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">remainder</span><span class="plain">*(</span><span class="identifier">ranger</span><span class="plain">/</span><span class="identifier">M</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">remainder</span><span class="plain"> > 0) && ((</span><span class="identifier">remainder</span><span class="plain"> % 10) == 0)) {</span>
|
|
<span class="identifier">ranger</span><span class="plain"> = </span><span class="identifier">ranger</span><span class="plain">/10; </span><span class="identifier">remainder</span><span class="plain"> = </span><span class="identifier">remainder</span><span class="plain">/10;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">remainder</span><span class="plain"> > 0) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="functiontext">LiteralPatterns::leading_zero_prototype</span><span class="plain">(</span><span class="identifier">ranger</span><span class="plain">), </span><span class="identifier">remainder</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP25_3">§25.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26"></a><b>§26. </b>Please don't mention the words "logarithm" or "shift". It works fine.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::leading_zero_prototype</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 1000000000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%010d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 100000000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%09d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 10000000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%08d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 1000000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%07d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 100000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%06d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 10000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%05d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 1000) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%04d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 100) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%03d"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">range</span><span class="plain"> > 10) </span><span class="reserved">return</span><span class="plain"> </span><span class="string">"%02d"</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="string">"%d"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::leading_zero_prototype is used in <a href="#SP25_3">§25.3</a>, <a href="#SP25_3_1">§25.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27"></a><b>§27. Printing the I6 variable |value| out in an LP's notation at run-time. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::printing_routine</span><span class="plain">(</span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp_list</span><span class="plain">) {</span>
|
|
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">value_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"value"</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">which_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"which"</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rem_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_internal_local_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"rem"</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_internal_local_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"S"</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">, </span><span class="reserved">literal_pattern_name</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">)) {</span>
|
|
<span class="identifier">k</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>marked_for_printing</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn2</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lpn2</span><span class="plain"> = </span><span class="identifier">lpn</span><span class="plain">; </span><span class="identifier">lpn2</span><span class="plain">; </span><span class="identifier">lpn2</span><span class="plain"> = </span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> == </span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>can_use_this_lp</span><span class="plain">) {</span>
|
|
<span class="identifier">k</span><span class="plain">++; </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>marked_for_printing</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> > 0) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="string">"The named notation: %W"</span><span class="plain">, </span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">);</span>
|
|
<span class="functiontext">Emit::code_comment</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">which_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpn</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain"> + 1));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<<span class="cwebmacro">Compile code to jump to the correct printing pattern</span> <span class="cwebmacronumber">27.2</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<<span class="cwebmacro">Choose which patterns are eligible for printing</span> <span class="cwebmacronumber">27.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Compile code to jump to the correct printing pattern</span> <span class="cwebmacronumber">27.2</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Print according to this particular literal pattern</span> <span class="cwebmacronumber">27.3</span>><span class="plain">;</span>
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::printing_routine is used in 13/rsfk (<a href="13-rsfk.html#SP24_2">§24.2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_1"></a><b>§27.1. </b>This was at one time a more complicated criterion, which masked bugs in
|
|
the sorting measure.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Choose which patterns are eligible for printing</span> <span class="cwebmacronumber">27.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">=0, </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">eligible</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">eligible</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eligible</span><span class="plain">) </span><span class="identifier">k</span><span class="plain">++;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>marked_for_printing</span><span class="plain"> = </span><span class="identifier">eligible</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27">§27</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_2"></a><b>§27.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile code to jump to the correct printing pattern</span> <span class="cwebmacronumber">27.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lpb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>marked_for_printing</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain">)</span>
|
|
<span class="identifier">lpb</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lpb</span><span class="plain">) && (</span><span class="identifier">lpb</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">LiteralPatterns::jump_label</span><span class="plain">(</span><span class="identifier">lpb</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">last_lp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">last_primary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">last_singular</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">last_plural</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp_list</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>next_for_this_kind</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>marked_for_printing</span><span class="plain">) {</span>
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">GE_BIP</span><span class="plain">; </span><span class="identifier">last_lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">) { </span><span class="identifier">last_primary</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain">) { </span><span class="identifier">last_singular</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">EQ_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain">) { </span><span class="identifier">last_plural</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">; </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">GT_BIP</span><span class="plain">; }</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Kinds::Scalings::compile_threshold_test</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">, </span><span class="identifier">op</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">LiteralPatterns::jump_label</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_primary</span><span class="plain">) </span><span class="identifier">last_lp</span><span class="plain"> = </span><span class="identifier">last_primary</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_lp</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">last_lp</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">last_plural</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Kinds::Scalings::compare</span><span class="plain">(</span><span class="identifier">last_plural</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">last_lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">) == 0)) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">LiteralPatterns::jump_label</span><span class="plain">(</span><span class="identifier">last_plural</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">JUMP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::lab</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">LiteralPatterns::jump_label</span><span class="plain">(</span><span class="identifier">last_lp</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27">§27</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_3"></a><b>§27.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Print according to this particular literal pattern</span> <span class="cwebmacronumber">27.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
|
|
<span class="functiontext">LiteralPatterns::comment_use_of_lp</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::place_label</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">LiteralPatterns::jump_label</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">));</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ec</span><span class="plain">=0, </span><span class="identifier">oc</span><span class="plain">=0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain">=0; </span><span class="identifier">tc</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain">; </span><span class="identifier">tc</span><span class="plain">++) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.preamble_optional</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Truncate the printed form here if subsequent numerical parts are zero</span> <span class="cwebmacronumber">27.3.4</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tc</span><span class="plain">>0) && (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.new_word_at</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.lpt_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WORD_LPT</span><span class="plain">: </span><<span class="cwebmacro">Compile I6 code to print a fixed word token within a literal pattern</span> <span class="cwebmacronumber">27.3.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CHARACTER_LPT</span><span class="plain">: </span><<span class="cwebmacro">Compile I6 code to print a character token within a literal pattern</span> <span class="cwebmacronumber">27.3.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ELEMENT_LPT</span><span class="plain">: </span><<span class="cwebmacro">Compile I6 code to print an element token within a literal pattern</span> <span class="cwebmacronumber">27.3.3</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown literal pattern token type"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27">§27</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_3_1"></a><b>§27.3.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to print a fixed word token within a literal pattern</span> <span class="cwebmacronumber">27.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="functiontext">CompiledText::from_wide_string</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_wn</span><span class="plain">), </span><span class="constant">CT_RAW</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27_3">§27.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_3_2"></a><b>§27.3.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to print a character token within a literal pattern</span> <span class="cwebmacronumber">27.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tiny_string</span><span class="plain">);</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">tiny_string</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.token_char</span><span class="plain">);</span>
|
|
<span class="functiontext">CompiledText::from_stream</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">tiny_string</span><span class="plain">, </span><span class="constant">CT_RAW</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tiny_string</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27_3">§27.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_3_3"></a><b>§27.3.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compile I6 code to print an element token within a literal pattern</span> <span class="cwebmacronumber">27.3.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_optional</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Truncate the printed form here if subsequent numerical parts are zero</span> <span class="cwebmacronumber">27.3.4</span>><span class="plain">;</span>
|
|
<span class="identifier">oc</span><span class="plain"> = </span><span class="identifier">ec</span><span class="plain"> + 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain"> == 1) {</span>
|
|
<span class="identifier">Kinds::Scalings::compile_print_in_quanta</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">, </span><span class="identifier">rem_s</span><span class="plain">, </span><span class="identifier">S_s</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ec</span><span class="plain"> == 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain">) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"-"</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINTNUMBER_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain">) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MINUS_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">]</span><span class="element">.new_word_at</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>without_leading_zeros</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pow</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">pow</span><span class="plain"> = 1000000000; </span><span class="identifier">pow</span><span class="plain">>1; </span><span class="identifier">pow</span><span class="plain"> = </span><span class="identifier">pow</span><span class="plain">/10)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain"> > </span><span class="identifier">pow</span><span class="plain">) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">LT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MODULO_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">pow</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"0"</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINTNUMBER_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MODULO_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ec</span><span class="plain">++;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27_3">§27.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_3_4"></a><b>§27.3.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Truncate the printed form here if subsequent numerical parts are zero</span> <span class="cwebmacronumber">27.3.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oc</span><span class="plain"> == </span><span class="identifier">ec</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ec</span><span class="plain"> == 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.element_multiplier</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IF_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">MODULO_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DIVIDE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">value_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.element_multiplier</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">]</span><span class="element">.element_range</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">oc</span><span class="plain"> = </span><span class="identifier">ec</span><span class="plain"> + 1;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27_3">§27.3</a>, <a href="#SP27_3_3">§27.3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP28"></a><b>§28. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::jump_label</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>jump_label</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="string">".Use_LP_%d"</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">);</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>jump_label</span><span class="plain"> = </span><span class="identifier">Produce::reserve_label</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>jump_label</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::jump_label is used in <a href="#SP27_2">§27.2</a>, <a href="#SP27_3">§27.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP29"></a><b>§29. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::comment_use_of_lp</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="string">"%W, "</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>prototype_text</span><span class="plain">);</span>
|
|
<span class="identifier">Kinds::Scalings::describe</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">);</span>
|
|
<span class="functiontext">Emit::code_comment</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::comment_use_of_lp is used in <a href="#SP19">§19</a>, <a href="#SP27_3">§27.3</a>, <a href="#SP30">§30</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP30"></a><b>§30. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::log_lp_debugging_data</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="string">"%s %s LP%d: primary %d, s/p: %d/%d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
|
|
<span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain">)?</span><span class="string">"***"</span><span class="plain">:</span><span class="string">"---"</span><span class="plain">,</span>
|
|
<span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain">)?</span><span class="string">"equiv"</span><span class="plain">:</span><span class="string">"new "</span><span class="plain">,</span>
|
|
<span class="identifier">lp</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain">,</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain">);</span>
|
|
<span class="functiontext">Emit::code_comment</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext">LiteralPatterns::comment_use_of_lp</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::log_lp_debugging_data appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP31"></a><b>§31. Creating new literal patterns. </b>We create new LPs during traverse 1 of the parse tree. This imposes two
|
|
timing constraints:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) The specification sentence must come after the sentence creating the
|
|
kind of value being specified; but
|
|
</li><li>(b) It must come before any sentences using constants written in this
|
|
notation.
|
|
</li></ul>
|
|
<p class="inwebparagraph">In practice both constraints seem to be accepted by users as reasonable,
|
|
and this causes no trouble.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::specifies_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[0]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">: </span> <span class="comment">"10'23 specifies a running time."</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">nounphrase</span><span class="plain">-</span><span class="identifier">alternative</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">>(</span><span class="identifier">SW</span><span class="plain">)) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">nounphrase</span><span class="plain">>(</span><span class="identifier">OW</span><span class="plain">)) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">O</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="identifier">V</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">; </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">O</span><span class="plain">;</span>
|
|
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="constant">verb_id_ANNOT</span><span class="plain">, </span><span class="constant">SPECIAL_MEANING_VB</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TRAVERSE1_SMFT</span><span class="plain">:</span>
|
|
<span class="functiontext">LiteralPatterns::new_literal_specification_list</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::new_literal_specification</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">pn</span><span class="plain">) {</span>
|
|
<span class="functiontext">LiteralPatterns::new_literal_specification_list</span><span class="plain">(</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::specifies_SMF is used in 6/nv (<a href="6-nv.html#SP16">§16</a>).</p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::new_literal_specification appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP32"></a><b>§32. </b>One can define LPs with a list of alternatives, of which the first is the
|
|
"primary alternative" and said to be the "owner" of the rest. For instance:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>1 tonne (in metric units, in tonnes, singular) or 2 tonnes (in metric units,</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">in tonnes, plural) specifies a mass scaled up by 1000.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Here we call <code class="display"><span class="extract">LiteralPatterns::new_literal_specification_list</span></code> on "1 tonne" with no owner,
|
|
and then on "2 tonnes" with the "1 tonne" LP as its owner.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::new_literal_specification_list</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">,</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp_main</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">AND_NT</span><span class="plain">) {</span>
|
|
<span class="identifier">lp_main</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::new_literal_specification_list</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">lp_main</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::new_literal_specification_list</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">lp_main</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::new_literal_specification_inner</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">lp_main</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::new_literal_specification_list is used in <a href="#SP31">§31</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP33"></a><b>§33. </b>The grammars for the specify sentence are quite complicated, but aren't used
|
|
recursively. So it's more convenient to have them set global variables than to
|
|
form a big parse subtree and extract the data from that; these are what they
|
|
set.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">double</span><span class="plain"> </span><span class="identifier">LP_real_offset</span><span class="plain"> = 0.0, </span><span class="identifier">LP_real_equivalent</span><span class="plain"> = 0.0, </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = 0.0;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">LP_scaling</span><span class="plain">, </span><span class="identifier">LP_scaling_amount</span><span class="plain">, </span><span class="identifier">LP_to_real</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">LP_equivalent</span><span class="plain">; </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">LP_equivalent_value</span><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">LP_offset_value</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">LP_left_kind</span><span class="plain">, *</span><span class="identifier">LP_right_kind</span><span class="plain">; </span> <span class="comment">used only for dimensional rules</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">LP_kind_specified</span><span class="plain">; </span> <span class="comment">what kind this sentence specifies</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34"></a><b>§34. </b>So this is where we handle a typical specification:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::new_literal_specification_inner</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">,</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scaled</span><span class="plain"> = 1, </span><span class="identifier">scaled_dir</span><span class="plain"> = </span><span class="identifier">LP_SCALED_UP</span><span class="plain">, </span><span class="identifier">offset</span><span class="plain"> = 0, </span><span class="identifier">integer_scaling</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">part_np_list</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">what we will create, if all goes well</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">notation_options</span><span class="plain"> = 0; </span><span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">notation_groups</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">SPW</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
|
|
<<span class="cwebmacro">Parse the subject noun phrase of the specifies sentence</span> <span class="cwebmacronumber">34.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Parse the object noun phrase of the specifies sentence</span> <span class="cwebmacronumber">34.3</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) </span><span class="identifier">integer_scaling</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">LP_to_real</span><span class="plain">) && (</span><span class="identifier">integer_scaling</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Issue problem message warning that real arithmetic is needed</span> <span class="cwebmacronumber">34.6</span>><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Deal with the case where a dimensionality rule is being specified</span> <span class="cwebmacronumber">34.7</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Check that the new notation does not overlap with that of any existing LP</span> <span class="cwebmacronumber">34.5</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Check that the kind is acceptable as the owner of a LP</span> <span class="cwebmacronumber">34.8</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Check that any other value mentioned as an equivalent or scaled equivalent has the right kind</span> <span class="cwebmacronumber">34.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Create the new literal pattern structure</span> <span class="cwebmacronumber">34.9</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Break down the specification text into tokens and elements</span> <span class="cwebmacronumber">34.10</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Adopt real arithmetic if this is called for</span> <span class="cwebmacronumber">34.11</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Calculate the multipliers for packing the elements into a single integer</span> <span class="cwebmacronumber">34.12</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LiteralPatterns::list_of_literal_forms</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>benchmark</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="functiontext">LiteralPatterns::add_literal_pattern</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">part_np_list</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Work through parts text to assign names to the individual elements</span> <span class="cwebmacronumber">34.13</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Check that any notes to do with optional elements are mutually compatible</span> <span class="cwebmacronumber">34.14</span>><span class="plain">;</span>
|
|
<span class="functiontext">LiteralPatterns::define_packing_phrases</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">owner</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Add this new alternative to the list belonging to our owner</span> <span class="cwebmacronumber">34.1</span>><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::new_literal_specification_inner is used in <a href="#SP32">§32</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_1"></a><b>§34.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Add this new alternative to the list belonging to our owner</span> <span class="cwebmacronumber">34.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">alt</span><span class="plain"> = </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">alt</span><span class="plain">) && (</span><span class="identifier">alt</span><span class="plain">-</span><span class="element">>next_alternative_lp</span><span class="plain">)) </span><span class="identifier">alt</span><span class="plain"> = </span><span class="identifier">alt</span><span class="plain">-</span><span class="element">>next_alternative_lp</span><span class="plain">;</span>
|
|
<span class="identifier">alt</span><span class="plain">-</span><span class="element">>next_alternative_lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_2"></a><b>§34.2. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">PARTS_LPC</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">SCALING_LPC</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">OFFSET_LPC</span><span class="plain"> 3</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">EQUIVALENT_LPC</span><span class="plain"> 4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">OPTIONAL_LSO</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">PREAMBLE_OPTIONAL_LSO</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">WITHOUT_LEADING_ZEROS_LSO</span><span class="plain"> 4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">SINGULAR_LPN</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">PLURAL_LPN</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">IN_LPN</span><span class="plain"> 4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">TIMES_LPN</span><span class="plain"> 8</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ABANDON_LPN</span><span class="plain"> 16</span>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Parse the subject noun phrase of the specifies sentence</span> <span class="cwebmacronumber">34.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_UP</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = 1; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = 1.0;</span>
|
|
<span class="identifier">LP_real_equivalent</span><span class="plain"> = 0.0; </span><span class="identifier">LP_equivalent_value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LP_real_offset</span><span class="plain"> = 0.0; </span><span class="identifier">LP_offset_value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LP_to_real</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">specifies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">>(</span><span class="identifier">SPW</span><span class="plain">);</span>
|
|
<span class="identifier">SPW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">specifies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">>, 1);</span>
|
|
<span class="identifier">notation_options</span><span class="plain"> = <<</span><span class="identifier">r</span><span class="plain">>>;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notation_options</span><span class="plain"> & </span><span class="constant">ABANDON_LPN</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="identifier">notation_groups</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notation_options</span><span class="plain">) </span><span class="identifier">notation_groups</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35"></a><b>§35. </b>The following grammar is used to parse the new literal patterns defined
|
|
in a "specifies" sentence.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>1 tonne (in metric units, in tonnes, singular) or 2 tonnes (in metric units, in tonnes, plural) specifies a mass scaled up by 1000.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">The subject nounphrase has already been converted into a list of alternatives,
|
|
divided by "or", and the following grammar removes the optional list of
|
|
groups to which the notation begins. So, for example, <specifies-sentence-subject>
|
|
is used on "1 tonne (in metric units, in tonnes, singular)". "In metric
|
|
units" and "in tonnes" are names for groups of literal patterns; note
|
|
that in English, these names always begin with "in".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">However, note that a "specifies" sentence can also be used for a quite
|
|
different purpose:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A length times a length specifies an area.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">This gives dimensional instructions about kinds, and doesn't have anything to
|
|
do with literals and their notation. It's a slightly unhappy ambiguity, but
|
|
the potential for confusion is very low. Nobody who defines a literal pattern
|
|
with the word "times" in can expect good results anyway, given that "times"
|
|
will usually be interpreted as multiplication when Inform eventually parses
|
|
such a literal. Still, to minimise clashes, we respond to "times" here only
|
|
when there is meaningful text on either side of it.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Formally, the subject noun phrase of a "specifies" sentence must be a list
|
|
of alternatives each of which matches the following:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">specifies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( {<</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">>} ) | ==> </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">> </span><span class="identifier">times</span><span class="plain"> <</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">> | ==> </span><span class="constant">TIMES_LPN</span><span class="plain">; </span><span class="identifier">LP_left_kind</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">LP_right_kind</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="plain"><</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">> </span><span class="identifier">times</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">> | ==> </span><<span class="cwebmacro">Issue PM_MultiplyingNonKOVs problem</span> <span class="cwebmacronumber">35.2</span>>
|
|
<span class="plain">... ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[1] | </span><span class="identifier">R</span><span class="plain">[2]; </span><<span class="cwebmacro">Compose LPG lists</span> <span class="cwebmacronumber">35.1</span>><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">> ==> </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="plain">, </span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
<span class="plain">,/</span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ==> </span><span class="identifier">R</span><span class="plain">[1]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">> ::=</span>
|
|
<span class="identifier">singular</span><span class="plain"> | ==> </span><span class="constant">SINGULAR_LPN</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">plural</span><span class="plain"> | ==> </span><span class="constant">PLURAL_LPN</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> | ==> </span><span class="constant">IN_LPN</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::new_lpn</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">RP</span><span class="plain">[1]);</span>
|
|
<span class="identifier">in</span><span class="plain"> ...... | ==> </span><span class="constant">IN_LPN</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::new_lpn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">...... ==> </span><<span class="cwebmacro">Issue PM_BadLPNameOption problem</span> <span class="cwebmacronumber">35.3</span>>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35_1"></a><b>§35.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compose LPG lists</span> <span class="cwebmacronumber">35.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RP</span><span class="plain">[1] == </span><span class="identifier">NULL</span><span class="plain">) *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RP</span><span class="plain">[2]) ((</span><span class="reserved">literal_pattern_name</span><span class="plain"> *) </span><span class="identifier">RP</span><span class="plain">[1])-</span><span class="element">>next_with_rp</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP35">§35</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35_2"></a><b>§35.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_MultiplyingNonKOVs problem</span> <span class="cwebmacronumber">35.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">ABANDON_LPN</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">preform_lookahead_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_MultiplyingNonKOVs</span><span class="plain">),</span>
|
|
<span class="string">"only kinds of value can be multiplied here"</span><span class="plain">,</span>
|
|
<span class="string">"and only in a sentence like 'A length times a length specifies an area.'"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP35">§35</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35_3"></a><b>§35.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_BadLPNameOption problem</span> <span class="cwebmacronumber">35.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">ABANDON_LPN</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">preform_lookahead_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadLPNameOption</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the specification %1, I was expecting that '%2' would be an optional "</span>
|
|
<span class="string">"note about one of the notations: it should have been one of 'singular', "</span>
|
|
<span class="string">"'plural' or 'in ...'."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP35">§35</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_3"></a><b>§34.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Parse the object noun phrase of the specifies sentence</span> <span class="cwebmacronumber">34.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LP_offset_value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">specifies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">));</span>
|
|
<span class="reserved">switch</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>>) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PARTS_LPC</span><span class="plain">: </span><span class="identifier">part_np_list</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SCALING_LPC</span><span class="plain">: </span><span class="identifier">scaled</span><span class="plain"> = </span><span class="identifier">LP_scaling_amount</span><span class="plain">; </span><span class="identifier">scaled_dir</span><span class="plain"> = </span><span class="identifier">LP_scaling</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">K</span><span class="plain"> = </span><span class="identifier">LP_kind_specified</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP36"></a><b>§36. </b>The object noun phrase of a "specifies" sentence is required to match
|
|
the following grammar. Note that the tails are mutually exclusive; you
|
|
can't set both scaling and an equivalent, for instance.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">specifies</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">kind</span><span class="plain">-</span><span class="identifier">specified</span><span class="plain">> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">specification</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[2]; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]</span>
|
|
<span class="plain"><</span><span class="identifier">kind</span><span class="plain">-</span><span class="identifier">specified</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">NULL</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">kind</span><span class="plain">-</span><span class="identifier">specified</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">-</span><span class="identifier">articled</span><span class="plain">> | ==> 0; </span><span class="identifier">LP_kind_specified</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain">... ==> </span><<span class="cwebmacro">Issue PM_LPNotKOV problem</span> <span class="cwebmacronumber">36.1</span>>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">specification</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="identifier">with</span><span class="plain"> </span><span class="identifier">parts</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> </span><span class="constant">PARTS_LPC</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">scaling</span><span class="plain">-</span><span class="identifier">instruction</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span>
|
|
<span class="plain"><</span><span class="identifier">scaling</span><span class="plain">-</span><span class="identifier">instruction</span><span class="plain">> </span><span class="identifier">offset</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_real_offset</span><span class="plain"> = </span><span class="identifier">latest_constructed_real</span><span class="plain">; </span><span class="identifier">LP_offset_value</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="identifier">offset</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">> | ==> </span><span class="constant">OFFSET_LPC</span><span class="plain">; </span><span class="identifier">LP_real_offset</span><span class="plain"> = </span><span class="identifier">latest_constructed_real</span><span class="plain">; </span><span class="identifier">LP_offset_value</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">equivalent</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">> ==> </span><span class="constant">EQUIVALENT_LPC</span><span class="plain">; </span><span class="identifier">LP_real_equivalent</span><span class="plain"> = </span><span class="identifier">latest_constructed_real</span><span class="plain">; </span><span class="identifier">LP_equivalent_value</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">scaling</span><span class="plain">-</span><span class="identifier">instruction</span><span class="plain">> ::=</span>
|
|
<span class="identifier">scaled</span><span class="plain"> </span><span class="identifier">up</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> <</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_UP</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = (</span><span class="reserved">double</span><span class="plain">) </span><span class="identifier">LP_scaling_amount</span><span class="plain">;</span>
|
|
<span class="identifier">scaled</span><span class="plain"> </span><span class="identifier">up</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">real</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_UP</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = 1; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = </span><span class="identifier">latest_constructed_real</span><span class="plain">; </span><span class="identifier">LP_to_real</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">scaled</span><span class="plain"> </span><span class="identifier">down</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> <</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_DOWN</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = (</span><span class="reserved">double</span><span class="plain">) </span><span class="identifier">LP_scaling_amount</span><span class="plain">;</span>
|
|
<span class="identifier">scaled</span><span class="plain"> </span><span class="identifier">down</span><span class="plain"> </span><span class="identifier">by</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">real</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_DOWN</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = 1; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = </span><span class="identifier">latest_constructed_real</span><span class="plain">; </span><span class="identifier">LP_to_real</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">scaled</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> <</span><span class="identifier">cardinal</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">> | ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_AT</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = (</span><span class="reserved">double</span><span class="plain">) </span><span class="identifier">LP_scaling_amount</span><span class="plain">;</span>
|
|
<span class="identifier">scaled</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">real</span><span class="plain">-</span><span class="identifier">number</span><span class="plain">> ==> </span><span class="constant">SCALING_LPC</span><span class="plain">; </span><span class="identifier">LP_scaling</span><span class="plain"> = </span><span class="identifier">LP_SCALED_AT</span><span class="plain">; </span><span class="identifier">LP_scaling_amount</span><span class="plain"> = 1; </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = </span><span class="identifier">latest_constructed_real</span><span class="plain">; </span><span class="identifier">LP_to_real</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP36_1"></a><b>§36.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_LPNotKOV problem</span> <span class="cwebmacronumber">36.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">preform_lookahead_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPNotKOV</span><span class="plain">),</span>
|
|
<span class="string">"you can only specify ways to write kinds of value"</span><span class="plain">,</span>
|
|
<span class="string">"as created with sentences like 'A weight is a kind of value.'"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP36">§36</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP37"></a><b>§37. </b>Of the optional tails, the only tricky one is the part list, which has the
|
|
following rather extensive grammar. This handles text like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>dollars and cents (optional, preamble optional)</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">The text is a list of part-names, each of which can optionally be followed
|
|
by a bracketed list of up to three options in any order.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">> , </span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RP</span><span class="plain">[1]) ((</span><span class="identifier">parse_node</span><span class="plain"> *) </span><span class="identifier">RP</span><span class="plain">[1])-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">> , <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RP</span><span class="plain">[1]) ((</span><span class="identifier">parse_node</span><span class="plain"> *) </span><span class="identifier">RP</span><span class="plain">[1])-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">> </span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RP</span><span class="plain">[1]) ((</span><span class="identifier">parse_node</span><span class="plain"> *) </span><span class="identifier">RP</span><span class="plain">[1])-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">np</span><span class="plain">-</span><span class="identifier">balanced</span><span class="plain">> ( <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ) | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RP</span><span class="plain">[1]) </span><span class="identifier">ParseTree::annotate_int</span><span class="plain">(*</span><span class="identifier">XP</span><span class="plain">, </span><span class="constant">lpe_options_ANNOT</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">[2]);</span>
|
|
<span class="plain"><</span><span class="identifier">np</span><span class="plain">-</span><span class="identifier">balanced</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[1] | </span><span class="identifier">R</span><span class="plain">[2]</span>
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">> ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="plain">, </span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
<span class="plain">,/</span><span class="identifier">and</span><span class="plain"> <</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ==> </span><span class="identifier">R</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">part</span><span class="plain">-</span><span class="identifier">option</span><span class="plain">> ::=</span>
|
|
<span class="identifier">optional</span><span class="plain"> | ==> </span><span class="constant">OPTIONAL_LSO</span>
|
|
<span class="identifier">preamble</span><span class="plain"> </span><span class="identifier">optional</span><span class="plain"> | ==> </span><span class="constant">PREAMBLE_OPTIONAL_LSO</span>
|
|
<span class="identifier">without</span><span class="plain"> </span><span class="identifier">leading</span><span class="plain"> </span><span class="identifier">zeros</span><span class="plain"> | ==> </span><span class="constant">WITHOUT_LEADING_ZEROS_LSO</span>
|
|
<span class="plain">...... ==> </span><<span class="cwebmacro">Issue PM_BadLPPartOption problem</span> <span class="cwebmacronumber">37.1</span>>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP37_1"></a><b>§37.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_BadLPPartOption problem</span> <span class="cwebmacronumber">37.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">preform_lookahead_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadLPPartOption</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the specification %1, I was expecting that '%2' would be an optional "</span>
|
|
<span class="string">"note about one of the parts: it should have been one of 'optional', "</span>
|
|
<span class="string">"'preamble optional' or 'without leading zeros'."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP37">§37</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_4"></a><b>§34.4. </b>That's it for syntax: now back to semantics.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check that any other value mentioned as an equivalent or scaled equivalent has the right kind</span> <span class="cwebmacronumber">34.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LP_equivalent_value</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">LP_equivalent_value</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)) {</span>
|
|
<span class="identifier">scaled_dir</span><span class="plain"> = </span><span class="identifier">LP_SCALED_UP</span><span class="plain">; </span><span class="identifier">scaled</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_encoded_notation</span><span class="plain">(</span><span class="identifier">LP_equivalent_value</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem_with_note</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadLPEquivalent</span><span class="plain">),</span>
|
|
<span class="string">"the equivalent value needs to be a constant of the same kind "</span>
|
|
<span class="string">"of value as you are specifying"</span><span class="plain">,</span>
|
|
<span class="string">"and this seems not to be."</span><span class="plain">,</span>
|
|
<span class="string">"Note that you can only use notations specified in sentences "</span>
|
|
<span class="string">"before the current one."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LP_offset_value</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">LP_offset_value</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">)) {</span>
|
|
<span class="identifier">offset</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_encoded_notation</span><span class="plain">(</span><span class="identifier">LP_offset_value</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem_with_note</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadLPOffset</span><span class="plain">),</span>
|
|
<span class="string">"the offset value needs to be a constant of the same kind "</span>
|
|
<span class="string">"of value as you are specifying"</span><span class="plain">,</span>
|
|
<span class="string">"and this seems not to be."</span><span class="plain">,</span>
|
|
<span class="string">"Note that you can only use notations specified in sentences "</span>
|
|
<span class="string">"before the current one."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_5"></a><b>§34.5. </b>We parse the specification text as if it were a constant value, hoping
|
|
for the result <code class="display"><span class="extract">NULL</span></code> — so that it doesn't already mean something else.
|
|
During this process, we waive checking of numerical overflows in matching
|
|
an LP: this is done so that
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>3/13 specifies a bar. 2/19 specifies a foo.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">reports "2/19" as a duplicate using the following problem message, but
|
|
does not throw a problem message as being a bar which is out of range
|
|
(because in the bar notation, the number after the slash can be at most
|
|
13, so that 19 is illegal).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check that the new notation does not overlap with that of any existing LP</span> <span class="cwebmacronumber">34.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">waive_lp_overflows</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">literal</span><span class="plain">>(</span><span class="identifier">SPW</span><span class="plain">)) </span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_kind</span><span class="plain">(<<</span><span class="identifier">rp</span><span class="plain">>>);</span>
|
|
<span class="identifier">waive_lp_overflows</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(2, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(3, </span><span class="identifier">SPW</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DuplicateUnitSpec</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, it looks as if you intend to give a new meaning "</span>
|
|
<span class="string">"to expressions like '%3', but this is already something I "</span>
|
|
<span class="string">"recognise - specifying %2 - so a more distinctive specification "</span>
|
|
<span class="string">"must be chosen."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_6"></a><b>§34.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue problem message warning that real arithmetic is needed</span> <span class="cwebmacronumber">34.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="functiontext">Problems::quote_kind</span><span class="plain">(2, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPNeedsReal</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, it looks as if you intend to give a real "</span>
|
|
<span class="string">"number as a scale factor for values of %2. However, as you've "</span>
|
|
<span class="string">"defined it here, %2 uses only whole numbers, so this wouldn't "</span>
|
|
<span class="string">"work. %PYou can probably fix this by making the example "</span>
|
|
<span class="string">"amount a real number too - say, writing '1.0 rel specifies...' "</span>
|
|
<span class="string">"instead of '1 rel specifies...'."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_7"></a><b>§34.7. </b>Note that we don't create a new LP structure if the following happens:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Deal with the case where a dimensionality rule is being specified</span> <span class="cwebmacronumber">34.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notation_options</span><span class="plain"> == </span><span class="constant">TIMES_LPN</span><span class="plain">) {</span>
|
|
<span class="identifier">Kinds::Dimensions::dim_set_multiplication</span><span class="plain">(</span><span class="identifier">LP_left_kind</span><span class="plain">, </span><span class="identifier">LP_right_kind</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_8"></a><b>§34.8. </b>This checking did not apply to the dimensionality rules case, which looks
|
|
after itself.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check that the kind is acceptable as the owner of a LP</span> <span class="cwebmacronumber">34.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Behaviour::is_built_in</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Behaviour::get_index_priority</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == 0)</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPBuiltInKOVHidden</span><span class="plain">),</span>
|
|
<span class="string">"you can only specify ways to write new kinds of value"</span><span class="plain">,</span>
|
|
<span class="string">"as created with sentences like 'A weight is a kind of value.', "</span>
|
|
<span class="string">"and not the built-in ones like 'number' or 'time'. (This one is "</span>
|
|
<span class="string">"a kind used behind the scenes by Inform, so it's reserved "</span>
|
|
<span class="string">"for Inform's own use, and you can't do much else with it.)"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPBuiltInKOV</span><span class="plain">),</span>
|
|
<span class="string">"you can only specify ways to write new kinds of value"</span><span class="plain">,</span>
|
|
<span class="string">"as created with sentences like 'A weight is a kind of value.', "</span>
|
|
<span class="string">"and not the built-in ones like 'number' or 'time'."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Behaviour::convert_to_unit</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPEnumeration</span><span class="plain">),</span>
|
|
<span class="string">"this is a kind of value which already has named values"</span><span class="plain">,</span>
|
|
<span class="string">"so it can't have a basically numerical form as well."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_9"></a><b>§34.9. </b>All the hard work here was done during parsing.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Create the new literal pattern structure</span> <span class="cwebmacronumber">34.9</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">lp</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lp_new</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">SPW</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LP_equivalent_value</span><span class="plain">) </span><span class="identifier">LP_real_scaling_amount</span><span class="plain"> = </span><span class="identifier">LP_real_equivalent</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scaled</span><span class="plain"> <= 0) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPNonpositiveScaling</span><span class="plain">),</span>
|
|
<span class="string">"you can only scale by a positive multiple"</span><span class="plain">,</span>
|
|
<span class="string">"so something like 'scaled up by -1' is not allowed."</span><span class="plain">);</span>
|
|
<span class="identifier">scaled</span><span class="plain"> = 1;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain"> = </span><span class="identifier">Kinds::Scalings::new</span><span class="plain">(</span><span class="identifier">integer_scaling</span><span class="plain">, </span><span class="identifier">scaled_dir</span><span class="plain">,</span>
|
|
<span class="identifier">scaled</span><span class="plain">, </span><span class="identifier">LP_real_scaling_amount</span><span class="plain">, </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">LP_real_offset</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">scaled_dir</span><span class="plain"> == </span><span class="identifier">LP_SCALED_DOWN</span><span class="plain">) && (</span><span class="identifier">scaled</span><span class="plain"> == 0)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Oooops"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">owner</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>primary_alternative</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">LP_equivalent_value</span><span class="plain">) </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>equivalent_unit</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notation_options</span><span class="plain"> & </span><span class="constant">SINGULAR_LPN</span><span class="plain">) </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>singular_form_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notation_options</span><span class="plain"> & </span><span class="constant">PLURAL_LPN</span><span class="plain">) </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>plural_form_only</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">notation_options</span><span class="plain"> & </span><span class="constant">IN_LPN</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lpn</span><span class="plain"> = </span><span class="identifier">notation_groups</span><span class="plain">; </span><span class="identifier">lpn</span><span class="plain">; </span><span class="identifier">lpn</span><span class="plain"> = </span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>next_with_rp</span><span class="plain">)</span>
|
|
<span class="identifier">lpn</span><span class="plain">-</span><span class="element">>can_use_this_lp</span><span class="plain"> = </span><span class="identifier">lp</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_10"></a><b>§34.10. </b>Each word is either a whole token in itself, or a stream of tokens representing
|
|
alphabetic vs numeric pieces of a word:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Break down the specification text into tokens and elements</span> <span class="cwebmacronumber">34.10</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">tc</span><span class="plain">, </span><span class="identifier">ec</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">tc</span><span class="plain">=0, </span><span class="identifier">ec</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">SPW</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">literal_pattern_token</span><span class="plain"> </span><span class="identifier">new_token</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">digit_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">text_of_word</span><span class="plain"> = </span><span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">SPW</span><span class="plain">)+</span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain">++) </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">])) </span><span class="identifier">digit_found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">digit_found</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Break up the word into at least one element token, and perhaps also character tokens</span> <span class="cwebmacronumber">34.10.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">new_token</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lpt_new</span><span class="plain">(</span><span class="constant">WORD_LPT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="identifier">new_token</span><span class="element">.token_wn</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">SPW</span><span class="plain">)+</span><span class="identifier">i</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Add new token to LP</span> <span class="cwebmacronumber">34.10.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_tokens</span><span class="plain"> = </span><span class="identifier">tc</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain"> = </span><span class="identifier">ec</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain"> == 0) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPWithoutElement</span><span class="plain">),</span>
|
|
<span class="string">"a way to specify a kind of value must involve numbers"</span><span class="plain">,</span>
|
|
<span class="string">"so '10kg specifies a weight' is allowed, but not 'tonne "</span>
|
|
<span class="string">"specifies a weight'."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_10_1"></a><b>§34.10.1. </b>Bounds checking is easier here since we know that a LP specification will
|
|
not ever need to create the maximum conceivable value which a C integer can
|
|
hold — so we need not fool around with long long ints.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Break up the word into at least one element token, and perhaps also character tokens</span> <span class="cwebmacronumber">34.10.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">sgn</span><span class="plain"> = 1, </span><span class="identifier">next_token_begins_word</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tot</span><span class="plain"> = 0, </span><span class="identifier">digit_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">point_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">] == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1])) && (</span><span class="identifier">ec</span><span class="plain"> == 0)) {</span>
|
|
<span class="identifier">sgn</span><span class="plain"> = -1; </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">++])) {</span>
|
|
<span class="identifier">digit_found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tot</span><span class="plain"> > 999999999) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPElementTooLarge</span><span class="plain">),</span>
|
|
<span class="string">"that specification contains numbers that are too large"</span><span class="plain">,</span>
|
|
<span class="string">"and would construct values which could not sensibly "</span>
|
|
<span class="string">"be stored at run-time."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">tot</span><span class="plain"> = 10*</span><span class="identifier">tot</span><span class="plain"> + (</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">-1]-</span><span class="character">'0'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">j</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">] == </span><span class="character">'.'</span><span class="plain">) && (</span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1] == </span><span class="character">'0'</span><span class="plain">) && (</span><span class="identifier">ec</span><span class="plain"> == 0)) {</span>
|
|
<span class="identifier">j</span><span class="plain"> += 2; </span><span class="identifier">point_found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">digit_found</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> </span><span class="identifier">new_element</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lpe_new</span><span class="plain">(</span><span class="identifier">ec</span><span class="plain">, </span><span class="identifier">tot</span><span class="plain">+1, </span><span class="identifier">sgn</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ec</span><span class="plain"> >= </span><span class="constant">MAX_ELEMENTS_PER_LITERAL</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPTooManyElements</span><span class="plain">),</span>
|
|
<span class="string">"that specification contains too many numerical elements"</span><span class="plain">,</span>
|
|
<span class="string">"and is too complicated for Inform to handle."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_element</span><span class="element">.is_real</span><span class="plain"> = </span><span class="identifier">point_found</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">point_found</span><span class="plain">) </span><span class="identifier">integer_scaling</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">ec</span><span class="plain">++] = </span><span class="identifier">new_element</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sgn</span><span class="plain"> == -1) </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>number_signed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">new_token</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lpt_new</span><span class="plain">(</span><span class="constant">ELEMENT_LPT</span><span class="plain">, </span><span class="identifier">next_token_begins_word</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Add new token to LP</span> <span class="cwebmacronumber">34.10.2</span>><span class="plain">;</span>
|
|
<span class="identifier">j</span><span class="plain">--;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">new_token</span><span class="plain"> = </span><span class="functiontext">LiteralPatterns::lpt_new</span><span class="plain">(</span><span class="constant">CHARACTER_LPT</span><span class="plain">, </span><span class="identifier">next_token_begins_word</span><span class="plain">);</span>
|
|
<span class="identifier">new_token</span><span class="element">.token_char</span><span class="plain"> = </span><span class="identifier">text_of_word</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">];</span>
|
|
<<span class="cwebmacro">Add new token to LP</span> <span class="cwebmacronumber">34.10.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">sgn</span><span class="plain"> = 1; </span><span class="identifier">next_token_begins_word</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34_10">§34.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_10_2"></a><b>§34.10.2. </b>In fact counting tokens is not necessarily a good way to measure the
|
|
complexity of an LP, since any long run of characters in a word which
|
|
also contains a number will splurge the number of tokens. So
|
|
<code class="display"><span class="extract">MAX_TOKENS_PER_LITERAL</span></code> is set to a high enough value that this will
|
|
not really distort matters.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Add new token to LP</span> <span class="cwebmacronumber">34.10.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain"> >= </span><span class="constant">MAX_TOKENS_PER_LITERAL</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPTooComplicated</span><span class="plain">),</span>
|
|
<span class="string">"that specification is too complicated"</span><span class="plain">,</span>
|
|
<span class="string">"and will have to be shortened."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_tokens</span><span class="plain">[</span><span class="identifier">tc</span><span class="plain">++] = </span><span class="identifier">new_token</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34_10">§34.10</a>, <a href="#SP34_10_1">§34.10.1</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_11"></a><b>§34.11. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Adopt real arithmetic if this is called for</span> <span class="cwebmacronumber">34.11</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">integer_scaling</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Kinds::Behaviour::convert_to_real</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="identifier">Kinds::Scalings::convert_to_real</span><span class="plain">(&(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>scaling</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_12"></a><b>§34.12. </b>The elements are created in parsing order, that is, left to right. But
|
|
the multipliers can only be calculated by working from right to left, so
|
|
this is deferred until all elements exist, at which point we —
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Calculate the multipliers for packing the elements into a single integer</span> <span class="cwebmacronumber">34.12</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">m</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">-1; </span><span class="identifier">i</span><span class="plain">>=0; </span><span class="identifier">i</span><span class="plain">--) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">;</span>
|
|
<span class="identifier">m</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">*(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_13"></a><b>§34.13. </b>Today, we have naming of parts:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work through parts text to assign names to the individual elements</span> <span class="cwebmacronumber">34.13</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">p</span><span class="plain">=</span><span class="identifier">part_np_list</span><span class="plain">; (</span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++, </span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_name</span><span class="plain"> = </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">O</span><span class="plain"> = </span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="constant">lpe_options_ANNOT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> & </span><span class="constant">OPTIONAL_LSO</span><span class="plain">) </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_optional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> & </span><span class="constant">PREAMBLE_OPTIONAL_LSO</span><span class="plain">) {</span>
|
|
<span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_optional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>preamble_optional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> & </span><span class="constant">WITHOUT_LEADING_ZEROS_LSO</span><span class="plain">) </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>without_leading_zeros</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> == </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain"> - 1) && (</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPTooManyPartNames</span><span class="plain">),</span>
|
|
<span class="string">"this gives names for too many parts"</span><span class="plain">,</span>
|
|
<span class="string">"that is, for more parts than there are in the pattern."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = 0; </span><span class="identifier">j</span><span class="plain"><</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]</span><span class="element">.element_name</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">]</span><span class="element">.element_name</span><span class="plain">))</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPRepeatedPartNames</span><span class="plain">),</span>
|
|
<span class="string">"this repeats a part name"</span><span class="plain">,</span>
|
|
<span class="string">"that is, it uses the same name for two different parts "</span>
|
|
<span class="string">"of the pattern."</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> > 0) && (</span><span class="identifier">i</span><span class="plain"> != </span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPNotAllNamed</span><span class="plain">),</span>
|
|
<span class="string">"you must supply names for all the parts"</span><span class="plain">,</span>
|
|
<span class="string">"if for any"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_14"></a><b>§34.14. </b>In fact, the test is a simple one: there can be only one element declared
|
|
optional, and it must not be the first.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Check that any notes to do with optional elements are mutually compatible</span> <span class="cwebmacronumber">34.14</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">opt_count</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]</span><span class="element">.element_optional</span><span class="plain">) {</span>
|
|
<span class="identifier">opt_count</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 0) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPFirstOptional</span><span class="plain">),</span>
|
|
<span class="string">"the first part is not allowed to be optional"</span><span class="plain">,</span>
|
|
<span class="string">"since it is needed to identify the value."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">opt_count</span><span class="plain"> >= 2) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPMultipleOptional</span><span class="plain">),</span>
|
|
<span class="string">"only one part can be called optional"</span><span class="plain">,</span>
|
|
<span class="string">"since if any part is omitted then so are all subsequent parts."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP38"></a><b>§38. </b>Group names are created when first seen (in production (d)
|
|
of <literal-pattern-group>): the following recognises one which has been
|
|
seen before.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">literal</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">group</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">, </span><span class="reserved">literal_pattern_name</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">lpn</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP39"></a><b>§39. </b>And this is the routine which does the creation. The text will actually be
|
|
empty where there's an existing literal pattern name. (For instance, each
|
|
time we see a literal pattern given as "in Imperial units", we create a
|
|
fresh LPN structure, but only the first one to be created contains the
|
|
wording.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::new_lpn</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">existing</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">preform_lookahead_mode</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">new</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">literal_pattern_name</span><span class="plain">);</span>
|
|
<span class="identifier">new</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">new</span><span class="plain">-</span><span class="element">>can_use_this_lp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">new</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">new</span><span class="plain">-</span><span class="element">>next_with_rp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing</span><span class="plain">) {</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">existing</span><span class="plain">) && (</span><span class="identifier">existing</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)) </span><span class="identifier">existing</span><span class="plain"> = </span><span class="identifier">existing</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">existing</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">new</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">new</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::new_lpn is used in <a href="#SP35">§35</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP40"></a><b>§40. I7 phrases to print values in specified ways. </b>When an LP has a name, it's a notation which the source text can request
|
|
to be used in saying a value. This is where the corresponding text substitutions
|
|
are declared.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::define_named_phrases</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">, </span><span class="reserved">literal_pattern_name</span><span class="plain">)</span>
|
|
<span class="identifier">lpn</span><span class="plain">-</span><span class="element">>lpn_compiled_already</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">, </span><span class="reserved">literal_pattern_name</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">)) {</span>
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn2</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lpn2</span><span class="plain"> = </span><span class="identifier">lpn</span><span class="plain">; </span><span class="identifier">lpn2</span><span class="plain">; </span><span class="identifier">lpn2</span><span class="plain"> = </span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>lpn_compiled_already</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Compile the printing phrase for this and perhaps subsequent LPs</span> <span class="cwebmacronumber">40.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Sentences::RuleSubtrees::register_recently_lexed_phrases</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::define_named_phrases is used in 1/mr (<a href="1-mr.html#SP4_13">§4.13</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP40_1"></a><b>§40.1. </b>These text substitutions correspond exactly neither to the LPs nor to the
|
|
names. For instance, "in tonnes" produces a text substitution which takes
|
|
in both the LP for "1 tonne" and for "2 tonnes", deciding at run-time
|
|
which to use. And on the other hand, "in metric units" may produce text
|
|
substitutions for many different kinds, distinguished by type-checking:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To say (val - mass) in metric units: ...</p>
|
|
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>To say (val - length) in metric units: ...</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">The following creates one text substitution for each different kind among
|
|
the LPs under each named possibility.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Compile the printing phrase for this and perhaps subsequent LPs</span> <span class="cwebmacronumber">40.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">lpn2</span><span class="plain">-</span><span class="element">>can_use_this_lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">Kinds::Textual::write</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"To say ( val - "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" ) "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">lpn</span><span class="plain">-</span><span class="element">>notation_name</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="character">':'</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">" (- {-printing-routine:%S"</span><span class="plain">, </span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">"}({val}, %d); -) "</span><span class="plain">, </span><span class="identifier">lpn</span><span class="plain">-></span><span class="identifier">allocation_id</span><span class="plain"> + 1);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="character">'.'</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">literal_pattern_name</span><span class="plain"> *</span><span class="identifier">lpn3</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">lpn3</span><span class="plain"> = </span><span class="identifier">lpn2</span><span class="plain">; </span><span class="identifier">lpn3</span><span class="plain">; </span><span class="identifier">lpn3</span><span class="plain"> = </span><span class="identifier">lpn3</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">lpn3</span><span class="plain">-</span><span class="element">>can_use_this_lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">))</span>
|
|
<span class="identifier">lpn3</span><span class="plain">-</span><span class="element">>lpn_compiled_already</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP40">§40</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP41"></a><b>§41. I7 phrases to pack and unpack the value. </b>Creating a LP implicitly defines further I7 source text, as follows.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::define_packing_phrases</span><span class="plain">(</span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">Kinds::Textual::write</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Define phrases to convert from a packed value to individual parts</span> <span class="cwebmacronumber">41.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Define a phrase to convert from numerical parts to a packed value</span> <span class="cwebmacronumber">41.2</span>><span class="plain">;</span>
|
|
<span class="functiontext">Sentences::RuleSubtrees::register_recently_lexed_phrases</span><span class="plain">();</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::define_packing_phrases is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP41_1"></a><b>§41.1. </b>First, we automatically create n phrases to unpack the elements given the value.
|
|
For instance, defining:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>\$10.99 specifies a price with parts dollars and cents.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">automatically generates:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To define which number is dollars part of ( full - price ) :</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph"> <code class="display"><span class="extract">(- ({full}/100) -)</span></code>.
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To define which number is cents part of ( full - price ) :</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph"> <code class="display"><span class="extract">(- ({full}%100) -)</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Define phrases to convert from a packed value to individual parts</span> <span class="cwebmacronumber">41.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
|
|
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"To decide which number is "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_name</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" part of ( full - "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" ) "</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="character">':'</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">==0)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">" (- ({full}/%d) -) "</span><span class="plain">, </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain"> > 1)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">" (- (({full}/%d)%%%d) -) "</span><span class="plain">,</span>
|
|
<span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">, </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">" (- ({full}%%%d) -) "</span><span class="plain">, </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_range</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::phrasual_length</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">) >= </span><span class="constant">MAX_WORDS_PER_PHRASE</span><span class="plain"> + 5)</span>
|
|
<<span class="cwebmacro">Issue a problem for overly long part names</span> <span class="cwebmacronumber">41.1.1</span>>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="character">'.'</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP41">§41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP41_2"></a><b>§41.2. </b>And similarly, a packing phrase to calculate the value given its elements.
|
|
For instance, the dollars-and-cents example compiles:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To decide which price is price with dollars part ( part0 - a number ) cents part ( part1 - a number) :</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph"> <code class="display"><span class="extract">(- ({part0}*100+{part1}) -).</span></code>
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Define a phrase to convert from numerical parts to a packed value</span> <span class="cwebmacronumber">41.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain"> > 0) {</span>
|
|
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"To decide which "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" is "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">TEMP</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" with "</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">" part%d "</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_wording</span><span class="plain">(</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_name</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" part ( "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" - a number ) "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::phrasual_length</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">) >= </span><span class="constant">MAX_WORDS_PER_PHRASE</span><span class="plain"> + 5)</span>
|
|
<<span class="cwebmacro">Issue a problem for overly long part names</span> <span class="cwebmacronumber">41.1.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="character">':'</span><span class="plain">);</span>
|
|
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
|
|
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">" (- ("</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>no_lp_elements</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">literal_pattern_element</span><span class="plain"> *</span><span class="identifier">lpe</span><span class="plain"> = &(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>lp_elements</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">>0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">"+"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain"> != 1)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">"%d*"</span><span class="plain">, </span><span class="identifier">lpe</span><span class="plain">-</span><span class="element">>element_multiplier</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">"{part%d}"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">, </span><span class="string">") -) "</span><span class="plain">);</span>
|
|
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">Sentences::make_node</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="character">'.'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">print_rule_buff</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP41">§41</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP41_1_1"></a><b>§41.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue a problem for overly long part names</span> <span class="cwebmacronumber">41.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_LPPartNamesTooLong</span><span class="plain">),</span>
|
|
<span class="string">"the names for these parts are too long"</span><span class="plain">,</span>
|
|
<span class="string">"and will have to be cut down."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP41_1">§41.1</a>, <a href="#SP41_2">§41.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP42"></a><b>§42. The kind's list. </b>On reading "5 feet 4 inches specifies a height", Inform parses
|
|
"5 feet 4 inches" into a <code class="display"><span class="extract">literal_pattern</span></code> structure and then calls this
|
|
routine to attach it to the kind "height". (Multiple patterns can be
|
|
attached to the same kind, and they become alternative syntaxes.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LiteralPatterns::add_literal_pattern</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="identifier">lp</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't add LP to null kind"</span><span class="plain">);</span>
|
|
<span class="identifier">K</span><span class="plain">-</span><span class="element">>construct</span><span class="plain">-></span><span class="identifier">ways_to_write_literals</span><span class="plain"> =</span>
|
|
<span class="functiontext">LiteralPatterns::list_add</span><span class="plain">(</span>
|
|
<span class="identifier">K</span><span class="plain">-</span><span class="element">>construct</span><span class="plain">-></span><span class="identifier">ways_to_write_literals</span><span class="plain">, </span><span class="identifier">lp</span><span class="plain">,</span>
|
|
<span class="identifier">Kinds::FloatingPoint::uses_floating_point</span><span class="plain">(</span><span class="identifier">lp</span><span class="plain">-</span><span class="element">>kind_specified</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::add_literal_pattern is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP43"></a><b>§43. </b>And here we find the list of such notations.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">literal_pattern</span><span class="plain"> *</span><span class="functiontext">LiteralPatterns::list_of_literal_forms</span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">K</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">K</span><span class="plain">-</span><span class="element">>construct</span><span class="plain">-></span><span class="identifier">ways_to_write_literals</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function LiteralPatterns::list_of_literal_forms is used in <a href="#SP2">§2</a>, <a href="#SP34">§34</a>, 13/rsfk (<a href="13-rsfk.html#SP24_2">§24.2</a>), 13/ki (<a href="13-ki.html#SP1_8">§1.8</a>, <a href="13-ki.html#SP5_1_1">§5.1.1</a>).</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><i>(This section begins Chapter 5: Nouns.)</i></li><li><a href="5-tod.html">Continue with 'Times of Day'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</body>
|
|
</html>
|
|
|