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

Further improvements to I6 syntax error reporting

This commit is contained in:
Graham Nelson 2023-04-29 23:36:11 +01:00
parent 568429d61c
commit b382906e39
45 changed files with 1316 additions and 656 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
[Version](notes/versioning.md): 10.2.0-beta+6W39 'Krypton' (28 April 2023)
[Version](notes/versioning.md): 10.2.0-beta+6W40 'Krypton' (29 April 2023)
## About Inform

View file

@ -1,3 +1,3 @@
Prerelease: beta
Build Date: 28 April 2023
Build Number: 6W39
Build Date: 29 April 2023
Build Number: 6W40

View file

@ -251,7 +251,7 @@ all conditionals are resolved.
<span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">endif_node</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"no matching '#endif'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"no matching '#endif'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
@ -269,6 +269,10 @@ all conditionals are resolved.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dir_clarifier</span><span class="plain-syntax"> == </span><span class="constant-syntax">IFDEF_I6RW</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">dir_clarifier</span><span class="plain-syntax"> == </span><span class="constant-syntax">IFNDEF_I6RW</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"bare '#ifdef' or '#ifndef'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">symbol_to_check</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to_eval</span><span class="plain-syntax"> = </span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">;</span>
@ -276,7 +280,7 @@ all conditionals are resolved.
<span class="plain-syntax"> </span><span class="identifier-syntax">to_eval</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to_eval</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">to_eval</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to_eval</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">to_eval</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed '#if...'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">dir_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed '#if...'"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">symbol_to_check</span><span class="plain-syntax"> = </span><span class="identifier-syntax">to_eval</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">;</span>
@ -460,8 +464,8 @@ compilation &mdash; are ever visited.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CODE_PRIM_CAT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"assembly language unexpected here"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CODE_PRIM_CAT</span><span class="plain-syntax">) { </span><span class="comment-syntax"> should never in fact happen</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"assembly language unexpected here"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">;</span>
@ -473,7 +477,7 @@ compilation &mdash; are ever visited.
<span class="plain-syntax"> </span><span class="identifier-syntax">opcode_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">opcode_text</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="comment-syntax"> should never in fact happen</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"assembly language malformed here"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"assembly language malformed here"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="3-prd.html#SP26" class="function-link"><span class="function-syntax">Produce::inv_assembly</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">opcode_text</span><span class="plain-syntax">);</span>
@ -567,7 +571,7 @@ changed back again very soon after.
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"indirect"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">tok</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"glk"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"the glk() function is now unsupported"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"the glk() function is now unsupported"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to_call</span><span class="plain-syntax"> = </span><a href="2-if.html#SP6" class="function-link"><span class="function-syntax">IdentifierFinders::find_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">tok</span><span class="plain-syntax">, </span><span class="identifier-syntax">finder</span><span class="plain-syntax">);</span>
@ -614,7 +618,7 @@ somewhere (in fact, always in a property value).
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">argc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax">; </span><span class="identifier-syntax">n</span><span class="plain-syntax">=</span><span class="identifier-syntax">n</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax">) </span><span class="identifier-syntax">argc</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">argc</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">4</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"too many arguments for call-message"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"too many arguments for call-message"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">BIP</span><span class="plain-syntax"> = </span><a href="1-ip.html#SP7" class="function-link"><span class="function-syntax">Primitives::BIP_for_indirect_call_returning_value</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">argc</span><span class="plain-syntax">-1);</span>
@ -636,7 +640,7 @@ more natural <span class="extract"><span class="extract-syntax">{ ... }</span></
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CODE_PRIM_CAT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '{ ... }' code block"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '{ ... }' code block"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unopened</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
@ -660,7 +664,7 @@ only part of I6 syntax covered by schemas. Therefore:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"misplaced directive"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"misplaced directive"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-eis.html#SP3_1">&#167;3.1</a>.</li></ul>
@ -673,7 +677,7 @@ evaluated for their potential side-effects, but only the last produces a value.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CODE_PRIM_CAT</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">VAL_PRIM_CAT</span><span class="plain-syntax">)){</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"expression in unexpected place"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"expression in unexpected place"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="3-prd.html#SP32" class="function-link"><span class="function-syntax">Produce::val</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">InterValuePairs::number</span><span class="plain-syntax">(1));</span>
@ -793,7 +797,7 @@ parsing the schema.)
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">InterValuePairs::is_undef</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"malformed literal number '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -825,7 +829,7 @@ parsing the schema.)
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"'%S' was unexpected in expression context"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -860,7 +864,7 @@ For example, the schema <span class="extract"><span class="extract-syntax">.{-la
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CODE_PRIM_CAT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"label in unexpected place"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"label in unexpected place"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">)</span>
@ -879,7 +883,7 @@ For example, the schema <span class="extract"><span class="extract-syntax">.{-la
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"expected label name but found '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -991,7 +995,7 @@ on others.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prim_cat</span><span class="plain-syntax"> != </span><span class="identifier-syntax">CODE_PRIM_CAT</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"statement in unexpected place"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"statement in unexpected place"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">isn_clarifier</span><span class="plain-syntax"> == </span><span class="constant-syntax">CASE_BIP</span><span class="plain-syntax">) </span><a href="3-prd.html#SP10" class="function-link"><span class="function-syntax">Produce::set_level_to_current_code_block_plus</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
@ -1067,7 +1071,7 @@ these possibilities:
<span class="plain-syntax"> </span><span class="identifier-syntax">EIS_RECURSE</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">REF_PRIM_CAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">EIS_RECURSE</span><span class="plain-syntax">(</span><span class="identifier-syntax">cl_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">VAL_PRIM_CAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed 'objectloop' header"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed 'objectloop' header"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
@ -1080,7 +1084,7 @@ these possibilities:
<span class="plain-syntax"> </span><span class="identifier-syntax">EIS_RECURSE</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">REF_PRIM_CAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-prd.html#SP31" class="function-link"><span class="function-syntax">Produce::val_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><a href="2-if.html#SP5" class="function-link"><span class="function-syntax">IdentifierFinders::find</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Object"</span><span class="plain-syntax">, </span><span class="identifier-syntax">finder</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"'objectloop' without visible variable"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">node</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"'objectloop' without visible variable"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -1113,7 +1117,7 @@ like the comma in C) to throw away the results of the non-final evaluations.
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-eis.html#SP3_1">&#167;3.1</a>.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-i6o.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresscurrent">eis</li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-if.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-i6o.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresscurrent">eis</li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-if.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -248,7 +248,7 @@ if a syntax error is reached.
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-i6a.html#SP5">&#167;5</a> (twice).</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-if.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresscurrent">i6a</li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="3-prd.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-if.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresscurrent">i6a</li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-i6se.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -254,7 +254,7 @@ irrelevant, of course, for unary operators.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-rmf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresscurrent">i6o</li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-eis.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-rmf.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresscurrent">i6o</li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-eis.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -0,0 +1,203 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Inform 6 Syntax Errors</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../index.html">home</a></li>
</ul><h2>Compiler</h2><ul>
<li><a href="../structure.html">structure</a></li>
<li><a href="../inbuildn.html">inbuild</a></li>
<li><a href="../inform7n.html">inform7</a></li>
<li><a href="../intern.html">inter</a></li>
<li><a href="../services.html">services</a></li>
<li><a href="../secrets.html">secrets</a></li>
</ul><h2>Other Tools</h2><ul>
<li><a href="../inblorbn.html">inblorb</a></li>
<li><a href="../indocn.html">indoc</a></li>
<li><a href="../inform6.html">inform6</a></li>
<li><a href="../inpolicyn.html">inpolicy</a></li>
<li><a href="../inrtpsn.html">inrtps</a></li>
</ul><h2>Resources</h2><ul>
<li><a href="../extensions.html">extensions</a></li>
<li><a href="../kits.html">kits</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inweb/index.html">inweb</a></li>
<li><a href="../../../intest/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Inform 6 Syntax Errors' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../intern.html">Inter Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#2">Chapter 2: Blueprints</a></li><li><b>Inform 6 Syntax Errors</b></li></ul></div>
<p class="purpose">To issue problem messages when parsing malformed I6-syntax code.</p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>Errors like these used to be basically failed assertions, but inevitably people
reported that as a bug (Mantis 0001596). It was never intended that Inform 6-syntax
hacking should be part of the outside-facing Inform language; but if you leave
power tools just lying around, people will eventually pick them up and wonder
what the red button marked "danger" does.
</p>
<p class="commentary">Note that <span class="extract"><span class="extract-syntax">i6_syntax_error_location</span></span> is initially uninitialised and thus has
undefined contents, so we take care to blank it out if it is read before being
written to for the first time.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_location</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_location_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::get_current_location</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">I6Errors::get_current_location</span></span>:<br/><a href="2-i6se.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i6_syntax_error_location_set</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP1" class="function-link"><span class="function-syntax">I6Errors::clear_current_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_location</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::clear_current_location</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">I6Errors::clear_current_location</span></span>:<br/><a href="2-i6se.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP1" class="function-link"><span class="function-syntax">I6Errors::set_current_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Provenance::nowhere</span><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::set_current_location</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">where</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_location_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_location</span><span class="plain-syntax"> = </span><span class="identifier-syntax">where</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::set_current_location_near_splat</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP1" class="function-link"><span class="function-syntax">I6Errors::clear_current_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">P</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Inode::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">SPLAT_IST</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP1" class="function-link"><span class="function-syntax">I6Errors::set_current_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SplatInstruction::provenance</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The issuing mechanism, or rather, the mechanism used if the main Inform
compiler doesn't gazump us (in order to provide something better-looking in
the GUI apps).
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">quote</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><a href="2-i6se.html#SP1" class="function-link"><span class="function-syntax">I6Errors::get_current_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SourceProblems::I6_level_error</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">quote</span><span class="plain-syntax">, </span><span class="identifier-syntax">at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::get_filename</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">quote</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::at_position_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">Provenance::get_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::with_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">quote</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_count</span><span class="plain-syntax">++;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::reset_count</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP1" class="function-link"><span class="function-syntax">I6Errors::clear_current_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_syntax_error_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::errors_occurred</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i6_syntax_error_count</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>The functions below are for errors detected when parsing text into schemas, or
when emitting code from them.
</p>
<p class="commentary">Note that the <span class="extract"><span class="extract-syntax">parsing_errors</span></span> field of a schema is null until the first error
is detected &mdash; which, of course, it usually isn't. It holds a linked list of these:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">provenance</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure schema_parsing_error is accessed in 2/is and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::issue_at_node</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">I6Errors::issue_at_node</span></span>:<br/>Tokenisation - <a href="2-tkn.html#SP1_8">&#167;1.8</a><br/>Ramification - <a href="2-rmf.html#SP13_1_1">&#167;13.1.1</a>, <a href="2-rmf.html#SP13_1_2">&#167;13.1.2</a>, <a href="2-rmf.html#SP13_1_5">&#167;13.1.5</a>, <a href="2-rmf.html#SP14">&#167;14</a>, <a href="2-rmf.html#SP14_1">&#167;14.1</a>, <a href="2-rmf.html#SP15">&#167;15</a>, <a href="2-rmf.html#SP22_5">&#167;22.5</a>, <a href="2-rmf.html#SP26">&#167;26</a><br/>Emitting Inter Schemas - <a href="2-eis.html#SP2_1_1">&#167;2.1.1</a>, <a href="2-eis.html#SP2_1_2">&#167;2.1.2</a>, <a href="2-eis.html#SP3_1_1">&#167;3.1.1</a>, <a href="2-eis.html#SP3_1_2_1">&#167;3.1.2.1</a>, <a href="2-eis.html#SP3_1_3">&#167;3.1.3</a>, <a href="2-eis.html#SP3_1_4">&#167;3.1.4</a>, <a href="2-eis.html#SP3_1_5">&#167;3.1.5</a>, <a href="2-eis.html#SP3_1_6">&#167;3.1.6</a>, <a href="2-eis.html#SP3_1_7_2">&#167;3.1.7.2</a>, <a href="2-eis.html#SP3_1_8">&#167;3.1.8</a>, <a href="2-eis.html#SP3_1_11">&#167;3.1.11</a>, <a href="2-eis.html#SP3_1_11_1">&#167;3.1.11.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">message</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">at</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">)) </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">) </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::nowhere</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::nowhere</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Schema error: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Schema provenance %f, line %d\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Provenance::get_filename</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Provenance::get_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$1\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>That function of course caches schema errors for playback later: well, here's
the later. Unless the main Inform compiler takes over from us, the result will
be drastic, halting what is presumably the <span class="extract"><span class="extract-syntax">inter</span></span> tool:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Errors::internal_error_on_schema_errors</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">I6Errors::internal_error_on_schema_errors</span></span>:<br/>Parsing Inter Schemas - <a href="2-pis.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SourceProblems::inter_schema_errors</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDERR</span><span class="plain-syntax">, </span><span class="string-syntax">"Parsing error(s) in the internal schema '%S':\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">converted_from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDERR</span><span class="plain-syntax">, </span><span class="string-syntax">"- %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exit</span><span class="plain-syntax">(1);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-i6a.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresscurrent">i6se</li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="3-prd.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>

View file

@ -205,7 +205,7 @@ because the symbol which that iname incarnates as must be the right one.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-eis.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresscurrent">if</li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-i6a.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-eis.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresscurrent">if</li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-i6a.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -59,7 +59,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../intern.html">Inter Modules</a></li><li><a href="index.html">building</a></li><li><a href="index.html#2">Chapter 2: Blueprints</a></li><li><b>Inter Schemas</b></li></ul></div>
<p class="purpose">Building an inter schema, a form of annotated syntax tree.</p>
<ul class="toc"><li><a href="2-is.html#SP1">&#167;1. Introduction</a></li><li><a href="2-is.html#SP14">&#167;14. Token insertion</a></li><li><a href="2-is.html#SP17">&#167;17. Logging</a></li><li><a href="2-is.html#SP18">&#167;18. Lint</a></li><li><a href="2-is.html#SP19">&#167;19. Errors</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-is.html#SP1">&#167;1. Introduction</a></li><li><a href="2-is.html#SP14">&#167;14. Token insertion</a></li><li><a href="2-is.html#SP17">&#167;17. Logging</a></li><li><a href="2-is.html#SP18">&#167;18. Lint</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Introduction. </b>See <a href="P-wtmd.html" class="internal">What This Module Does</a> for an introduction to what an Inter schema is.
For this section of code, it's sufficient to know that an <a href="2-is.html#SP1" class="internal">inter_schema</a>
@ -81,7 +81,7 @@ few hundred &mdash; so they do not need to be stored compactly or compiled quick
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">inter_schema</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure inter_schema is accessed in 2/pis, 2/tkn, 2/rmf, 2/eis and here.</li></ul>
<ul class="endnotetexts"><li>The structure inter_schema is accessed in 2/pis, 2/tkn, 2/rmf, 2/eis, 2/i6se and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">
@ -138,7 +138,7 @@ we now more efficiently remove them.)
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure inter_schema_node is accessed in 2/rmf, 2/eis and here.</li></ul>
<ul class="endnotetexts"><li>The structure inter_schema_node is accessed in 2/rmf, 2/eis, 2/i6se and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
@ -734,69 +734,8 @@ where the check is done:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. Errors. </b>Errors can be detected both when parsing text into schemas, and also when emitting
code from them. In either case, the following is used to attach error message(s)
to the schema itself.
</p>
<p class="commentary">Note that the <span class="extract"><span class="extract-syntax">parsing_errors</span></span> field is null until the first error is detected &mdash;
which, of course, it usually isn't.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">provenance</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure schema_parsing_error is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InterSchemas::throw_error</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">InterSchemas::throw_error</span></span>:<br/>Tokenisation - <a href="2-tkn.html#SP1_8">&#167;1.8</a><br/>Ramification - <a href="2-rmf.html#SP13_1_1">&#167;13.1.1</a>, <a href="2-rmf.html#SP13_1_2">&#167;13.1.2</a>, <a href="2-rmf.html#SP13_1_5">&#167;13.1.5</a>, <a href="2-rmf.html#SP14">&#167;14</a>, <a href="2-rmf.html#SP14_1">&#167;14.1</a>, <a href="2-rmf.html#SP15">&#167;15</a>, <a href="2-rmf.html#SP22_5">&#167;22.5</a>, <a href="2-rmf.html#SP26">&#167;26</a><br/>Emitting Inter Schemas - <a href="2-eis.html#SP2_1_1">&#167;2.1.1</a>, <a href="2-eis.html#SP2_1_2">&#167;2.1.2</a>, <a href="2-eis.html#SP3_1_1">&#167;3.1.1</a>, <a href="2-eis.html#SP3_1_2_1">&#167;3.1.2.1</a>, <a href="2-eis.html#SP3_1_3">&#167;3.1.3</a>, <a href="2-eis.html#SP3_1_4">&#167;3.1.4</a>, <a href="2-eis.html#SP3_1_5">&#167;3.1.5</a>, <a href="2-eis.html#SP3_1_6">&#167;3.1.6</a>, <a href="2-eis.html#SP3_1_7_2">&#167;3.1.7.2</a>, <a href="2-eis.html#SP3_1_8">&#167;3.1.8</a>, <a href="2-eis.html#SP3_1_11">&#167;3.1.11</a>, <a href="2-eis.html#SP3_1_11_1">&#167;3.1.11.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">at</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">message</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">at</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">)) </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">) </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::nowhere</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::nowhere</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Schema error: %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Schema provenance %f, line %d\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Provenance::get_filename</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Provenance::get_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$1\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parent_schema</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>&#167;21. </b>And this is an especially drastic way to deal with such errors:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InterSchemas::internal_error_on_schema_errors</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">InterSchemas::internal_error_on_schema_errors</span></span>:<br/>Parsing Inter Schemas - <a href="2-pis.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SourceProblems::inter_schema_errors</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDERR</span><span class="plain-syntax">, </span><span class="string-syntax">"Parsing error(s) in the internal schema '%S':\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">converted_from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="reserved-syntax">schema_parsing_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parsing_errors</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">STDERR</span><span class="plain-syntax">, </span><span class="string-syntax">"- %S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"malformed schema"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="1-in.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">is</li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-pis.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="1-in.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresscurrent">is</li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-pis.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -112,7 +112,7 @@ I6S code can only come from within the compiler itself, and means a bug.
<span class="plain-syntax"> </span><span class="identifier-syntax">Dictionaries::create</span><span class="plain-syntax">(</span><span class="identifier-syntax">i6s_inter_schema_cache</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Dictionaries::write_value</span><span class="plain-syntax">(</span><span class="identifier-syntax">i6s_inter_schema_cache</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">result</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP21" class="function-link"><span class="function-syntax">InterSchemas::internal_error_on_schema_errors</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP5" class="function-link"><span class="function-syntax">I6Errors::internal_error_on_schema_errors</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">result</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -256,7 +256,7 @@ such operations are nested, they will work. We might then write:
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-is.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresscurrent">pis</li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-tkn.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-is.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresscurrent">pis</li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-tkn.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -940,7 +940,7 @@ nodes, which we want to fold into just one:
<span class="plain-syntax"> </span><span class="identifier-syntax">operand1</span><span class="plain-syntax"> = </span><a href="2-is.html#SP16" class="function-link"><span class="function-syntax">InterSchemas::second_dark_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">until_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">cons</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax"> = </span><span class="identifier-syntax">until_node</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cons</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"do without until"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cons</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"do without until"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
@ -957,7 +957,7 @@ nodes, which we want to fold into just one:
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"expected 'on' or 'off' after 'font', not '%S'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cons</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cons</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -1023,7 +1023,7 @@ clause at all. We split these possibilities into two different statement nodes.
<span class="plain-syntax"> </span><span class="identifier-syntax">to</span><span class="plain-syntax"> = </span><a href="2-is.html#SP16" class="function-link"><span class="function-syntax">InterSchemas::next_dark_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cons</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"move without to"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cons</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"move without to"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">operand2</span><span class="plain-syntax"> = </span><a href="2-is.html#SP16" class="function-link"><span class="function-syntax">InterSchemas::next_dark_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
@ -1443,7 +1443,7 @@ removing the colon and bracket tokens. Thus:
<span class="plain-syntax"> (</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_marked</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">predicates</span><span class="plain-syntax"> = </span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">predicates</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">predicates</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">isn_type</span><span class="plain-syntax"> != </span><span class="constant-syntax">EXPRESSION_ISNT</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed 'for' loop"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed 'for' loop"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">inter_schema_token</span><span class="plain-syntax"> *</span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">predicates</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax">;</span>
@ -1471,7 +1471,7 @@ removing the colon and bracket tokens. Thus:
<span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">n</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cw</span><span class="plain-syntax"> != </span><span class="constant-syntax">3</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"'for' header with too few clauses"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"'for' header with too few clauses"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;3; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
@ -1515,7 +1515,7 @@ removing the colon and bracket tokens. Thus:
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">cw</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">3</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"'for' header with too many clauses"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"'for' header with too many clauses"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax">[</span><span class="identifier-syntax">cw</span><span class="plain-syntax">] == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">to</span><span class="plain-syntax">[</span><span class="identifier-syntax">cw</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -1544,7 +1544,7 @@ from failing its lint test.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">actual</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">inter_schema_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">; </span><span class="identifier-syntax">ch</span><span class="plain-syntax">; </span><span class="identifier-syntax">ch</span><span class="plain-syntax">=</span><span class="identifier-syntax">ch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_node</span><span class="plain-syntax">) </span><span class="identifier-syntax">actual</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">actual</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">req</span><span class="plain-syntax">-1) || (</span><span class="identifier-syntax">actual</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">req</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed statement"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed statement"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">actual</span><span class="plain-syntax"> == </span><span class="identifier-syntax">req</span><span class="plain-syntax">-1) {</span>
@ -1962,7 +1962,7 @@ operation <span class="extract"><span class="extract-syntax">a.b</span></span>.
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"operator '%S' used with %d not %d operand(s)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-i6o.html#SP5" class="function-link"><span class="function-syntax">I6Operators::I6_notation_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">isn_clarifier</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax">, </span><a href="2-i6o.html#SP7" class="function-link"><span class="function-syntax">I6Operators::arity</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">isn_clarifier</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -2159,32 +2159,32 @@ to cause trouble later. If no error is thrown, the schema is unchanged.
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">inter_schema_token</span><span class="plain-syntax"> *</span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax">; </span><span class="identifier-syntax">t</span><span class="plain-syntax">; </span><span class="identifier-syntax">t</span><span class="plain-syntax">=</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ist_type</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPCODE_ISTT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">asm</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">RAW_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed expression"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPEN_BRACE_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '{'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CLOSE_BRACE_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '}'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPEN_ROUND_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '('"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CLOSE_ROUND_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected ')'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">COMMA_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected ','"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIVIDER_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed expression"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">RAW_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed expression"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPEN_BRACE_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '{'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CLOSE_BRACE_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '}'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPEN_ROUND_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected '('"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CLOSE_ROUND_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected ')'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">COMMA_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected ','"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DIVIDER_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed expression"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">RESERVED_ISTT:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"unexpected use of reserved word '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">material</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">COLON_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected ':'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DCOLON_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">COLON_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected ':'"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DCOLON_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"the Inform 6 '::' operator is unsupported"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPERATOR_ISTT:</span><span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected operator"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">OPERATOR_ISTT:</span><span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"unexpected operator"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ist_type</span><span class="plain-syntax"> == </span><span class="constant-syntax">NUMBER_ISTT</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">t</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ist_type</span><span class="plain-syntax"> == </span><span class="constant-syntax">NUMBER_ISTT</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">asm</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"two consecutive numbers"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"two consecutive numbers"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">) </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed expression"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">) </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed expression"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax">) </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"syntax error"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">expression_tokens</span><span class="plain-syntax">) </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"syntax error"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-rmf.html#SP26" class="function-link"><span class="function-syntax">Ramification::sanity_check</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">isn</span><span class="plain-syntax">, </span><span class="identifier-syntax">isn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">child_node</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
@ -2192,7 +2192,7 @@ to cause trouble later. If no error is thrown, the schema is unchanged.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-tkn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresscurrent">rmf</li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-i6o.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-tkn.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresssection"><a href="2-tkn.html">tkn</a></li><li class="progresscurrent">rmf</li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-i6o.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -521,7 +521,7 @@ of modifiers are allowed. See <a href="../calculus-module/3-cs.html" class="inte
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, ++</span><span class="identifier-syntax">at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">iss_bitmap</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="character-syntax">'!'</span><span class="plain-syntax">: </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_tree</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="character-syntax">'!'</span><span class="plain-syntax">: </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_tree</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"the '*!' schema notation has been abolished"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="character-syntax">'%'</span><span class="plain-syntax">: </span><span class="identifier-syntax">iss_bitmap</span><span class="plain-syntax"> = </span><span class="identifier-syntax">iss_bitmap</span><span class="plain-syntax"> | </span><span class="constant-syntax">LVALUE_CONTEXT_ISSBM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, ++</span><span class="identifier-syntax">at</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
@ -566,7 +566,7 @@ of modifiers are allowed. See <a href="../calculus-module/3-cs.html" class="inte
<span class="plain-syntax"> </span><span class="identifier-syntax">preceding_token</span><span class="plain-syntax"> = </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'-'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-is.html#SP20" class="function-link"><span class="function-syntax">InterSchemas::throw_error</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_tree</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="2-i6se.html#SP4" class="function-link"><span class="function-syntax">I6Errors::issue_at_node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">node_tree</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"the '*-' schema notation has been abolished"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="character-syntax">'*'</span><span class="plain-syntax">; </span><span class="named-paragraph-container code-font"><a href="2-tkn.html#SP1_1" class="named-paragraph-link"><span class="named-paragraph">Absorb a raw character</span><span class="named-paragraph-number">1.1</span></a></span><span class="plain-syntax">;</span>
@ -1501,7 +1501,7 @@ single quotation mark in a dictionary literal, but not a character literal.
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-pis.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresscurrent">tkn</li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-rmf.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-pis.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-is.html">is</a></li><li class="progresssection"><a href="2-pis.html">pis</a></li><li class="progresscurrent">tkn</li><li class="progresssection"><a href="2-rmf.html">rmf</a></li><li class="progresssection"><a href="2-i6o.html">i6o</a></li><li class="progresssection"><a href="2-eis.html">eis</a></li><li class="progresssection"><a href="2-if.html">if</a></li><li class="progresssection"><a href="2-i6a.html">i6a</a></li><li class="progresssection"><a href="2-i6se.html">i6se</a></li><li class="progresschapter"><a href="3-prd.html">3</a></li><li class="progressnext"><a href="2-rmf.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -736,7 +736,7 @@ doesn't add the name tp the current stack frame in <a href="../inform7/index.htm
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-i6a.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresschapter"><a href="2-is.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">prd</li><li class="progresssection"><a href="3-vh.html">vh</a></li><li class="progressnext"><a href="3-vh.html">&#10095;</a></li></ul></div>
<ul class="progressbar"><li class="progressprev"><a href="2-i6se.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-bm.html">1</a></li><li class="progresschapter"><a href="2-is.html">2</a></li><li class="progresscurrentchapter">3</li><li class="progresscurrent">prd</li><li class="progresssection"><a href="3-vh.html">vh</a></li><li class="progressnext"><a href="3-vh.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>

View file

@ -150,6 +150,11 @@
<spon class="sectiontitle">Inform 6 Annotations</span></a> -
<span class="sectionpurpose">Parsing Inform 6-syntax annotation markers.</span></p>
</li>
<li>
<p class="sectionentry"><a href="2-i6se.html">
<spon class="sectiontitle">Inform 6 Syntax Errors</span></a> -
<span class="sectionpurpose">To issue problem messages when parsing malformed I6-syntax code.</span></p>
</li>
</ul>
</li>
<li>

View file

@ -143,7 +143,7 @@ Inter program is printed to text files, not the meaning of the program.
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="character-syntax">'A'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &lt;= </span><span class="character-syntax">'Z'</span><span class="plain-syntax">)) </span><span class="identifier-syntax">d</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c</span><span class="plain-syntax">-</span><span class="character-syntax">'A'</span><span class="plain-syntax">+10;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &gt;= </span><span class="character-syntax">'0'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> &lt;= </span><span class="character-syntax">'9'</span><span class="plain-syntax">)) </span><span class="identifier-syntax">d</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c</span><span class="plain-syntax">-</span><span class="character-syntax">'0'</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-ivp.html#SP17" class="function-link"><span class="function-syntax">InterValuePairs::undef</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">d</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">base</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-ivp.html#SP17" class="function-link"><span class="function-syntax">InterValuePairs::undef</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">d</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">base</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-ivp.html#SP17" class="function-link"><span class="function-syntax">InterValuePairs::undef</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="identifier-syntax">base</span><span class="plain-syntax">*</span><span class="identifier-syntax">N</span><span class="plain-syntax"> + (</span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">d</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pos</span><span class="plain-syntax">.</span><span class="element-syntax">index</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">34</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-ivp.html#SP17" class="function-link"><span class="function-syntax">InterValuePairs::undef</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>

View file

@ -732,7 +732,7 @@ in <span class="extract"><span class="extract-syntax">Include (- ... -)</span></
<span class="plain-syntax"> </span><span class="identifier-syntax">notified_kit_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">notified_architecture_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">trigger_kit_notice</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(...));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP6" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_I6SyntaxError</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">M</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">kit</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_stream</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">file</span><span class="plain-syntax">);</span>
@ -744,7 +744,7 @@ in <span class="extract"><span class="extract-syntax">Include (- ... -)</span></
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%S, line %d:\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">file</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::problem_quote_file</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">file</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"A mistake was found in the Inform 6-syntax code near here %2: %1."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Inform 6 syntax error near here %2: %1."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"My low-level reader of source code reported a mistake - \"%1\". "</span>

View file

@ -156,7 +156,7 @@ as above), we fill in its kind.
<span class="plain-syntax"> </span><span class="identifier-syntax">EmitInterSchemas::emit</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), &amp;</span><span class="identifier-syntax">VH</span><span class="plain-syntax">, </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compiled</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">IdentifierFinders::common_names_only</span><span class="plain-syntax">(),</span>
<span class="plain-syntax"> &amp;</span><a href="4-cs.html#SP3" class="function-link"><span class="function-syntax">CompileSchemas::from_schema_token</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">ems</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterSchemas::internal_error_on_schema_errors</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compiled</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::internal_error_on_schema_errors</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compiled</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure i6s_emission_state is private to this section.</li></ul>

View file

@ -59,7 +59,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../intern.html">Inter Modules</a></li><li><a href="index.html">pipeline</a></li><li><a href="index.html#2">Chapter 2: Pipelines</a></li><li><b>Pipeline Errors</b></li></ul></div>
<p class="purpose">To issue problem messages when parsing or running erroneous pipelines.</p>
<ul class="toc"><li><a href="2-pe.html#SP1">&#167;1. Syntax errors</a></li><li><a href="2-pe.html#SP2">&#167;2. Execution errors</a></li><li><a href="2-pe.html#SP3">&#167;3. Errors in kit source</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="2-pe.html#SP1">&#167;1. Syntax errors</a></li><li><a href="2-pe.html#SP2">&#167;2. Execution errors</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Syntax errors. </b></p>
@ -206,66 +206,6 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">TextualInter::write</span><span class="plain-syntax">(</span><span class="identifier-syntax">DL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-pe.html#SP2">&#167;2</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Errors in kit source. </b>Errors like this used to be basically failed assertions, but inevitably people
reported that as a bug (0001596). It was never intended that Inform 6-syntax
hacking should be part of the outside-facing Inform language; but if you leave
power tools just lying around, people will eventually pick them up and wonder
what the red button marked "danger" does.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_location</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_location_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::get_kit_error_location</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::get_kit_error_location</span></span>:<br/>Compile Splats Stage - <a href="3-css.html#SP3_2_3_2_3">&#167;3.2.3.2.3</a>, <a href="3-css.html#SP7_10">&#167;7.10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kit_error_location_set</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_location</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::clear_kit_error_location</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></span>:<br/>Compile Splats Stage - <a href="3-css.html#SP2">&#167;2</a>, <a href="3-css.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::set_kit_error_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Provenance::nowhere</span><span class="plain-syntax">());</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::set_kit_error_location</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::set_kit_error_location</span></span>:<br/>Compile Splats Stage - <a href="3-css.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">where</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_location_set</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_location</span><span class="plain-syntax"> = </span><span class="identifier-syntax">where</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::set_kit_error_location_near_splat</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::set_kit_error_location_near_splat</span></span>:<br/>Compile Splats Stage - <a href="3-css.html#SP3_1">&#167;3.1</a>, <a href="3-css.html#SP3_2">&#167;3.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">P</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Inode::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">SPLAT_IST</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::set_kit_error_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">SplatInstruction::provenance</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::kit_error</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::kit_error</span></span>:<br/>Parsing Stages - <a href="3-ps.html#SP2_5">&#167;2.5</a>, <a href="3-ps.html#SP7">&#167;7</a><br/>Resolve Conditional Compilation Stage - <a href="3-rccs.html#SP2">&#167;2</a>, <a href="3-rccs.html#SP3_4">&#167;3.4</a>, <a href="3-rccs.html#SP3_2_2">&#167;3.2.2</a>, <a href="3-rccs.html#SP3_5">&#167;3.5</a>, <a href="3-rccs.html#SP3_6">&#167;3.6</a><br/>Compile Splats Stage - <a href="3-css.html#SP3_1_3_1_4_5_1">&#167;3.1.3.1.4.5.1</a>, <a href="3-css.html#SP3_1_3_1_4_5_2_1_1">&#167;3.1.3.1.4.5.2.1.1</a>, <a href="3-css.html#SP3_1_3_1_4_5_2_2_1">&#167;3.1.3.1.4.5.2.2.1</a>, <a href="3-css.html#SP3_1_3_1_4_5_2_2_1_1">&#167;3.1.3.1.4.5.2.2.1.1</a>, <a href="3-css.html#SP3_2_1">&#167;3.2.1</a>, <a href="3-css.html#SP3_2_2">&#167;3.2.2</a>, <a href="3-css.html#SP3_2_3_2_1">&#167;3.2.3.2.1</a>, <a href="3-css.html#SP4">&#167;4</a>, <a href="3-css.html#SP7_8">&#167;7.8</a>, <a href="3-css.html#SP7_10">&#167;7.10</a>, <a href="3-css.html#SP14">&#167;14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">quote</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">at</span><span class="plain-syntax"> = </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::get_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SourceProblems::I6_level_error</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">quote</span><span class="plain-syntax">, </span><span class="identifier-syntax">at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::get_filename</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">, </span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">quote</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::at_position_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">Provenance::get_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">at</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">M</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::with_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">message</span><span class="plain-syntax">, </span><span class="identifier-syntax">quote</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_count</span><span class="plain-syntax">++;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::reset_errors</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::reset_errors</span></span>:<br/>Compile Splats Stage - <a href="3-css.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kit_error_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PipelineErrors::errors_occurred</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">PipelineErrors::errors_occurred</span></span>:<br/>Compile Splats Stage - <a href="3-css.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kit_error_count</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-rp.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-pm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-pp.html">pp</a></li><li class="progresssection"><a href="2-rp.html">rp</a></li><li class="progresscurrent">pe</li><li class="progresssection"><a href="2-ns.html">ns</a></li><li class="progresssection"><a href="2-rmss.html">rmss</a></li><li class="progresschapter"><a href="3-ps.html">3</a></li><li class="progresschapter"><a href="4-lbks.html">4</a></li><li class="progresschapter"><a href="5-msms.html">5</a></li><li class="progresschapter"><a href="6-erms.html">6</a></li><li class="progressnext"><a href="2-ns.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -105,18 +105,18 @@ function definition, that is quite a lot of work.
</li></ul>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CompileSplatsStage::run</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CompileSplatsStage::run</span></span>:<br/><a href="3-css.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">pipeline_step</span><span class="plain-syntax"> *</span><span class="identifier-syntax">step</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::reset_errors</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::reset_count</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">compile_splats_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">css</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-css.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Initialise the CS state</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax"> = </span><span class="identifier-syntax">step</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ephemera</span><span class="plain-syntax">.</span><span class="element-syntax">tree</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><a href="3-css.html#SP3" class="function-link"><span class="function-syntax">CompileSplatsStage::visitor1</span></a><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">css</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">SPLAT_IST</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><a href="3-css.html#SP3" class="function-link"><span class="function-syntax">CompileSplatsStage::visitor2</span></a><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">css</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::clear_current_location</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">errors_found</span><span class="plain-syntax"> = </span><a href="3-css.html#SP13" class="function-link"><span class="function-syntax">CompileSplatsStage::function_bodies</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">step</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">css</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">errors_found</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><a href="3-css.html#SP3" class="function-link"><span class="function-syntax">CompileSplatsStage::visitor3</span></a><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">css</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">SPLAT_IST</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::errors_occurred</span></a><span class="plain-syntax">()) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::clear_current_location</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I6Errors::errors_occurred</span><span class="plain-syntax">()) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -219,7 +219,7 @@ is being compiled.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::set_kit_error_location_near_splat</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::set_current_location_near_splat</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">raw_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">proceed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
@ -600,11 +600,13 @@ first to work out which of the several array formats this is, then the contents
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *buffer *(%c*?) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">conts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]; </span><span class="identifier-syntax">as_bytes</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="identifier-syntax">bounded</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *string *(%c*?) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Identifier = &lt;%S&gt;, Value = &lt;%S&gt;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 'string' arrays are unsupported"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"cannot make array '%S': the 'string' initialiser is unsupported"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Identifier = &lt;%S&gt;, Value = &lt;%S&gt;"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 array declaration"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"cannot make array '%S': the initial value syntax is unrecognised"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">conts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">value</span><span class="plain-syntax">; </span><span class="identifier-syntax">grammatical</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
@ -670,18 +672,16 @@ see why other kits would, either.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">full_conts</span><span class="plain-syntax"> = </span><span class="identifier-syntax">entries</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">from</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">to</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 array contains empty entry"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">count_before</span><span class="plain-syntax"> = </span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">conts</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">=</span><span class="identifier-syntax">from</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="plain-syntax">&lt;=</span><span class="identifier-syntax">to</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="plain-syntax">++) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">conts</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">full_conts</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-css.html#SP3_1_3_1_4_5_2_2" class="named-paragraph-link"><span class="named-paragraph">Parse the old-style I6 array entry notation</span><span class="named-paragraph-number">3.1.3.1.4.5.2.2</span></a></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">conts</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">count_before</span><span class="plain-syntax">+1)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Multiple entries between ';' markers in a '[ ...; ...; ... ]' array"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">count_before</span><span class="plain-syntax"> = </span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">conts</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">=</span><span class="identifier-syntax">from</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="plain-syntax">&lt;=</span><span class="identifier-syntax">to</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="plain-syntax">++) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">conts</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">full_conts</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-css.html#SP3_1_3_1_4_5_2_2" class="named-paragraph-link"><span class="named-paragraph">Parse the old-style I6 array entry notation</span><span class="named-paragraph-number">3.1.3.1.4.5.2.2</span></a></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">conts</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax"> == </span><span class="identifier-syntax">count_before</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"array '%S' contains empty entry"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">count_before</span><span class="plain-syntax">+1)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"multiple entries between ';' markers in array '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-css.html#SP3_1_3_1_4_5_2_1">&#167;3.1.3.1.4.5.2.1</a> (twice).</li></ul>
<p class="commentary firstcommentary"><a id="SP3_1_3_1_4_5_2_2" class="paragraph-anchor"></a><b>&#167;3.1.3.1.4.5.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Parse the old-style I6 array entry notation</span><span class="named-paragraph-number">3.1.3.1.4.5.2.2</span></span><span class="comment-syntax"> =</span>
@ -703,17 +703,21 @@ see why other kits would, either.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"+"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 array declaration using operator '+' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"array '%S' gives its size using operator '+' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"-"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 array declaration using operator '-' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"array '%S' gives its size using operator '-' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"*"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 array declaration using operator '*' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"array '%S' gives its size using operator '*' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"/"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 array declaration using operator '/' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"array '%S' gives its size using operator '/' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(use brackets '(' ... ')' around the size for a calculated array size)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_pair</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterValuePairs::undef</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-css.html#SP3_1_3_1_4_1_1" class="named-paragraph-link"><span class="named-paragraph">Assimilate a value</span><span class="named-paragraph-number">3.1.3.1.4.1.1</span></a></span><span class="plain-syntax">;</span>
@ -902,7 +906,7 @@ equating it to a function definition elsewhere.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_ASSIMILATED_ARRAY_ENTRIES</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"excessively long Verb or Extend"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"excessively long Verb or Extend"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">val_pile</span><span class="plain-syntax">[</span><span class="identifier-syntax">no_assimilated_array_entries</span><span class="plain-syntax">] = </span><span class="identifier-syntax">val</span><span class="plain-syntax">;</span>
@ -946,7 +950,7 @@ in this section.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::set_kit_error_location_near_splat</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::set_current_location_near_splat</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">raw_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">local_var_names</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">line_offset</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
@ -973,8 +977,12 @@ in this section.
<span class="plain-syntax"> </span><span class="identifier-syntax">raw_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]; </span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]; </span><span class="identifier-syntax">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp_at</span><span class="plain-syntax">[1];</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *%[ *([A-Za-z0-9_`]+) *(%c*?); *(%c*)"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">raw_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]; </span><span class="identifier-syntax">local_var_names</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1]; </span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[2]; </span><span class="identifier-syntax">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp_at</span><span class="plain-syntax">[2];</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *%[ *(%c+?) *; *(%c*)"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 routine declaration: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 routine declaration"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">start</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::truncate</span><span class="plain-syntax">(</span><span class="identifier-syntax">start</span><span class="plain-syntax">, </span><span class="constant-syntax">50</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 routine declaration: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">start</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">pos</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'\n'</span><span class="plain-syntax">)</span>
@ -1017,7 +1025,11 @@ supported only to avoid throwing errors.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">N</span><span class="plain-syntax">&lt;0) || (</span><span class="identifier-syntax">N</span><span class="plain-syntax">&gt;15)) </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=1; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;=</span><span class="identifier-syntax">N</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">local_var_names</span><span class="plain-syntax">, </span><span class="string-syntax">"x%d "</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">body</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"rfalse; ];"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 Stub declaration"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">start</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::truncate</span><span class="plain-syntax">(</span><span class="identifier-syntax">start</span><span class="plain-syntax">, </span><span class="constant-syntax">50</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"invalid #Stub declaration: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">start</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-css.html#SP3_2">&#167;3.2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_2_3" class="paragraph-anchor"></a><b>&#167;3.2.3. </b>Function packages have a standardised shape in Inter, and though this is a
@ -1091,14 +1103,14 @@ which contains the actual code.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">invalid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">i</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Characters::isdigit</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">))) </span><span class="identifier-syntax">invalid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> != </span><span class="character-syntax">'_'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Characters::isalnum</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">Characters::isdigit</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">invalid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Characters::isdigit</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) </span><span class="identifier-syntax">invalid</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">invalid</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="string-syntax">"'%S' in function '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 local variable name: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"invalid Inform 6 local variable name: %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">loc_name</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterSymbolsTable::create_with_unique_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">InterPackage::scope</span><span class="plain-syntax">(</span><span class="identifier-syntax">IP</span><span class="plain-syntax">), </span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
@ -1126,7 +1138,7 @@ which contains the actual code.
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">L</span><span class="plain-syntax">&gt;0) &amp;&amp; (</span><span class="identifier-syntax">Characters::is_whitespace</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">body</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-1)))) </span><span class="identifier-syntax">L</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::truncate</span><span class="plain-syntax">(</span><span class="identifier-syntax">body</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">InterBookmark::baseline</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">) + </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">prov</span><span class="plain-syntax"> = </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::get_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_provenance</span><span class="plain-syntax"> </span><span class="identifier-syntax">prov</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I6Errors::get_current_location</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Provenance::advance_line</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">prov</span><span class="plain-syntax">, </span><span class="identifier-syntax">line_offset</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="3-css.html#SP12" class="function-link"><span class="function-syntax">CompileSplatsStage::function_body</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">css</span><span class="plain-syntax">, </span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">IP</span><span class="plain-syntax">, </span><span class="identifier-syntax">B</span><span class="plain-syntax">, </span><span class="identifier-syntax">body</span><span class="plain-syntax">, </span><span class="identifier-syntax">block_bookmark</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SplatInstruction::namespace</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">prov</span><span class="plain-syntax">);</span>
@ -1140,12 +1152,11 @@ which contains the actual code.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">NS</span><span class="plain-syntax">) == </span><span class="character-syntax">'+'</span><span class="plain-syntax">) </span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">NS</span><span class="plain-syntax">) == </span><span class="character-syntax">'-'</span><span class="plain-syntax">) </span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">L</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">NS</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_CONNECTORS</span><span class="plain-syntax">, </span><span class="string-syntax">"Assign namespace '%S' to $3\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterSymbol::set_namespace</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">INTER_CONNECTORS</span><span class="plain-syntax">, </span><span class="string-syntax">"Trying to apply '%S' to $3\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
@ -1153,18 +1164,20 @@ which contains the actual code.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"private"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">terms</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">terms</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"the +private annotation is redundant here"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"the +private annotation is redundant in namespace '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"the +private annotation does not take any terms"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the +private annotation does not take any terms"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"public"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">terms</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">terms</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"the +public annotation is redundant here"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"the +public annotation is redundant in namespace '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"the +public annotation does not take any terms"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the +public annotation does not take any terms"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"replacing"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"_"</span><span class="plain-syntax">; </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">keeping</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -1176,21 +1189,28 @@ which contains the actual code.
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"_"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"keeping"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">keeping</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"expected 'from K' or 'keeping', not '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"expected 'from K' or 'keeping' in '+replacing(...)', not '%S'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the +replacing annotation does not take the term '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the +replacing annotation does not take the term '%S'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterSymbol::set_replacement</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">keeping</span><span class="plain-syntax">) </span><span class="identifier-syntax">SymbolAnnotation::set_b</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">KEEPING_IANN</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"namespace"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the annotation '%S' must be followed by a ';'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"annotation '%S' not recognised"</span><span class="plain-syntax">, </span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the annotation '+%S' is not one of those allowed"</span><span class="plain-syntax">, </span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">apply_private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="identifier-syntax">SymbolAnnotation::set_b</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">PRIVATE_IANN</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Plumbing. </b>Some convenient Inter utilities.
@ -1452,7 +1472,7 @@ from command parser grammar: slightly different syntax applies there.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">marker</span><span class="plain-syntax">) *</span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterValuePairs::symbolic</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">symb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unknown scope routine"</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"can't find any scope routine called '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterValuePairs::number</span><span class="plain-syntax">(1);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -1462,7 +1482,7 @@ from command parser grammar: slightly different syntax applies there.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">marker</span><span class="plain-syntax">) *</span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterValuePairs::symbolic</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">symb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unknown noun routine"</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"can't find any noun routine called '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterValuePairs::number</span><span class="plain-syntax">(1);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -1508,12 +1528,12 @@ before they are needed.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParsingSchemas::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::get_kit_error_location</span></a><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ParsingSchemas::from_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">I6Errors::get_current_location</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">excess_tokens</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result_s</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="3-css.html#SP8" class="function-link"><span class="function-syntax">CompileSplatsStage::compute_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">step</span><span class="plain-syntax">, </span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">node_tree</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">excess_tokens</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result_s</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 constant too complex"</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result_s</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="comment-syntax"> a precaution, but should no longer happen</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 constant too complex"</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterValuePairs::number</span><span class="plain-syntax">(1);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">InterValuePairs::symbolic</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">result_s</span><span class="plain-syntax">);</span>
@ -1789,13 +1809,13 @@ kit <span class="extract"><span class="extract-syntax">CommandParserKit</span></
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">LinkedLists::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parsing_errors</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">schema_parsing_error</span><span class="plain-syntax"> *</span><span class="identifier-syntax">err</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">, </span><span class="identifier-syntax">schema_parsing_error</span><span class="plain-syntax">, </span><span class="identifier-syntax">sch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parsing_errors</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::set_kit_error_location</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::set_current_location</span><span class="plain-syntax">(</span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">, </span><span class="string-syntax">"in function '%S': %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">message</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 syntax error %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"Inform 6 syntax error %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">msg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">msg</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::clear_kit_error_location</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::clear_current_location</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -214,7 +214,7 @@ in <span class="extract"><span class="extract-syntax">K/Sections</span></span>.
<span class="plain-syntax"> &amp;(</span><a href="3-ps.html#SP3" class="function-link"><span class="function-syntax">ParsingStages::receive_command</span></a><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><a href="3-ps.html#SP4" class="function-link"><span class="function-syntax">ParsingStages::receive_bplus</span></a><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><a href="3-ps.html#SP5" class="function-link"><span class="function-syntax">ParsingStages::line_marker</span></a><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">),</span>
<span class="plain-syntax"> &amp;(</span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">step</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">ephemera</span><span class="plain-syntax">.</span><span class="element-syntax">the_kit</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">state</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-ps.html#SP2">&#167;2</a>, <a href="3-ps.html#SP2_2">&#167;2.2</a>.</li></ul>
@ -407,71 +407,25 @@ state being carried in the docket.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">ParsingStages::splat</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">ParsingStages::splat</span></span>:<br/><a href="3-ps.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">simple_tangle_docket</span><span class="plain-syntax"> *</span><span class="identifier-syntax">docket</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rpi_docket_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">rpi_docket_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">docket</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">state</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::set_current_location</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-ps.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Find annotation, if any</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-ps.html#SP7_2" class="named-paragraph-link"><span class="named-paragraph">Find directive</span><span class="named-paragraph-number">7.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> != </span><span class="identifier-syntax">WHITESPACE_PLM</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rpi_docket_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">rpi_docket_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">docket</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">state</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_bookmark</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IBM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">assimilation_point</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="character-syntax">'\n'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">lc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::get_filename</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lc</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">Provenance::get_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::guard</span><span class="plain-syntax">(</span><span class="identifier-syntax">SplatInstruction::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">lc</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">InterBookmark::baseline</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">) + </span><span class="constant-syntax">1</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> != </span><span class="identifier-syntax">WHITESPACE_PLM</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="3-ps.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Splat the directive</span><span class="named-paragraph-number">7.3</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">A</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6_annotation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IA</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I6Annotations::parse</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">IA</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"namespace"</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rpi_docket_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">rpi_docket_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">docket</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">state</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6_annotation_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">term</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">, </span><span class="identifier-syntax">I6_annotation_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">terms</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"_"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"access"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"private"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"public"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the 'access' must be 'private' or 'public', not '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the +namespace annotation does not take the term '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bad_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;Str::len(state-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Characters::isalpha</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">bad_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Characters::isalnum</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> != </span><span class="character-syntax">'_'</span><span class="plain-syntax">)) </span><span class="identifier-syntax">bad_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bad_name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"a namespace name should begin with a letter and contain "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"only alphanumeric characters or '_'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"use '+namespace(main);' to return to the global namespace"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"main"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"replaced"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the namespace 'replaced' is reserved, and cannot be used directly"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="character-syntax">'-'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="character-syntax">'+'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-ps.html#SP7_4" class="named-paragraph-link"><span class="named-paragraph">Respond to a change of namespace</span><span class="named-paragraph-number">7.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> (*(</span><span class="identifier-syntax">docket</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">error_callback</span><span class="plain-syntax">))(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this annotation seems not to apply to any directive: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the annotation '%S' seems not to apply to any directive: "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"only '+namespace' can do that"</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::clear_current_location</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">)</span>
@ -484,8 +438,7 @@ state being carried in the docket.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">verdict</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I6Annotations::check</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">verdict</span><span class="plain-syntax"> == -1) {</span>
<span class="plain-syntax"> (*(</span><span class="identifier-syntax">docket</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">error_callback</span><span class="plain-syntax">))(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this Inform 6 annotation is malformed: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"this +annotation is malformed: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">verdict</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::trim_white_space</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">);</span>
@ -506,13 +459,13 @@ the directive type as 0.
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%[) *(%c*);%c*"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ROUTINE_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+) *(%c*);%c*"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"#ifdef"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFDEF_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"#ifndef"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFNDEF_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"#iftrue"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFTRUE_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"#ifnot"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFNOT_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"#endif"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ENDIF_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"#stub"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">STUB_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *#*(%C+) *(%c*);%c*"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Ifdef"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFDEF_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Ifndef"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFNDEF_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Iftrue"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFTRUE_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Ifnot"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">IFNOT_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Endif"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ENDIF_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Stub"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">STUB_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Constant"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CONSTANT_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Global"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GLOBAL_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Array"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ARRAY_PLM</span><span class="plain-syntax">;</span>
@ -531,12 +484,114 @@ the directive type as 0.
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) != </span><span class="character-syntax">';'</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MYSTERY_PLM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MYSTERY_PLM</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> (*(</span><span class="identifier-syntax">docket</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">error_callback</span><span class="plain-syntax">))(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this Inform 6 directive is not supported in kits or '(-' inclusions: '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax"> == </span><span class="identifier-syntax">MYSTERY_PLM</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Ifv3"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Ifv5"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Iffalse"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Abbreviate"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Dictionary"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Import"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Link"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Lowstring"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Origsource"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Replace"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Switches"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Trace"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Undef"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"Version"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">known</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">known</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this Inform 6 directive is not supported in kits or '(-' inclusions: '%S' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(only #Ifdef, #Ifndef, #Iftrue, #Ifnot, #Endif, #Stub, Constant, Global, "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Array, Attribute, Property, Verb, Fake_action, Object, Default are "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"supported)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"this is not an Inform 6 directive"</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Regexp::dispose_of</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-ps.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_3" class="paragraph-anchor"></a><b>&#167;7.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Splat the directive</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_bookmark</span><span class="plain-syntax"> *</span><span class="identifier-syntax">IBM</span><span class="plain-syntax"> = </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">assimilation_point</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="character-syntax">'\n'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">lc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Provenance::is_somewhere</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Provenance::get_filename</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lc</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="identifier-syntax">Provenance::get_line</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">provenance</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::guard</span><span class="plain-syntax">(</span><span class="identifier-syntax">SplatInstruction::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="identifier-syntax">I6_dir</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">lc</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) (</span><span class="identifier-syntax">InterBookmark::baseline</span><span class="plain-syntax">(</span><span class="identifier-syntax">IBM</span><span class="plain-syntax">) + </span><span class="constant-syntax">1</span><span class="plain-syntax">), </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">));</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-ps.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_4" class="paragraph-anchor"></a><b>&#167;7.4. </b>So the following picks up <span class="extract"><span class="extract-syntax">+namespace(Whatever)</span></span> annotations, which do not
apply to any directive.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Respond to a change of namespace</span><span class="named-paragraph-number">7.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6_annotation_term</span><span class="plain-syntax"> *</span><span class="identifier-syntax">term</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">, </span><span class="identifier-syntax">I6_annotation_term</span><span class="plain-syntax">, </span><span class="identifier-syntax">IA</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">terms</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"_"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"access"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"private"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"public"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">private</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"in a +namespace annotation, the 'access' must be 'private' or "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'public', not '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the +namespace annotation does not take the term '%S'"</span><span class="plain-syntax">, </span><span class="identifier-syntax">term</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">key</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="3-ps.html#SP7_4_1" class="named-paragraph-link"><span class="named-paragraph">Vet the new namespace name</span><span class="named-paragraph-number">7.4.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="character-syntax">'-'</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">private</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="character-syntax">'+'</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-ps.html#SP7">&#167;7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_4_1" class="paragraph-anchor"></a><b>&#167;7.4.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Vet the new namespace name</span><span class="named-paragraph-number">7.4.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bad_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;Str::len(state-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Characters::isalpha</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">bad_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Characters::isalnum</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">) == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> != </span><span class="character-syntax">'_'</span><span class="plain-syntax">)) </span><span class="identifier-syntax">bad_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bad_name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the namespace '%S' is not allowed: namespace names should begin "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"with a letter and contain only alphanumeric characters or '_'"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'+namespace()' is not allowed: use '+namespace(main);' to return "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to the global namespace"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"main"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"main"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"'+namespace(...)' names are case-sensitive: use 'main', not '%S', "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"to return to the global namespace"</span><span class="plain-syntax">, </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"replaced"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the namespace 'replaced' is reserved, and cannot be used directly"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">namespace</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="3-ps.html#SP7_4">&#167;7.4</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>And that's it: the result of these stages is just to break the I6T source they
found up into individual directives, and put them into the tree as <span class="extract"><span class="extract-syntax">SPLAT_IST</span></span> nodes.
No effort has been made yet to see what directives they are. Subsequent stages

View file

@ -139,8 +139,9 @@ a nesting depth of about 3, so the following maximum is plenty:
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">.</span><span class="identifier-syntax">cc_sp</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><a href="3-rccs.html#SP3" class="function-link"><span class="function-syntax">ResolveConditionalsStage::visitor</span></a><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">state</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">state</span><span class="plain-syntax">.</span><span class="element-syntax">cc_sp</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"conditional compilation wrongly structured: not enough #endif"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::clear_current_location</span><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure rcc_state is private to this section.</li></ul>
@ -155,6 +156,7 @@ is written such that this can safely be done.)
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">compile_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;state-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">compile_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inode::is</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">SPLAT_IST</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::set_current_location_near_splat</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SplatInstruction::splatter</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">SplatInstruction::plm</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">CONSTANT_PLM:</span>
@ -268,17 +270,55 @@ Inform kits use this only to test <span class="extract"><span class="extract-syn
<span class="plain-syntax"> </span><span class="identifier-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Regexp::create_mr</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+?) *== *(%d+) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symbol</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LargeScale::architectural_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LargeScale::architectural_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbol::evaluate_to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">V</span><span class="plain-syntax"> == </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+?) *&gt;= *(%d+) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LargeScale::architectural_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbol::evaluate_to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+?) *&gt; *(%d+) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LargeScale::architectural_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbol::evaluate_to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+?) *&lt;= *(%d+) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LargeScale::architectural_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbol::evaluate_to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &lt;= </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Regexp::match</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+?) *&lt; *(%d+) *"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symbol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">LargeScale::architectural_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbol::evaluate_to_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">symbol</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::atoi</span><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">V</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">result</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NOT_APPLICABLE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"conditional compilation is too difficult: #iftrue on %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"conditional compilation is too difficult: #iftrue on '%S' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"(can only test SYMBOL == DECIMALVALUE, or &gt;, &lt;, &gt;=, &lt;=, where "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"the DECIMALVALUE is non-negative, and even then only for a few "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"symbols, of which 'WORDSIZE' is the most useful)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RESOLVING_CONDITIONAL_COMPILATION</span><span class="plain-syntax">, </span><span class="string-syntax">"Must decide if %S: "</span><span class="plain-syntax">, </span><span class="identifier-syntax">cond</span><span class="plain-syntax">);</span>
@ -295,7 +335,7 @@ Inform kits use this only to test <span class="extract"><span class="extract-syn
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_CC_STACK_SIZE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAX_CC_STACK_SIZE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"conditional compilation wrongly structured: too many nested #ifdef or #iftrue"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
@ -308,7 +348,7 @@ Inform kits use this only to test <span class="extract"><span class="extract-syn
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">RESOLVING_CONDITIONAL_COMPILATION</span><span class="plain-syntax">, </span><span class="string-syntax">"ifnot\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"conditional compilation wrongly structured: #ifnot at top level"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"conditional compilation wrongly structured: #ifnot at top level"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax">-1] = (</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax">-1])?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">compile_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -323,7 +363,7 @@ Inform kits use this only to test <span class="extract"><span class="extract-syn
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">cc_sp</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">state</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">cc_sp</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-pe.html#SP3" class="function-link"><span class="function-syntax">PipelineErrors::kit_error</span></a><span class="plain-syntax">(</span><span class="string-syntax">"conditional compilation wrongly structured: too many #endif"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::issue</span><span class="plain-syntax">(</span><span class="string-syntax">"conditional compilation wrongly structured: too many #endif"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">compile_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
</pre>

View file

@ -154,14 +154,14 @@ should be, so the effect is the same.
<span class="plain-syntax"> </span><span class="identifier-syntax">Architectures::to_codename</span><span class="plain-syntax">(</span><span class="identifier-syntax">A</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">requirements_list</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">attachment_instruction</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PipelineErrors::reset_errors</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">I6Errors::reset_count</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">RunningPipelines::run</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">SS</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">associated_copy</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">location_if_path</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">requirements_list</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">for_vm</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PipelineModule::set_architecture_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">saved_A</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">SourceProblems::kit_notification</span><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PipelineErrors::errors_occurred</span><span class="plain-syntax">())?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">I6Errors::errors_occurred</span><span class="plain-syntax">())?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Errors::nowhere</span><span class="plain-syntax">(</span><span class="string-syntax">"build-kit pipeline could not be parsed"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>

View file

@ -94,14 +94,14 @@ int InterSkill::build_kit_internally(build_skill *skill, build_step *S,
Architectures::to_codename(A));
#endif
linked_list *requirements_list = NEW_LINKED_LIST(attachment_instruction);
PipelineErrors::reset_errors();
I6Errors::reset_count();
RunningPipelines::run(NULL, SS, NULL, S->associated_copy->location_if_path,
requirements_list, S->for_vm, FALSE);
PipelineModule::set_architecture_to(saved_A);
#ifdef CORE_MODULE
SourceProblems::kit_notification(NULL, NULL);
#endif
return (PipelineErrors::errors_occurred())?FALSE:TRUE;
return (I6Errors::errors_occurred())?FALSE:TRUE;
} else {
Errors::nowhere("build-kit pipeline could not be parsed");
return FALSE;

View file

@ -1,9 +1,9 @@
Total memory consumption was 123104K = 120 MB
Total memory consumption was 123110K = 120 MB
---- was used for 2061850 objects, in 367513 frames in 0 x 800K = 0K = 0 MB:
33.1% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
20.9% text_stream_array 4678 x 100 = 467800 objects, 26346496 bytes
20.8% text_stream_array 4678 x 100 = 467800 objects, 26346496 bytes
19.7% linked_list 44435 objects, 24883600 bytes
11.2% inter_symbol_array 133 x 1024 = 136192 objects, 14168224 bytes
10.6% inter_error_stash_array 102 x 1024 = 104448 objects, 13372608 bytes
@ -248,7 +248,7 @@ Total memory consumption was 123104K = 120 MB
100.0% was used for memory not allocated for objects:
57.5% text stream storage 72515996 bytes in 487440 claims
57.5% text stream storage 72522576 bytes in 487482 claims
4.2% dictionary storage 5315584 bytes in 7623 claims
---- sorting 2720 bytes in 387 claims
5.7% source text 7200000 bytes in 3 claims

View file

@ -1,34 +1,32 @@
100.0% in inform7 run
70.8% in compilation to Inter
50.1% in //Sequence::undertake_queued_tasks//
4.8% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
1.9% in //ImperativeDefinitions::assess_all//
1.5% in //RTKindConstructors::compile//
1.5% in //RTPhrasebook::compile_entries//
1.1% in //Sequence::lint_inter//
0.5% in //MajorNodes::pass_2//
0.5% in //Sequence::undertake_queued_tasks//
0.5% in //Sequence::undertake_queued_tasks//
0.5% in //World::stage_V//
0.3% in //ImperativeDefinitions::compile_first_block//
0.1% in //Closures::compile_closures//
0.1% in //CompletionModule::compile//
0.1% in //InferenceSubjects::emit_all//
0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
2.3% not specifically accounted for
25.8% in running Inter pipeline
9.8% in step 14/15: generate inform6 -> auto.inf
5.7% in step 5/15: load-binary-kits
5.2% in step 6/15: make-synoptic-module
1.7% in step 9/15: make-identifiers-unique
0.3% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls
0.1% in step 11/15: eliminate-redundant-labels
1.5% not specifically accounted for
2.8% in supervisor
0.4% not specifically accounted for
70.5% in compilation to Inter
49.7% in //Sequence::undertake_queued_tasks//
4.9% in //MajorNodes::pre_pass//
3.5% in //MajorNodes::pass_1//
1.8% in //ImperativeDefinitions::assess_all//
1.4% in //RTKindConstructors::compile//
1.4% in //RTPhrasebook::compile_entries//
1.0% in //Sequence::lint_inter//
0.6% in //World::stage_V//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //MajorNodes::pass_2//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //Sequence::undertake_queued_tasks//
0.2% in //CompletionModule::compile//
0.2% in //InferenceSubjects::emit_all//
0.2% in //RTKindConstructors::compile_permissions//
0.2% in //Task::make_built_in_kind_constructors//
3.3% not specifically accounted for
25.9% in running Inter pipeline
9.9% in step 14/15: generate inform6 -> auto.inf
5.8% in step 5/15: load-binary-kits
5.3% in step 6/15: make-synoptic-module
1.8% in step 9/15: make-identifiers-unique
0.4% in step 12/15: eliminate-redundant-operations
0.4% in step 4/15: compile-splats
0.4% in step 7/15: shorten-wiring
0.2% in step 11/15: eliminate-redundant-labels
0.2% in step 8/15: detect-indirect-calls
1.3% not specifically accounted for
3.1% in supervisor
0.5% not specifically accounted for

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "BasicInformExtrasKit",
"version": "10.2.0-beta+6W39"
"version": "10.2.0-beta+6W40"
},
"kit-details": {
"has-priority": 1

View file

@ -2,7 +2,7 @@
"is": {
"type": "kit",
"title": "BasicInformKit",
"version": "10.2.0-beta+6W39"
"version": "10.2.0-beta+6W40"
},
"needs": [ {
"unless": {

View file

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

View file

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

View file

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

View file

@ -0,0 +1,125 @@
"Disasterama"
The Scene of the Crime is a room.
Include (-
Array supposed string "Banana";
Array supposed2 struct { 2, 3, 4 };
Array helium -> ['H' 'e'];
Array lithium -> ['L';; ; 'i'];
Array manganese -> 'M' 'n';
Array molybdenum -> ['M'; 'b'];
Array sizeplus --> 2 + 7;
Array sizeplusok --> (2 + 7);
Array sizeminus --> 2 - 7;
Array sizeminusok --> (2 - 7);
Array sizetimes --> 2 * 7;
Array sizetimesok --> (2 * 7);
Array sizedivide --> 2 / 7;
Array sizedivideok --> (2 / 7);
Array passwordok -> ['X'; 'y'; 'z'; 'z'; 'y'];
Array password -> 'H' 'e' 'l' 'l' 'o';
Hypothetical 10;
Link;
+namespace(Whatever) [ Banana; ];
[ "hello" ];
#Stub X "banana";
[ Routine 12 1aa "semolina" _ok ok ok123 OK_456; ];
+silly [ Stuff; ];
+private(23) [ Alpha; ];
+public(quietly) [ Beta; ];
+namespace(MammalKit, access whimsical);
+namespace(BirdKit, level 4);
+namespace("This");
+namespace(10);
+namespace(Main);
+namespace(replaced);
+private();
+namespace(AmphibianKit, access private);
+private [ FrogMonitor; ];
+namespace();
+namespace(ReptileKit, access public);
+public [ CloudLizardMonitor; ];
+namespace();
+replacing(sideways) [ This; ];
+replacing(route=sideways) [ This; ];
Verb "grab" * scope=Bogus noun=JustAsBogus;
Constant STUFF = 200;
#iftrue STUFF == 201;
#endif;
#ifnot;
#endif;
[ Dud1 x y;
x = @mul 12 12 -> y;
];
[ Dud2;
#ifdef STUFF;
];
[ Dud3;
#endif;
];
[ Dud4;
#ifdef;
#endif;
];
[ Dud4;
#iftrue;
#endif;
];
[ Dud5 x y;
if (x == @mul 12 12 -> y) print "Ok!";
];
[ Dud6;
glk(14, 2, 3);
];
[ Dud7 x;
x.call(1, 2, 3, 4, 5);
];
[ Dud8;
print $f05g;
];
[ Dud9;
print .Label;
];
[ Dud10;
.1534;
];
[ Dud11;
print print "Hello";
];
[ Dud12;
objectloop(12) print "Yes.";
];
[ Dud13;
do print "X";
];
[ Dud14;
font "Times New Roman";
];
[ Dud15 x y;
move x y;
];
[ Dud16;
for;
];
[ Dud17;
for ();
];
[ Dud18;
for (:::::);
];
[ Dud19;
print 3 + + 17;
];
#ifdef Tosh;
[ WontBeCompiled; ];
-).

View file

@ -0,0 +1,212 @@
Inform 7 v10.2.0 has started.
I've now read your source text, which is 12 words long.
I've also read Basic Inform by Graham Nelson, which is 7792 words long.
I've also read English Language by Graham Nelson, which is 2330 words long.
I've also read Standard Rules by Graham Nelson, which is 34311 words long.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 24): this is not an
Inform 6 directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 25): this Inform 6
directive is not supported in kits or '(-' inclusions: 'Link;' (only
#Ifdef, #Ifndef, #Iftrue, #Ifnot, #Endif, #Stub, Constant, Global, Array,
Attribute, Property, Verb, Fake_action, Object, Default are supported).
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 36): in a +namespace
annotation, the 'access' must be 'private' or 'public', not 'whimsical'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 37): the +namespace
annotation does not take the term 'level'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 38): this +annotation
is malformed: '+namespace("This");'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 38): this is not an
Inform 6 directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 39): the namespace
'10' is not allowed: namespace names should begin with a letter and contain
only alphanumeric characters or '_'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 40):
'+namespace(...)' names are case-sensitive: use 'main', not 'Main', to
return to the global namespace.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 41): the namespace
'replaced' is reserved, and cannot be used directly.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 42): the annotation
'+private()' seems not to apply to any directive: only '+namespace' can do
that.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 45): '+namespace()'
is not allowed: use '+namespace(main);' to return to the global namespace.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 48): '+namespace()'
is not allowed: use '+namespace(main);' to return to the global namespace.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 55): conditional
compilation is too difficult: #iftrue on 'STUFF==201' (can only test SYMBOL
== DECIMALVALUE, or >, =,
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 57): conditional
compilation wrongly structured: #ifnot at top level.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 58): conditional
compilation wrongly structured: too many #endif.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 123): conditional
compilation wrongly structured: not enough #endif.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 27): the annotation
'+namespace(Whatever)' must be followed by a ';'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 29): invalid Inform 6
routine declaration: '"hello" ]'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 30): invalid #Stub
declaration: '#Stub X "banana"; '.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 31): invalid Inform 6
local variable name: '12' in function 'Routine'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 31): invalid Inform 6
local variable name: '1aa' in function 'Routine'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 31): invalid Inform 6
local variable name: '"semolina"' in function 'Routine'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 33): the annotation
'+silly' is not one of those allowed.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 34): the +private
annotation does not take any terms.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 35): the +public
annotation does not take any terms.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 44): the +private
annotation is redundant in namespace 'AmphibianKit'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 47): the +public
annotation is redundant in namespace 'ReptileKit'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 49): expected 'from
K' or 'keeping' in '+replacing(...)', not 'sideways'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 50): the +replacing
annotation does not take the term 'route'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 7): cannot make array
'supposed': the 'string' initialiser is unsupported.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 8): cannot make array
'supposed2': the initial value syntax is unrecognised.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 9): multiple entries
between ';' markers in array 'helium'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 10): array 'lithium'
contains empty entry.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 10): array 'lithium'
contains empty entry.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 13): array 'sizeplus'
gives its size using operator '+' (use brackets '(' ... ')' around the size
for a calculated array size).
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 15): array
'sizeminus' gives its size using operator '-' (use brackets '(' ... ')'
around the size for a calculated array size).
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 17): array
'sizetimes' gives its size using operator '*' (use brackets '(' ... ')'
around the size for a calculated array size).
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 19): array
'sizedivide' gives its size using operator '/' (use brackets '(' ... ')'
around the size for a calculated array size).
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 52): can't find any
scope routine called 'Bogus'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 52): can't find any
noun routine called 'JustAsBogus'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 60): Inform 6 syntax
error in function 'Dud1': '@mul' was unexpected in expression context.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 63): Inform 6 syntax
error in function 'Dud2': no matching '#endif'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 63): Inform 6 syntax
error in function 'Dud2': misplaced directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 66): Inform 6 syntax
error in function 'Dud3': misplaced directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 70): Inform 6 syntax
error in function 'Dud4': bare '#ifdef' or '#ifndef'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 70): Inform 6 syntax
error in function 'Dud4': misplaced directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 70): Inform 6 syntax
error in function 'Dud4': misplaced directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 74): Inform 6 syntax
error in function 'Dud4': malformed '#if...'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 74): Inform 6 syntax
error in function 'Dud4': misplaced directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 74): Inform 6 syntax
error in function 'Dud4': misplaced directive.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 77): Inform 6 syntax
error in function 'Dud5': '@mul' was unexpected in expression context.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 80): Inform 6 syntax
error in function 'Dud6': the glk() function is now unsupported.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 83): Inform 6 syntax
error in function 'Dud7': too many arguments for call-message.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 86): Inform 6 syntax
error in function 'Dud8': malformed literal number '$f05g'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 89): Inform 6 syntax
error in function 'Dud9': label in unexpected place.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 92): Inform 6 syntax
error in function 'Dud10': expected label name but found '1534'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 95): Inform 6 syntax
error in function 'Dud11': statement in unexpected place.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 98): Inform 6 syntax
error in function 'Dud12': 'objectloop' without visible variable.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 101): Inform 6 syntax
error in function 'Dud13': do without until.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 104): Inform 6 syntax
error in function 'Dud14': expected 'on' or 'off' after 'font', not 'Times
New Roman'.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 107): Inform 6 syntax
error in function 'Dud15': move without to.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 110): Inform 6 syntax
error in function 'Dud16': 'for' header with too few clauses.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 113): Inform 6 syntax
error in function 'Dud17': 'for' header with too few clauses.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 116): Inform 6 syntax
error in function 'Dud18': 'for' header with too many clauses.
Problem__ PM_I6SyntaxError
>--> Inform 6 syntax error near here (source text, line 119): Inform 6 syntax
error in function 'Dud19': operator '+' used with 1 not 2 operand(s).
Inform 7 has finished.

View file

@ -674,7 +674,7 @@ void SourceProblems::I6_level_error(char *message, text_stream *quote,
notified_kit_name, notified_architecture_name);
trigger_kit_notice = FALSE;
}
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(...));
StandardProblems::handmade_problem(Task::syntax_tree(), _p_(PM_I6SyntaxError));
Problems::quote_stream(1, M);
if (Str::len(kit) > 0) {
Problems::quote_stream(2, file);
@ -686,7 +686,7 @@ void SourceProblems::I6_level_error(char *message, text_stream *quote,
LOG("%S, line %d:\n", file, line);
Problems::problem_quote_file(2, file, line);
Problems::issue_problem_segment(
"A mistake was found in the Inform 6-syntax code near here %2: %1.");
"Inform 6 syntax error near here %2: %1.");
} else {
Problems::issue_problem_segment(
"My low-level reader of source code reported a mistake - \"%1\". "

View file

@ -82,7 +82,7 @@ void CompileSchemas::sch_emit_inner(i6_schema *sch, pcalc_term *pt1, pcalc_term
EmitInterSchemas::emit(Emit::tree(), &VH, sch->compiled,
IdentifierFinders::common_names_only(),
&CompileSchemas::from_schema_token, NULL, &ems);
InterSchemas::internal_error_on_schema_errors(sch->compiled);
I6Errors::internal_error_on_schema_errors(sch->compiled);
}
@ So, then, this is called on each token in turn from the original schema. Note

View file

@ -164,7 +164,7 @@ all conditionals are resolved.
at = at->next_node;
}
if (endif_node == NULL) {
InterSchemas::throw_error(dir_node, I"no matching '#endif'");
I6Errors::issue_at_node(dir_node, I"no matching '#endif'");
return FALSE;
}
@ -177,6 +177,10 @@ all conditionals are resolved.
@<Work out what the condition is@> =
if ((dir_node->dir_clarifier == IFDEF_I6RW) ||
(dir_node->dir_clarifier == IFNDEF_I6RW)) {
if (dir_node->child_node == NULL) {
I6Errors::issue_at_node(dir_node, I"bare '#ifdef' or '#ifndef'");
return FALSE;
}
symbol_to_check = dir_node->child_node->expression_tokens->material;
} else {
inter_schema_node *to_eval = dir_node->child_node;
@ -184,7 +188,7 @@ all conditionals are resolved.
to_eval = to_eval->child_node;
if ((to_eval == NULL) || (to_eval->child_node == NULL) ||
(to_eval->child_node->expression_tokens == NULL)) {
InterSchemas::throw_error(dir_node, I"malformed '#if...'");
I6Errors::issue_at_node(dir_node, I"malformed '#if...'");
return FALSE;
}
symbol_to_check = to_eval->child_node->expression_tokens->material;
@ -328,8 +332,8 @@ void EmitInterSchemas::emit_recursively(inter_tree *I, inter_schema_node *node,
Note that recursion in |VAL_PRIM_CAT| mode evaluates |x|, |y| and |z|.
@<Assembly@> =
if (prim_cat != CODE_PRIM_CAT) {
InterSchemas::throw_error(node, I"assembly language unexpected here");
if (prim_cat != CODE_PRIM_CAT) { /* should never in fact happen */
I6Errors::issue_at_node(node, I"assembly language unexpected here");
return;
}
inter_schema_node *at = node->child_node;
@ -341,7 +345,7 @@ Note that recursion in |VAL_PRIM_CAT| mode evaluates |x|, |y| and |z|.
opcode_text = tok->material;
}
if (opcode_text == NULL) { /* should never in fact happen */
InterSchemas::throw_error(node, I"assembly language malformed here");
I6Errors::issue_at_node(node, I"assembly language malformed here");
return;
}
Produce::inv_assembly(I, opcode_text);
@ -422,7 +426,7 @@ changed back again very soon after.
} else if (Str::eq(tok->material, I"indirect")) {
at = at->next_node;
} else if (Str::eq(tok->material, I"glk")) {
InterSchemas::throw_error(node, I"the glk() function is now unsupported");
I6Errors::issue_at_node(node, I"the glk() function is now unsupported");
return;
} else {
to_call = IdentifierFinders::find_token(I, tok, finder);
@ -460,7 +464,7 @@ somewhere (in fact, always in a property value).
int argc = 0;
for (inter_schema_node *n = node->child_node; n; n=n->next_node) argc++;
if (argc > 4) {
InterSchemas::throw_error(node, I"too many arguments for call-message");
I6Errors::issue_at_node(node, I"too many arguments for call-message");
return;
}
inter_ti BIP = Primitives::BIP_for_indirect_call_returning_value(argc-1);
@ -477,7 +481,7 @@ more natural |{ ... }|.
@<Code block@> =
if (prim_cat != CODE_PRIM_CAT) {
InterSchemas::throw_error(node, I"unexpected '{ ... }' code block");
I6Errors::issue_at_node(node, I"unexpected '{ ... }' code block");
return;
}
if (node->unopened == FALSE) {
@ -496,7 +500,7 @@ other Inform 6 directives are not valid inside function bodies, which is the
only part of I6 syntax covered by schemas. Therefore:
@<Non-conditional directive@> =
InterSchemas::throw_error(node, I"misplaced directive");
I6Errors::issue_at_node(node, I"misplaced directive");
return;
@ An |EVAL_ISNT| node can have any number of children, they are sequentially
@ -504,7 +508,7 @@ evaluated for their potential side-effects, but only the last produces a value.
@<Eval block@> =
if ((prim_cat != CODE_PRIM_CAT) && (prim_cat != VAL_PRIM_CAT)){
InterSchemas::throw_error(node, I"expression in unexpected place");
I6Errors::issue_at_node(node, I"expression in unexpected place");
return;
}
if (node->child_node == NULL) Produce::val(I, K_value, InterValuePairs::number(1));
@ -610,7 +614,7 @@ parsing the schema.)
if (InterValuePairs::is_undef(val)) {
TEMPORARY_TEXT(msg)
WRITE_TO(msg, "malformed literal number '%S'", t->material);
InterSchemas::throw_error(node, msg);
I6Errors::issue_at_node(node, msg);
DISCARD_TEXT(msg)
return;
}
@ -642,7 +646,7 @@ parsing the schema.)
default: {
TEMPORARY_TEXT(msg)
WRITE_TO(msg, "'%S' was unexpected in expression context", t->material);
InterSchemas::throw_error(node, msg);
I6Errors::issue_at_node(node, msg);
DISCARD_TEXT(msg)
break;
}
@ -669,7 +673,7 @@ For example, the schema |.{-label:Say}{-counter-up:Say};| results in:
@<Label@> =
if (prim_cat != CODE_PRIM_CAT) {
InterSchemas::throw_error(node, I"label in unexpected place");
I6Errors::issue_at_node(node, I"label in unexpected place");
return;
}
TEMPORARY_TEXT(L)
@ -688,7 +692,7 @@ For example, the schema |.{-label:Say}{-counter-up:Say};| results in:
} else {
TEMPORARY_TEXT(msg)
WRITE_TO(msg, "expected label name but found '%S'", t->material);
InterSchemas::throw_error(node, msg);
I6Errors::issue_at_node(node, msg);
DISCARD_TEXT(msg)
return;
}
@ -778,7 +782,7 @@ on others.
@<Statement@> =
if (prim_cat != CODE_PRIM_CAT) {
InterSchemas::throw_error(node, I"statement in unexpected place");
I6Errors::issue_at_node(node, I"statement in unexpected place");
return;
}
if (node->isn_clarifier == CASE_BIP) Produce::set_level_to_current_code_block_plus(I, 2);
@ -848,7 +852,7 @@ these possibilities:
EIS_RECURSE(var_node, REF_PRIM_CAT);
EIS_RECURSE(cl_node, VAL_PRIM_CAT);
} else {
InterSchemas::throw_error(node, I"malformed 'objectloop' header");
I6Errors::issue_at_node(node, I"malformed 'objectloop' header");
return;
}
} else {
@ -861,7 +865,7 @@ these possibilities:
EIS_RECURSE(var_node, REF_PRIM_CAT);
Produce::val_symbol(I, K_value, IdentifierFinders::find(I, I"Object", finder));
} else {
InterSchemas::throw_error(node, I"'objectloop' without visible variable");
I6Errors::issue_at_node(node, I"'objectloop' without visible variable");
return;
}
}

View file

@ -0,0 +1,128 @@
[I6Errors::] Inform 6 Syntax Errors.
To issue problem messages when parsing malformed I6-syntax code.
@ Errors like these used to be basically failed assertions, but inevitably people
reported that as a bug (Mantis 0001596). It was never intended that Inform 6-syntax
hacking should be part of the outside-facing Inform language; but if you leave
power tools just lying around, people will eventually pick them up and wonder
what the red button marked "danger" does.
Note that |i6_syntax_error_location| is initially uninitialised and thus has
undefined contents, so we take care to blank it out if it is read before being
written to for the first time.
=
text_provenance i6_syntax_error_location;
int i6_syntax_error_location_set = FALSE;
text_provenance I6Errors::get_current_location(void) {
if (i6_syntax_error_location_set == FALSE)
I6Errors::clear_current_location();
return i6_syntax_error_location;
}
void I6Errors::clear_current_location(void) {
I6Errors::set_current_location(Provenance::nowhere());
}
void I6Errors::set_current_location(text_provenance where) {
i6_syntax_error_location_set = TRUE;
i6_syntax_error_location = where;
}
void I6Errors::set_current_location_near_splat(inter_tree_node *P) {
I6Errors::clear_current_location();
if ((P) && (Inode::is(P, SPLAT_IST)))
I6Errors::set_current_location(SplatInstruction::provenance(P));
}
@ The issuing mechanism, or rather, the mechanism used if the main Inform
compiler doesn't gazump us (in order to provide something better-looking in
the GUI apps).
=
int i6_syntax_error_count = 0;
void I6Errors::issue(char *message, text_stream *quote) {
text_provenance at = I6Errors::get_current_location();
#ifdef CORE_MODULE
SourceProblems::I6_level_error(message, quote, at);
#endif
#ifndef CORE_MODULE
if (Provenance::is_somewhere(at)) {
filename *F = Provenance::get_filename(at);
TEMPORARY_TEXT(M)
WRITE_TO(M, message, quote);
Errors::at_position_S(M, F, Provenance::get_line(at));
DISCARD_TEXT(M)
} else {
Errors::with_text(message, quote);
}
#endif
i6_syntax_error_count++;
}
void I6Errors::reset_count(void) {
I6Errors::clear_current_location();
i6_syntax_error_count = 0;
}
int I6Errors::errors_occurred(void) {
if (i6_syntax_error_count != 0) return TRUE;
return FALSE;
}
@ The functions below are for errors detected when parsing text into schemas, or
when emitting code from them.
Note that the |parsing_errors| field of a schema is null until the first error
is detected -- which, of course, it usually isn't. It holds a linked list of these:
=
typedef struct schema_parsing_error {
struct text_stream *message;
struct text_provenance provenance;
CLASS_DEFINITION
} schema_parsing_error;
@ =
void I6Errors::issue_at_node(inter_schema_node *at, text_stream *message) {
if (at->parent_schema->parsing_errors == NULL)
at->parent_schema->parsing_errors = NEW_LINKED_LIST(schema_parsing_error);
schema_parsing_error *err = CREATE(schema_parsing_error);
err->message = Str::duplicate(message);
if (at) {
if (Provenance::is_somewhere(at->provenance)) err->provenance = at->provenance;
else if (at->parent_schema) err->provenance = at->parent_schema->provenance;
else err->provenance = Provenance::nowhere();
} else {
err->provenance = Provenance::nowhere();
}
ADD_TO_LINKED_LIST(err, schema_parsing_error, at->parent_schema->parsing_errors);
LOG("Schema error: %S\n", message);
if ((at->parent_schema) && (Provenance::is_somewhere(at->parent_schema->provenance)))
LOG("Schema provenance %f, line %d\n",
Provenance::get_filename(at->parent_schema->provenance),
Provenance::get_line(at->parent_schema->provenance));
LOG("$1\n", at->parent_schema);
}
@ That function of course caches schema errors for playback later: well, here's
the later. Unless the main Inform compiler takes over from us, the result will
be drastic, halting what is presumably the |inter| tool:
=
void I6Errors::internal_error_on_schema_errors(inter_schema *sch) {
if (LinkedLists::len(sch->parsing_errors) > 0) {
#ifdef CORE_MODULE
SourceProblems::inter_schema_errors(sch);
#endif
#ifndef CORE_MODULE
WRITE_TO(STDERR, "Parsing error(s) in the internal schema '%S':\n",
sch->converted_from);
schema_parsing_error *err;
LOOP_OVER_LINKED_LIST(err, schema_parsing_error, sch->parsing_errors)
WRITE_TO(STDERR, "- %S\n", err->message);
exit(1);
#endif
}
}

View file

@ -646,59 +646,3 @@ text_stream *InterSchemas::lint_isn(inter_schema_node *isn, int depth) {
}
return NULL;
}
@h Errors.
Errors can be detected both when parsing text into schemas, and also when emitting
code from them. In either case, the following is used to attach error message(s)
to the schema itself.
Note that the |parsing_errors| field is null until the first error is detected --
which, of course, it usually isn't.
=
typedef struct schema_parsing_error {
struct text_stream *message;
struct text_provenance provenance;
CLASS_DEFINITION
} schema_parsing_error;
@ =
void InterSchemas::throw_error(inter_schema_node *at, text_stream *message) {
if (at->parent_schema->parsing_errors == NULL)
at->parent_schema->parsing_errors = NEW_LINKED_LIST(schema_parsing_error);
schema_parsing_error *err = CREATE(schema_parsing_error);
err->message = Str::duplicate(message);
if (at) {
if (Provenance::is_somewhere(at->provenance)) err->provenance = at->provenance;
else if (at->parent_schema) err->provenance = at->parent_schema->provenance;
else err->provenance = Provenance::nowhere();
} else {
err->provenance = Provenance::nowhere();
}
ADD_TO_LINKED_LIST(err, schema_parsing_error, at->parent_schema->parsing_errors);
LOG("Schema error: %S\n", message);
if ((at->parent_schema) && (Provenance::is_somewhere(at->parent_schema->provenance)))
LOG("Schema provenance %f, line %d\n",
Provenance::get_filename(at->parent_schema->provenance),
Provenance::get_line(at->parent_schema->provenance));
LOG("$1\n", at->parent_schema);
}
@ And this is an especially drastic way to deal with such errors:
=
void InterSchemas::internal_error_on_schema_errors(inter_schema *sch) {
if (LinkedLists::len(sch->parsing_errors) > 0) {
#ifdef CORE_MODULE
SourceProblems::inter_schema_errors(sch);
#endif
#ifndef CORE_MODULE
WRITE_TO(STDERR, "Parsing error(s) in the internal schema '%S':\n",
sch->converted_from);
schema_parsing_error *err;
LOOP_OVER_LINKED_LIST(err, schema_parsing_error, sch->parsing_errors)
WRITE_TO(STDERR, "- %S\n", err->message);
internal_error("malformed schema");
#endif
}
}

View file

@ -50,7 +50,7 @@ inter_schema *ParsingSchemas::from_i6s(text_stream *from,
Dictionaries::create(i6s_inter_schema_cache, from);
Dictionaries::write_value(i6s_inter_schema_cache, from, (void *) result);
InterSchemas::internal_error_on_schema_errors(result);
I6Errors::internal_error_on_schema_errors(result);
return result;
}

View file

@ -828,7 +828,7 @@ nodes, which we want to fold into just one:
operand1 = InterSchemas::second_dark_token(until_node);
cons->next_node = until_node->next_node;
} else {
InterSchemas::throw_error(cons, I"do without until");
I6Errors::issue_at_node(cons, I"do without until");
return FALSE;
}
@ -841,7 +841,7 @@ nodes, which we want to fold into just one:
TEMPORARY_TEXT(msg)
WRITE_TO(msg, "expected 'on' or 'off' after 'font', not '%S'",
n->material);
InterSchemas::throw_error(cons, msg);
I6Errors::issue_at_node(cons, msg);
DISCARD_TEXT(msg)
return FALSE;
}
@ -891,7 +891,7 @@ clause at all. We split these possibilities into two different statement nodes.
to = InterSchemas::next_dark_token(to);
}
if (to == NULL) {
InterSchemas::throw_error(cons, I"move without to");
I6Errors::issue_at_node(cons, I"move without to");
return FALSE;
}
operand2 = InterSchemas::next_dark_token(to);
@ -1239,7 +1239,7 @@ int Ramification::break_for_statements(inter_schema_node *par, inter_schema_node
(isn->node_marked == FALSE)) {
inter_schema_node *predicates = isn->child_node;
if ((predicates == NULL) || (predicates->isn_type != EXPRESSION_ISNT)) {
InterSchemas::throw_error(isn, I"malformed 'for' loop");
I6Errors::issue_at_node(isn, I"malformed 'for' loop");
return FALSE;
}
inter_schema_token *n = predicates->expression_tokens;
@ -1267,7 +1267,7 @@ int Ramification::break_for_statements(inter_schema_node *par, inter_schema_node
n = n->next;
}
if (cw != 3) {
InterSchemas::throw_error(isn, I"'for' header with too few clauses");
I6Errors::issue_at_node(isn, I"'for' header with too few clauses");
return FALSE;
}
for (int i=0; i<3; i++) {
@ -1308,7 +1308,7 @@ int Ramification::break_for_statements(inter_schema_node *par, inter_schema_node
@<End a for loop header clause@> =
if (cw >= 3) {
InterSchemas::throw_error(isn, I"'for' header with too many clauses");
I6Errors::issue_at_node(isn, I"'for' header with too many clauses");
return FALSE;
}
if (from[cw] == NULL) to[cw] = NULL;
@ -1336,7 +1336,7 @@ int Ramification::add_missing_bodies(inter_schema_node *par, inter_schema_node *
int actual = 0;
for (inter_schema_node *ch = isn->child_node; ch; ch=ch->next_node) actual++;
if ((actual < req-1) || (actual > req)) {
InterSchemas::throw_error(isn, I"malformed statement");
I6Errors::issue_at_node(isn, I"malformed statement");
return FALSE;
}
if (actual == req-1) {
@ -1718,7 +1718,7 @@ operation |a.b|.
WRITE_TO(msg, "operator '%S' used with %d not %d operand(s)",
I6Operators::I6_notation_for(isn->isn_clarifier),
a, I6Operators::arity(isn->isn_clarifier));
InterSchemas::throw_error(isn, msg);
I6Errors::issue_at_node(isn, msg);
DISCARD_TEXT(msg)
return FALSE;
}
@ -1894,32 +1894,32 @@ int Ramification::sanity_check(inter_schema_node *par, inter_schema_node *isn) {
for (inter_schema_token *t = isn->expression_tokens; t; t=t->next) {
switch (t->ist_type) {
case OPCODE_ISTT: asm = TRUE; break;
case RAW_ISTT: InterSchemas::throw_error(isn, I"malformed expression"); break;
case OPEN_BRACE_ISTT: InterSchemas::throw_error(isn, I"unexpected '{'"); break;
case CLOSE_BRACE_ISTT: InterSchemas::throw_error(isn, I"unexpected '}'"); break;
case OPEN_ROUND_ISTT: InterSchemas::throw_error(isn, I"unexpected '('"); break;
case CLOSE_ROUND_ISTT: InterSchemas::throw_error(isn, I"unexpected ')'"); break;
case COMMA_ISTT: InterSchemas::throw_error(isn, I"unexpected ','"); break;
case DIVIDER_ISTT: InterSchemas::throw_error(isn, I"malformed expression"); break;
case RAW_ISTT: I6Errors::issue_at_node(isn, I"malformed expression"); break;
case OPEN_BRACE_ISTT: I6Errors::issue_at_node(isn, I"unexpected '{'"); break;
case CLOSE_BRACE_ISTT: I6Errors::issue_at_node(isn, I"unexpected '}'"); break;
case OPEN_ROUND_ISTT: I6Errors::issue_at_node(isn, I"unexpected '('"); break;
case CLOSE_ROUND_ISTT: I6Errors::issue_at_node(isn, I"unexpected ')'"); break;
case COMMA_ISTT: I6Errors::issue_at_node(isn, I"unexpected ','"); break;
case DIVIDER_ISTT: I6Errors::issue_at_node(isn, I"malformed expression"); break;
case RESERVED_ISTT: {
TEMPORARY_TEXT(msg)
WRITE_TO(msg, "unexpected use of reserved word '%S'", t->material);
InterSchemas::throw_error(isn, msg);
I6Errors::issue_at_node(isn, msg);
DISCARD_TEXT(msg)
break;
}
case COLON_ISTT: InterSchemas::throw_error(isn, I"unexpected ':'"); break;
case DCOLON_ISTT: InterSchemas::throw_error(isn,
case COLON_ISTT: I6Errors::issue_at_node(isn, I"unexpected ':'"); break;
case DCOLON_ISTT: I6Errors::issue_at_node(isn,
I"the Inform 6 '::' operator is unsupported"); break;
case OPERATOR_ISTT: InterSchemas::throw_error(isn, I"unexpected operator"); break;
case OPERATOR_ISTT: I6Errors::issue_at_node(isn, I"unexpected operator"); break;
}
if ((t->ist_type == NUMBER_ISTT) && (t->next) &&
(t->next->ist_type == NUMBER_ISTT) && (asm == FALSE))
InterSchemas::throw_error(isn, I"two consecutive numbers");
I6Errors::issue_at_node(isn, I"two consecutive numbers");
}
if (isn->child_node) InterSchemas::throw_error(isn, I"malformed expression");
if (isn->child_node) I6Errors::issue_at_node(isn, I"malformed expression");
} else {
if (isn->expression_tokens) InterSchemas::throw_error(isn, I"syntax error");
if (isn->expression_tokens) I6Errors::issue_at_node(isn, I"syntax error");
}
Ramification::sanity_check(isn, isn->child_node);
}

View file

@ -409,7 +409,7 @@ of modifiers are allowed. See //calculus: Compilation Schemas//.
wchar_t c = Str::get_at(from, ++at);
int iss_bitmap = 0;
switch (c) {
case '!': InterSchemas::throw_error(sch->node_tree,
case '!': I6Errors::issue_at_node(sch->node_tree,
I"the '*!' schema notation has been abolished"); break;
case '%': iss_bitmap = iss_bitmap | LVALUE_CONTEXT_ISSBM;
c = Str::get_at(from, ++at); break;
@ -454,7 +454,7 @@ of modifiers are allowed. See //calculus: Compilation Schemas//.
preceding_token = t;
pos = at;
} else if (c == '-') {
InterSchemas::throw_error(sch->node_tree,
I6Errors::issue_at_node(sch->node_tree,
I"the '*-' schema notation has been abolished");
} else if (c == '*') {
int c = '*'; @<Absorb a raw character@>;

View file

@ -26,6 +26,7 @@ Chapter 2: Blueprints
Emitting Inter Schemas
Identifier Finders
Inform 6 Annotations
Inform 6 Syntax Errors
Chapter 3: Masonry
Produce

View file

@ -81,7 +81,7 @@ inter_pair InterValuePairs::number_from_I6_notation(text_stream *S) {
else if ((c >= 'A') && (c <= 'Z')) d = c-'A'+10;
else if ((c >= '0') && (c <= '9')) d = c-'0';
else return InterValuePairs::undef();
if (d > base) return InterValuePairs::undef();
if (d >= base) return InterValuePairs::undef();
N = base*N + (long long int) d;
if (pos.index > 34) return InterValuePairs::undef();
}

View file

@ -130,63 +130,3 @@ void PipelineErrors::error_with(pipeline_step *step, char *erm, text_stream *quo
do_not_locate_problems = FALSE;
if (Log::aspect_switched_on(INTER_DA))
TextualInter::write(DL, Emit::tree(), NULL);
@h Errors in kit source.
Errors like this used to be basically failed assertions, but inevitably people
reported that as a bug (0001596). It was never intended that Inform 6-syntax
hacking should be part of the outside-facing Inform language; but if you leave
power tools just lying around, people will eventually pick them up and wonder
what the red button marked "danger" does.
=
text_provenance kit_error_location;
int kit_error_location_set = FALSE;
int kit_error_count = 0;
text_provenance PipelineErrors::get_kit_error_location(void) {
if (kit_error_location_set == FALSE)
PipelineErrors::clear_kit_error_location();
return kit_error_location;
}
void PipelineErrors::clear_kit_error_location(void) {
PipelineErrors::set_kit_error_location(Provenance::nowhere());
}
void PipelineErrors::set_kit_error_location(text_provenance where) {
kit_error_location_set = TRUE;
kit_error_location = where;
}
void PipelineErrors::set_kit_error_location_near_splat(inter_tree_node *P) {
PipelineErrors::clear_kit_error_location();
if ((P) && (Inode::is(P, SPLAT_IST)))
PipelineErrors::set_kit_error_location(SplatInstruction::provenance(P));
}
void PipelineErrors::kit_error(char *message, text_stream *quote) {
text_provenance at = PipelineErrors::get_kit_error_location();
#ifdef CORE_MODULE
SourceProblems::I6_level_error(message, quote, at);
#endif
#ifndef CORE_MODULE
if (Provenance::is_somewhere(at)) {
filename *F = Provenance::get_filename(at);
TEMPORARY_TEXT(M)
WRITE_TO(M, message, quote);
Errors::at_position_S(M, F, Provenance::get_line(at));
DISCARD_TEXT(M)
} else {
Errors::with_text(message, quote);
}
#endif
kit_error_count++;
}
void PipelineErrors::reset_errors(void) {
PipelineErrors::clear_kit_error_location();
kit_error_count = 0;
}
int PipelineErrors::errors_occurred(void) {
if (kit_error_count != 0) return TRUE;
return FALSE;
}

View file

@ -30,18 +30,18 @@ void CompileSplatsStage::create_pipeline_stage(void) {
=
int CompileSplatsStage::run(pipeline_step *step) {
PipelineErrors::reset_errors();
I6Errors::reset_count();
compile_splats_state css;
@<Initialise the CS state@>;
inter_tree *I = step->ephemera.tree;
InterTree::traverse(I, CompileSplatsStage::visitor1, &css, NULL, SPLAT_IST);
InterTree::traverse(I, CompileSplatsStage::visitor2, &css, NULL, 0);
PipelineErrors::clear_kit_error_location();
I6Errors::clear_current_location();
int errors_found = CompileSplatsStage::function_bodies(step, &css, I);
if (errors_found) return FALSE;
InterTree::traverse(I, CompileSplatsStage::visitor3, &css, NULL, SPLAT_IST);
PipelineErrors::clear_kit_error_location();
if (PipelineErrors::errors_occurred()) return FALSE;
I6Errors::clear_current_location();
if (I6Errors::errors_occurred()) return FALSE;
return TRUE;
}
@ -136,7 +136,7 @@ void CompileSplatsStage::visitor3(inter_tree *I, inter_tree_node *P, void *state
@h How definitions are assimilated.
@<Assimilate definition@> =
PipelineErrors::set_kit_error_location_near_splat(P);
I6Errors::set_current_location_near_splat(P);
match_results mr = Regexp::create_mr();
text_stream *raw_identifier = NULL, *value = NULL;
int proceed = TRUE;
@ -435,11 +435,13 @@ first to work out which of the several array formats this is, then the contents
} else if (Regexp::match(&mr, value, L" *buffer *(%c*?) *")) {
conts = mr.exp[0]; as_bytes = TRUE; bounded = TRUE;
} else if (Regexp::match(&mr, value, L" *string *(%c*?) *")) {
LOG("Identifier = <%S>, Value = <%S>", identifier, value);
PipelineErrors::kit_error("Inform 6 'string' arrays are unsupported", NULL);
I6Errors::issue(
"cannot make array '%S': the 'string' initialiser is unsupported",
identifier);
} else {
LOG("Identifier = <%S>, Value = <%S>", identifier, value);
PipelineErrors::kit_error("invalid Inform 6 array declaration", NULL);
I6Errors::issue(
"cannot make array '%S': the initial value syntax is unrecognised",
identifier);
}
} else {
conts = value; grammatical = TRUE;
@ -489,18 +491,16 @@ see why other kits would, either.
@<Eat off a chunk@> =
text_stream *full_conts = entries;
if (from > to) {
PipelineErrors::kit_error("Inform 6 array contains empty entry", NULL);
} else {
int count_before = no_assimilated_array_entries;
TEMPORARY_TEXT(conts)
for (int j=from; j<=to; j++) PUT_TO(conts, Str::get_at(full_conts, j));
@<Parse the old-style I6 array entry notation@>
DISCARD_TEXT(conts)
if (no_assimilated_array_entries > count_before+1)
PipelineErrors::kit_error(
"Multiple entries between ';' markers in a '[ ...; ...; ... ]' array", NULL);
}
int count_before = no_assimilated_array_entries;
TEMPORARY_TEXT(conts)
for (int j=from; j<=to; j++) PUT_TO(conts, Str::get_at(full_conts, j));
@<Parse the old-style I6 array entry notation@>
DISCARD_TEXT(conts)
if (no_assimilated_array_entries == count_before)
I6Errors::issue("array '%S' contains empty entry", identifier);
if (no_assimilated_array_entries > count_before+1)
I6Errors::issue(
"multiple entries between ';' markers in array '%S'", identifier);
@<Parse the old-style I6 array entry notation@> =
string_position spos = Str::start(conts);
@ -514,17 +514,21 @@ see why other kits would, either.
@<Process the token@> =
if (Str::eq(value, I"+"))
PipelineErrors::kit_error("Inform 6 array declaration using operator '+' "
"(use brackets '(' ... ')' around the size for a calculated array size)", NULL);
I6Errors::issue("array '%S' gives its size using operator '+' "
"(use brackets '(' ... ')' around the size for a calculated array size)",
identifier);
else if (Str::eq(value, I"-"))
PipelineErrors::kit_error("Inform 6 array declaration using operator '-' "
"(use brackets '(' ... ')' around the size for a calculated array size)", NULL);
I6Errors::issue("array '%S' gives its size using operator '-' "
"(use brackets '(' ... ')' around the size for a calculated array size)",
identifier);
else if (Str::eq(value, I"*"))
PipelineErrors::kit_error("Inform 6 array declaration using operator '*' "
"(use brackets '(' ... ')' around the size for a calculated array size)", NULL);
I6Errors::issue("array '%S' gives its size using operator '*' "
"(use brackets '(' ... ')' around the size for a calculated array size)",
identifier);
else if (Str::eq(value, I"/"))
PipelineErrors::kit_error("Inform 6 array declaration using operator '/' "
"(use brackets '(' ... ')' around the size for a calculated array size)", NULL);
I6Errors::issue("array '%S' gives its size using operator '/' "
"(use brackets '(' ... ')' around the size for a calculated array size)",
identifier);
else {
inter_pair val = InterValuePairs::undef();
@<Assimilate a value@>;
@ -671,7 +675,7 @@ equating it to a function definition elsewhere.
@<Add value to the entry pile@> =
if (no_assimilated_array_entries >= MAX_ASSIMILATED_ARRAY_ENTRIES) {
PipelineErrors::kit_error("excessively long Verb or Extend", NULL);
I6Errors::issue("excessively long Verb or Extend", NULL);
break;
}
val_pile[no_assimilated_array_entries] = val;
@ -705,7 +709,7 @@ We are concerned more with the surround than with the contents of the function
in this section.
@<Assimilate routine@> =
PipelineErrors::set_kit_error_location_near_splat(P);
I6Errors::set_current_location_near_splat(P);
text_stream *raw_identifier = NULL, *local_var_names = NULL, *body = NULL;
match_results mr = Regexp::create_mr();
int line_offset = 0;
@ -728,8 +732,12 @@ in this section.
raw_identifier = mr.exp[0]; body = mr.exp[1]; pos = mr.exp_at[1];
} else if (Regexp::match(&mr, S, L" *%[ *([A-Za-z0-9_`]+) *(%c*?); *(%c*)")) {
raw_identifier = mr.exp[0]; local_var_names = mr.exp[1]; body = mr.exp[2]; pos = mr.exp_at[2];
} else if (Regexp::match(&mr, S, L" *%[ *(%c+?) *; *(%c*)")) {
I6Errors::issue("invalid Inform 6 routine declaration: '%S'", mr.exp[0]);
} else {
PipelineErrors::kit_error("invalid Inform 6 routine declaration", NULL);
text_stream *start = Str::duplicate(S);
Str::truncate(start, 50);
I6Errors::issue("invalid Inform 6 routine declaration: '%S'", start);
}
for (int i=0; i<pos; i++)
if (Str::get_at(S, i) == '\n')
@ -763,7 +771,11 @@ supported only to avoid throwing errors.
if ((N<0) || (N>15)) N = 1;
for (int i=1; i<=N; i++) WRITE_TO(local_var_names, "x%d ", i);
body = Str::duplicate(I"rfalse; ];");
} else PipelineErrors::kit_error("invalid Inform 6 Stub declaration", NULL);
} else {
text_stream *start = Str::duplicate(S);
Str::truncate(start, 50);
I6Errors::issue("invalid #Stub declaration: '%S'", start);
}
@ Function packages have a standardised shape in Inter, and though this is a
matter of convention rather than a requirement, we will follow it here. So
@ -820,14 +832,14 @@ These have package types |_function| and |_code| respectively.
int invalid = FALSE;
for (int i=0; i<Str::len(value); i++) {
wchar_t c = Str::get_at(value, i);
if ((i == 0) && (Characters::isdigit(c))) invalid = TRUE;
if ((c != '_') && (Characters::isalnum(c) == FALSE) &&
((i > 0) || (Characters::isdigit(c) == FALSE)))
invalid = TRUE;
(Characters::isdigit(c) == FALSE)) invalid = TRUE;
}
if (invalid) {
text_stream *err = Str::new();
WRITE_TO(err, "'%S' in function '%S'", value, identifier);
PipelineErrors::kit_error("invalid Inform 6 local variable name: %S", err);
I6Errors::issue("invalid Inform 6 local variable name: %S", err);
}
inter_symbol *loc_name =
InterSymbolsTable::create_with_unique_name(InterPackage::scope(IP), value);
@ -847,7 +859,7 @@ These have package types |_function| and |_code| respectively.
while ((L>0) && (Characters::is_whitespace(Str::get_at(body, L-1)))) L--;
Str::truncate(body, L);
inter_ti B = (inter_ti) InterBookmark::baseline(IBM) + 1;
text_provenance prov = PipelineErrors::get_kit_error_location();
text_provenance prov = I6Errors::get_current_location();
Provenance::advance_line(&prov, line_offset);
CompileSplatsStage::function_body(css, IBM, IP, B, body, block_bookmark, identifier,
SplatInstruction::namespace(P), prov);
@ -860,12 +872,11 @@ void CompileSplatsStage::apply_annotations(text_stream *A, text_stream *NS, inte
if (Str::get_last_char(NS) == '+') apply_private = FALSE;
if (Str::get_last_char(NS) == '-') apply_private = TRUE;
if (apply_private != NOT_APPLICABLE) L--;
TEMPORARY_TEXT(N)
if (L > 0) {
TEMPORARY_TEXT(N)
for (int i=0; i<L; i++) PUT_TO(N, Str::get_at(NS, i));
LOGIF(INTER_CONNECTORS, "Assign namespace '%S' to $3\n", N, S);
InterSymbol::set_namespace(S, N);
DISCARD_TEXT(N)
}
if (Str::len(A) > 0) {
LOGIF(INTER_CONNECTORS, "Trying to apply '%S' to $3\n", A, S);
@ -873,18 +884,20 @@ void CompileSplatsStage::apply_annotations(text_stream *A, text_stream *NS, inte
if (Str::eq_insensitive(IA->identifier, I"private")) {
if ((IA->terms == NULL) || (LinkedLists::len(IA->terms) == 0)) {
if (apply_private == TRUE)
PipelineErrors::kit_error("the +private annotation is redundant here", NULL);
I6Errors::issue("the +private annotation is redundant in namespace '%S'", N);
apply_private = TRUE;
} else {
PipelineErrors::kit_error("the +private annotation does not take any terms", NULL);
I6Errors::issue(
"the +private annotation does not take any terms", NULL);
}
} else if (Str::eq_insensitive(IA->identifier, I"public")) {
if ((IA->terms == NULL) || (LinkedLists::len(IA->terms) == 0)) {
if (apply_private == FALSE)
PipelineErrors::kit_error("the +public annotation is redundant here", NULL);
I6Errors::issue("the +public annotation is redundant in namespace '%S'", N);
apply_private = FALSE;
} else {
PipelineErrors::kit_error("the +public annotation does not take any terms", NULL);
I6Errors::issue(
"the +public annotation does not take any terms", NULL);
}
} else if (Str::eq_insensitive(IA->identifier, I"replacing")) {
text_stream *from = I"_"; int keeping = FALSE;
@ -896,21 +909,28 @@ void CompileSplatsStage::apply_annotations(text_stream *A, text_stream *NS, inte
} else if (Str::eq_insensitive(term->key, I"_")) {
if (Str::eq(term->value, I"keeping")) keeping = TRUE;
else {
PipelineErrors::kit_error("expected 'from K' or 'keeping', not '%S'", term->value);
I6Errors::issue(
"expected 'from K' or 'keeping' in '+replacing(...)', not '%S'",
term->value);
}
} else
PipelineErrors::kit_error(
"the +replacing annotation does not take the term '%S'", term->key);
I6Errors::issue(
"the +replacing annotation does not take the term '%S'",
term->key);
}
InterSymbol::set_replacement(S, from);
if (keeping) SymbolAnnotation::set_b(S, KEEPING_IANN, TRUE);
} else if (Str::eq_insensitive(IA->identifier, I"namespace")) {
I6Errors::issue(
"the annotation '%S' must be followed by a ';'", A);
} else {
PipelineErrors::kit_error(
"annotation '%S' not recognised", IA->identifier);
I6Errors::issue(
"the annotation '+%S' is not one of those allowed", IA->identifier);
}
}
}
if (apply_private == TRUE) SymbolAnnotation::set_b(S, PRIVATE_IANN, TRUE);
DISCARD_TEXT(N)
}
@h Plumbing.
@ -1135,7 +1155,7 @@ inter_pair CompileSplatsStage::value(pipeline_step *step, inter_bookmark *IBM,
if (marker) *marker = FALSE;
return InterValuePairs::symbolic(IBM, symb);
} else {
PipelineErrors::kit_error("unknown scope routine", S);
I6Errors::issue("can't find any scope routine called '%S'", mr.exp[0]);
return InterValuePairs::number(1);
}
}
@ -1145,7 +1165,7 @@ inter_pair CompileSplatsStage::value(pipeline_step *step, inter_bookmark *IBM,
if (marker) *marker = TRUE;
return InterValuePairs::symbolic(IBM, symb);
} else {
PipelineErrors::kit_error("unknown noun routine", S);
I6Errors::issue("can't find any noun routine called '%S'", mr.exp[0]);
return InterValuePairs::number(1);
}
}
@ -1179,12 +1199,12 @@ before they are needed.
@<Parse this as a possibly computed value@> =
inter_schema *sch =
ParsingSchemas::from_text(S, PipelineErrors::get_kit_error_location());
ParsingSchemas::from_text(S, I6Errors::get_current_location());
int excess_tokens = FALSE;
inter_symbol *result_s =
CompileSplatsStage::compute_r(step, IBM, sch->node_tree, &excess_tokens);
if (result_s == NULL) {
PipelineErrors::kit_error("Inform 6 constant too complex", S);
if (result_s == NULL) { /* a precaution, but should no longer happen */
I6Errors::issue("Inform 6 constant too complex", S);
return InterValuePairs::number(1);
}
return InterValuePairs::symbolic(IBM, result_s);
@ -1428,12 +1448,12 @@ void CompileSplatsStage::report_kit_errors(inter_schema *sch, function_body_requ
if (LinkedLists::len(sch->parsing_errors) > 0) {
schema_parsing_error *err;
LOOP_OVER_LINKED_LIST(err, schema_parsing_error, sch->parsing_errors) {
PipelineErrors::set_kit_error_location(err->provenance);
I6Errors::set_current_location(err->provenance);
TEMPORARY_TEXT(msg)
WRITE_TO(msg, "in function '%S': %S", req->identifier, err->message);
PipelineErrors::kit_error("Inform 6 syntax error %S", msg);
I6Errors::issue("Inform 6 syntax error %S", msg);
DISCARD_TEXT(msg)
}
PipelineErrors::clear_kit_error_location();
I6Errors::clear_current_location();
}
}

View file

@ -138,7 +138,7 @@ typedef struct rpi_docket_state {
&(ParsingStages::receive_command),
&(ParsingStages::receive_bplus),
&(ParsingStages::line_marker),
&(PipelineErrors::kit_error),
&(I6Errors::issue),
step->ephemera.the_kit, &state);
@ Once the I6T reader has unpacked the literate-programming notation, it will
@ -318,71 +318,25 @@ Note that this function empties the splat buffer |R| before exiting.
=
void ParsingStages::splat(text_stream *R, simple_tangle_docket *docket) {
if (Str::len(R) > 0) {
rpi_docket_state *state = (rpi_docket_state *) docket->state;
I6Errors::set_current_location(state->provenance);
TEMPORARY_TEXT(A)
@<Find annotation, if any@>;
inter_ti I6_dir = 0;
@<Find directive@>;
if (I6_dir != WHITESPACE_PLM) {
rpi_docket_state *state = (rpi_docket_state *) docket->state;
inter_bookmark *IBM = state->assimilation_point;
PUT_TO(R, '\n');
filename *F = NULL;
inter_ti lc = 0;
if (Provenance::is_somewhere(state->provenance)) {
F = Provenance::get_filename(state->provenance);
lc = (inter_ti) Provenance::get_line(state->provenance);
}
Produce::guard(SplatInstruction::new(IBM, R, I6_dir, A, state->namespace,
F, lc, (inter_ti) (InterBookmark::baseline(IBM) + 1), NULL));
} else if (A) {
if (I6_dir != WHITESPACE_PLM) @<Splat the directive@>
else if (A) {
I6_annotation *IA = I6Annotations::parse(A);
if ((IA) && (Str::eq_insensitive(IA->identifier, I"namespace"))) {
rpi_docket_state *state = (rpi_docket_state *) docket->state;
Str::clear(state->namespace);
int private = NOT_APPLICABLE;
I6_annotation_term *term;
LOOP_OVER_LINKED_LIST(term, I6_annotation_term, IA->terms) {
if (Str::eq_insensitive(term->key, I"_")) {
WRITE_TO(state->namespace, "%S", term->value);
} else if (Str::eq_insensitive(term->key, I"access")) {
if (Str::eq_insensitive(term->value, I"private")) private = TRUE;
else if (Str::eq_insensitive(term->value, I"public")) private = FALSE;
else PipelineErrors::kit_error(
"the 'access' must be 'private' or 'public', not '%S'", term->value);
} else {
PipelineErrors::kit_error(
"the +namespace annotation does not take the term '%S'", term->key);
}
}
int bad_name = FALSE;
for (int i=0; i<Str::len(state->namespace); i++) {
wchar_t c = Str::get_at(state->namespace, i);
if (i == 0) {
if (Characters::isalpha(c) == FALSE) bad_name = TRUE;
} else {
if ((Characters::isalnum(c) == FALSE) && (c != '_')) bad_name = TRUE;
}
}
if (bad_name)
PipelineErrors::kit_error(
"a namespace name should begin with a letter and contain "
"only alphanumeric characters or '_'", NULL);
if (Str::len(state->namespace) == 0)
PipelineErrors::kit_error(
"use '+namespace(main);' to return to the global namespace", NULL);
if (Str::eq(state->namespace, I"main")) Str::clear(state->namespace);
if (Str::eq(state->namespace, I"replaced")) {
PipelineErrors::kit_error(
"the namespace 'replaced' is reserved, and cannot be used directly", NULL);
Str::clear(state->namespace);
}
if (private == TRUE) PUT_TO(state->namespace, '-');
if (private == FALSE) PUT_TO(state->namespace, '+');
@<Respond to a change of namespace@>;
} else {
(*(docket->error_callback))(
"this annotation seems not to apply to any directive: '%S'", A);
I6Errors::issue(
"the annotation '%S' seems not to apply to any directive: "
"only '+namespace' can do that", A);
}
I6Errors::clear_current_location();
}
Str::clear(R);
DISCARD_TEXT(A)
@ -392,8 +346,7 @@ void ParsingStages::splat(text_stream *R, simple_tangle_docket *docket) {
@<Find annotation, if any@> =
int verdict = I6Annotations::check(R);
if (verdict == -1) {
(*(docket->error_callback))(
"this Inform 6 annotation is malformed: '%S'", R);
I6Errors::issue("this +annotation is malformed: '%S'", R);
} else {
for (int i=0; i<verdict; i++) PUT_TO(A, Str::get_at(R, i));
Str::trim_white_space(A);
@ -409,13 +362,13 @@ the directive type as 0.
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, R, L" *(%[) *(%c*);%c*")) {
I6_dir = ROUTINE_PLM;
} else if (Regexp::match(&mr, R, L" *(%C+) *(%c*);%c*")) {
if (Str::eq_insensitive(mr.exp[0], I"#ifdef")) I6_dir = IFDEF_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"#ifndef")) I6_dir = IFNDEF_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"#iftrue")) I6_dir = IFTRUE_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"#ifnot")) I6_dir = IFNOT_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"#endif")) I6_dir = ENDIF_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"#stub")) I6_dir = STUB_PLM;
} else if (Regexp::match(&mr, R, L" *#*(%C+) *(%c*);%c*")) {
if (Str::eq_insensitive(mr.exp[0], I"Ifdef")) I6_dir = IFDEF_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Ifndef")) I6_dir = IFNDEF_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Iftrue")) I6_dir = IFTRUE_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Ifnot")) I6_dir = IFNOT_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Endif")) I6_dir = ENDIF_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Stub")) I6_dir = STUB_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Constant")) I6_dir = CONSTANT_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Global")) I6_dir = GLOBAL_PLM;
else if (Str::eq_insensitive(mr.exp[0], I"Array")) I6_dir = ARRAY_PLM;
@ -434,11 +387,100 @@ the directive type as 0.
(Str::get(pos) != ';'))
I6_dir = MYSTERY_PLM;
}
if (I6_dir == MYSTERY_PLM)
(*(docket->error_callback))(
"this Inform 6 directive is not supported in kits or '(-' inclusions: '%S'", R);
if (I6_dir == MYSTERY_PLM) {
int known = FALSE;
if (Str::eq_insensitive(mr.exp[0], I"Ifv3")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Ifv5")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Iffalse")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Abbreviate")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Dictionary")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Import")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Link")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Lowstring")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Origsource")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Replace")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Switches")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Trace")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Undef")) known = TRUE;
else if (Str::eq_insensitive(mr.exp[0], I"Version")) known = TRUE;
if (known)
I6Errors::issue(
"this Inform 6 directive is not supported in kits or '(-' inclusions: '%S' "
"(only #Ifdef, #Ifndef, #Iftrue, #Ifnot, #Endif, #Stub, Constant, Global, "
"Array, Attribute, Property, Verb, Fake_action, Object, Default are "
"supported)", R);
else
I6Errors::issue("this is not an Inform 6 directive", R);
}
Regexp::dispose_of(&mr);
@<Splat the directive@> =
inter_bookmark *IBM = state->assimilation_point;
PUT_TO(R, '\n');
filename *F = NULL;
inter_ti lc = 0;
if (Provenance::is_somewhere(state->provenance)) {
F = Provenance::get_filename(state->provenance);
lc = (inter_ti) Provenance::get_line(state->provenance);
}
Produce::guard(SplatInstruction::new(IBM, R, I6_dir, A, state->namespace,
F, lc, (inter_ti) (InterBookmark::baseline(IBM) + 1), NULL));
@ So the following picks up |+namespace(Whatever)| annotations, which do not
apply to any directive.
@<Respond to a change of namespace@> =
Str::clear(state->namespace);
int private = NOT_APPLICABLE;
I6_annotation_term *term;
LOOP_OVER_LINKED_LIST(term, I6_annotation_term, IA->terms) {
if (Str::eq_insensitive(term->key, I"_")) {
WRITE_TO(state->namespace, "%S", term->value);
} else if (Str::eq_insensitive(term->key, I"access")) {
if (Str::eq_insensitive(term->value, I"private")) private = TRUE;
else if (Str::eq_insensitive(term->value, I"public")) private = FALSE;
else I6Errors::issue(
"in a +namespace annotation, the 'access' must be 'private' or "
"'public', not '%S'", term->value);
} else {
I6Errors::issue(
"the +namespace annotation does not take the term '%S'", term->key);
}
}
@<Vet the new namespace name@>;
if (private == TRUE) PUT_TO(state->namespace, '-');
if (private == FALSE) PUT_TO(state->namespace, '+');
@<Vet the new namespace name@> =
int bad_name = FALSE;
for (int i=0; i<Str::len(state->namespace); i++) {
wchar_t c = Str::get_at(state->namespace, i);
if (i == 0) {
if (Characters::isalpha(c) == FALSE) bad_name = TRUE;
} else {
if ((Characters::isalnum(c) == FALSE) && (c != '_')) bad_name = TRUE;
}
}
if (bad_name)
I6Errors::issue(
"the namespace '%S' is not allowed: namespace names should begin "
"with a letter and contain only alphanumeric characters or '_'",
state->namespace);
if (Str::len(state->namespace) == 0)
I6Errors::issue(
"'+namespace()' is not allowed: use '+namespace(main);' to return "
"to the global namespace", NULL);
if (Str::eq(state->namespace, I"main")) Str::clear(state->namespace);
else if (Str::eq_insensitive(state->namespace, I"main"))
I6Errors::issue(
"'+namespace(...)' names are case-sensitive: use 'main', not '%S', "
"to return to the global namespace", state->namespace);
if (Str::eq(state->namespace, I"replaced")) {
I6Errors::issue(
"the namespace 'replaced' is reserved, and cannot be used directly", NULL);
Str::clear(state->namespace);
}
@ And that's it: the result of these stages is just to break the I6T source they
found up into individual directives, and put them into the tree as |SPLAT_IST| nodes.
No effort has been made yet to see what directives they are. Subsequent stages

View file

@ -72,8 +72,9 @@ void ResolveConditionalsStage::resolve(inter_tree *I) {
state.cc_sp = 0;
InterTree::traverse(I, ResolveConditionalsStage::visitor, &state, NULL, 0);
if (state.cc_sp != 0)
PipelineErrors::kit_error(
I6Errors::issue(
"conditional compilation wrongly structured: not enough #endif", NULL);
I6Errors::clear_current_location();
}
@ Note that when the top of the stack is a block whose body is not to be compiled,
@ -86,6 +87,7 @@ void ResolveConditionalsStage::visitor(inter_tree *I, inter_tree_node *P, void *
int compile_this = TRUE;
for (int i=0; i<state->cc_sp; i++) if (state->cc_stack[i] == FALSE) compile_this = FALSE;
if (Inode::is(P, SPLAT_IST)) {
I6Errors::set_current_location_near_splat(P);
text_stream *S = SplatInstruction::splatter(P);
switch (SplatInstruction::plm(P)) {
case CONSTANT_PLM:
@ -176,17 +178,55 @@ Inform kits use this only to test |#Iftrue WORDSIZE == 4| or |#Iftrue WORDSIZE =
match_results mr2 = Regexp::create_mr();
if (Regexp::match(&mr2, cond, L" *(%C+?) *== *(%d+) *")) {
text_stream *identifier = mr2.exp[0];
inter_symbol *symbol =
LargeScale::architectural_symbol(I, identifier);
inter_symbol *symbol = LargeScale::architectural_symbol(I, identifier);
if (symbol) {
int V = InterSymbol::evaluate_to_int(symbol);
int W = Str::atoi(mr2.exp[1], 0);
if ((V >= 0) && (V == W)) result = TRUE; else result = FALSE;
}
}
if (Regexp::match(&mr2, cond, L" *(%C+?) *>= *(%d+) *")) {
text_stream *identifier = mr2.exp[0];
inter_symbol *symbol = LargeScale::architectural_symbol(I, identifier);
if (symbol) {
int V = InterSymbol::evaluate_to_int(symbol);
int W = Str::atoi(mr2.exp[1], 0);
if ((V >= 0) && (V >= W)) result = TRUE; else result = FALSE;
}
}
if (Regexp::match(&mr2, cond, L" *(%C+?) *> *(%d+) *")) {
text_stream *identifier = mr2.exp[0];
inter_symbol *symbol = LargeScale::architectural_symbol(I, identifier);
if (symbol) {
int V = InterSymbol::evaluate_to_int(symbol);
int W = Str::atoi(mr2.exp[1], 0);
if ((V >= 0) && (V > W)) result = TRUE; else result = FALSE;
}
}
if (Regexp::match(&mr2, cond, L" *(%C+?) *<= *(%d+) *")) {
text_stream *identifier = mr2.exp[0];
inter_symbol *symbol = LargeScale::architectural_symbol(I, identifier);
if (symbol) {
int V = InterSymbol::evaluate_to_int(symbol);
int W = Str::atoi(mr2.exp[1], 0);
if ((V >= 0) && (V <= W)) result = TRUE; else result = FALSE;
}
}
if (Regexp::match(&mr2, cond, L" *(%C+?) *< *(%d+) *")) {
text_stream *identifier = mr2.exp[0];
inter_symbol *symbol = LargeScale::architectural_symbol(I, identifier);
if (symbol) {
int V = InterSymbol::evaluate_to_int(symbol);
int W = Str::atoi(mr2.exp[1], 0);
if ((V >= 0) && (V < W)) result = TRUE; else result = FALSE;
}
}
if (result == NOT_APPLICABLE) {
PipelineErrors::kit_error(
"conditional compilation is too difficult: #iftrue on %S", cond);
I6Errors::issue(
"conditional compilation is too difficult: #iftrue on '%S' "
"(can only test SYMBOL == DECIMALVALUE, or >, <, >=, <=, where "
"the DECIMALVALUE is non-negative, and even then only for a few "
"symbols, of which 'WORDSIZE' is the most useful)", cond);
result = FALSE;
}
LOGIF(RESOLVING_CONDITIONAL_COMPILATION, "Must decide if %S: ", cond);
@ -199,7 +239,7 @@ Inform kits use this only to test |#Iftrue WORDSIZE == 4| or |#Iftrue WORDSIZE =
@<Stack up the result@> =
if (state->cc_sp >= MAX_CC_STACK_SIZE) {
state->cc_sp = MAX_CC_STACK_SIZE;
PipelineErrors::kit_error(
I6Errors::issue(
"conditional compilation wrongly structured: too many nested #ifdef or #iftrue", NULL);
} else {
state->cc_stack[state->cc_sp++] = result;
@ -208,7 +248,7 @@ Inform kits use this only to test |#Iftrue WORDSIZE == 4| or |#Iftrue WORDSIZE =
@<Deal with an IFNOT@> =
LOGIF(RESOLVING_CONDITIONAL_COMPILATION, "ifnot\n");
if (state->cc_sp == 0)
PipelineErrors::kit_error("conditional compilation wrongly structured: #ifnot at top level", NULL);
I6Errors::issue("conditional compilation wrongly structured: #ifnot at top level", NULL);
else
state->cc_stack[state->cc_sp-1] = (state->cc_stack[state->cc_sp-1])?FALSE:TRUE;
compile_this = FALSE;
@ -219,7 +259,7 @@ Inform kits use this only to test |#Iftrue WORDSIZE == 4| or |#Iftrue WORDSIZE =
state->cc_sp--;
if (state->cc_sp < 0) {
state->cc_sp = 0;
PipelineErrors::kit_error("conditional compilation wrongly structured: too many #endif", NULL);
I6Errors::issue("conditional compilation wrongly structured: too many #endif", NULL);
}
compile_this = FALSE;