mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
3660 lines
695 KiB
HTML
3660 lines
695 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>1/in</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
|
|
<!--Weave of '2/is' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">★</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><p class="inwebparagraph"><a id="SP1"></a><b>§1. Definition. </b>An inter schema is a set of instructions for compiling inter code, while
|
|
interspersing certain values at given places.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The main use of this is for compiling invocations of inline-defined phrases.
|
|
For example, the phrase definition:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To adjust (N - a number): (- AdjustThis({N}, 1); -).</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">results in an inter schema being compiled from this text:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">AdjustThis({N}, 1);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">The notation here is essentially Inform 6 code with a few special features
|
|
in braces: here, <code class="display"><span class="extract">{N}</span></code>, which expands to the value of the token <code class="display"><span class="extract">N</span></code> mentioned
|
|
in the phrase preamble. The notation being basically I6 was very convenient
|
|
in the years 2004-17, when Inform generated only I6 code: it became more
|
|
problematic in 2018. The task then was to generate inter instructions, even
|
|
though those would then usually be converted back into I6 anyway.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">And so the code in this section was written. The first half amounts to a
|
|
miniature Inform 6 compiler: its task is to take text such as
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">AdjustThis({N}, 1);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">and convert that into an inter schema. The second half is a code generator,
|
|
which takes a given schema and generates inter code from it.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Anatomy of a schema. </b>Relatively few inter schemas are generated during Inform's run (typically a
|
|
few hundred), so they do not need to be stored compactly or compiled quickly.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">converted_from</span><span class="plain">; </span> <span class="comment">copy of the source notation</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">node_tree</span><span class="plain">; </span> <span class="comment">the structure</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mid_case</span><span class="plain">; </span> <span class="comment">does this seem to be used inside a switch case?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dereference_mode</span><span class="plain">; </span> <span class="comment">emit from this in dereference-pointers mode</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">inter_schema</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure inter_schema is accessed in 2/eis and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="functiontext">InterSchemas::new</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">source</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inter_schema</span><span class="plain">);</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>converted_from</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">source</span><span class="plain">);</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>mid_case</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>dereference_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sch</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::new is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>A schema is a connected tree of nodes, each of which has one of the
|
|
following types. (Tempting to mark eliminated nodes as <code class="display"><span class="extract">OH_NO_IT_ISNT</span></code>,
|
|
but the need to do this went away.)
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">EXPRESSION_ISNT</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CODE_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">EVAL_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">STATEMENT_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OPERATION_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SUBEXPRESSION_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DIRECTIVE_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ASSEMBLY_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">LABEL_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CALL_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">MESSAGE_ISNT</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CALLMESSAGE_ISNT</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_node</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">parent_schema</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">child_node</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">next_node</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">node_marked</span><span class="plain">; </span> <span class="comment">used fleetingly during traverses</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">isn_type</span><span class="plain">; </span> <span class="comment">one of the <code class="display"><span class="extract">*_ISNT</span></code> values</span>
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">isn_clarifier</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">STATEMENT_ISNT</span></code> and <code class="display"><span class="extract">OPERATION_ISNT</span></code> only</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dir_clarifier</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">DIRECTIVE_ISNT</span></code> only</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">expression_tokens</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">EXPRESSION_ISNT</span></code> only</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">semicolon_terminated</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">EXPRESSION_ISNT</span></code> only</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unclosed</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">CODE_ISNT</span></code> only</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unopened</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">CODE_ISNT</span></code> only</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">blocked_by_conditional</span><span class="plain">; </span> <span class="comment">used in code generation</span>
|
|
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">inter_schema_node</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure inter_schema_node is accessed in 2/eis and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">isnt</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain"> = </span><span class="identifier">sch</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="identifier">isnt</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>dir_clarifier</span><span class="plain"> = -1;</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>unclosed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>unopened</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>blocked_by_conditional</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::new_node is used in <a href="#SP7">§7</a>, <a href="#SP15">§15</a>, <a href="#SP22">§22</a>, <a href="#SP23">§23</a>, <a href="#SP24">§24</a>, <a href="#SP25">§25</a>, <a href="#SP26">§26</a>, <a href="#SP27">§27</a>, <a href="#SP28">§28</a>, <a href="#SP28_1_1">§28.1.1</a>, <a href="#SP29">§29</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Ordinarily, a <code class="display"><span class="extract">CODE_ISNT</span></code> node represents a complete block of I6 code.
|
|
For example, in
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">if (x == 1) { print "Hello!"; }</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">the print statement occurs inside a complete block, which will eventually
|
|
be represented as a <code class="display"><span class="extract">CODE_ISNT</span></code>. But some inline phrase definitions leave
|
|
blocks half-open. For example,
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">if (x == 1)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">is a legal phrase definition: we read it as
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">if (x == 1) {</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">and the schema has to contain a <code class="display"><span class="extract">CODE_ISNT</span></code> marked as having been left
|
|
unclosed. Similarly, some definitions close an I6 block which is assumed
|
|
as having been opened by an earlier phrase invocation.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Here we mark a code node as being unclosed. Clearly, if a node is unclosed
|
|
then any parent code nodes of it must also be unclosed, so we recurse
|
|
upwards.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::mark_unclosed</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">CODE_ISNT</span><span class="plain">) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>unclosed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::mark_unclosed is used in <a href="#SP22">§22</a>, <a href="#SP24">§24</a>, <a href="#SP28">§28</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>The situation with unopened nodes is different: we must ensure that a
|
|
single code node is left unopened, even if we have to create a code node
|
|
at the top of the tree to serve that role.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::mark_unopened</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">CODE_ISNT</span><span class="plain">) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>unopened</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">top</span><span class="plain"> = </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">code_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">CODE_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">code_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">top</span><span class="plain">;</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain"> = </span><span class="identifier">code_isn</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">top</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">)</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">code_isn</span><span class="plain">;</span>
|
|
<span class="identifier">code_isn</span><span class="plain">-</span><span class="element">>unopened</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::mark_unopened is used in <a href="#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>A further complication is that some schemas arise from definitions used
|
|
only in the middle of switch statements; they contain neither the start nor
|
|
the end of the construct, so the above mechanisms are not sufficient.
|
|
For example, the inline definition
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">{X}:</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">implies, by use of the colon, that it's a switch case. We can't conveniently
|
|
associate this with any single node, so we mark the schema as a whole.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::mark_case_closed</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">-</span><span class="element">>mid_case</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::mark_case_closed is used in <a href="#SP24">§24</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b><code class="display"><span class="extract">EXPRESSION_ISNT</span></code> nodes carry a linked list of tokens with them. When we
|
|
begin compiling a schema, we form a single expression node with a long list
|
|
of tokens: gradually this is transformed into a tree of nodes with more,
|
|
but much shorter, expression nodes, and in the process most of the token
|
|
types are eliminated. The following types are present only during the
|
|
compilation process, and never survive into the final schema:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">RAW_ISTT</span><span class="definitionkeyword"> from </span><span class="constant">1</span> <span class="comment">something unidentified as yet</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">WHITE_SPACE_ISTT</span><span class="plain"> </span> <span class="comment">a stretch of white space</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">RESERVED_ISTT</span><span class="plain"> </span> <span class="comment">am I6 reserved word such as <code class="display"><span class="extract">while</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OPERATOR_ISTT</span><span class="plain"> </span> <span class="comment">an I6 operator such as <code class="display"><span class="extract">--></span></code> or <code class="display"><span class="extract">+</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DIVIDER_ISTT</span><span class="plain"> </span> <span class="comment">a semicolon used to divide I6 statements</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OPEN_ROUND_ISTT</span><span class="plain"> </span> <span class="comment">open round bracket</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CLOSE_ROUND_ISTT</span><span class="plain"> </span> <span class="comment">close round bracket</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OPEN_BRACE_ISTT</span><span class="plain"> </span> <span class="comment">open brace bracket</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CLOSE_BRACE_ISTT</span><span class="plain"> </span> <span class="comment">close brace bracket</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">COMMA_ISTT</span><span class="plain"> </span> <span class="comment">comma</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">COLON_ISTT</span><span class="plain"> </span> <span class="comment">colon</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>Whereas these token types do make it into the compiled schema:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IDENTIFIER_ISTT</span><span class="plain"> </span> <span class="comment">an I6 identifier such as <code class="display"><span class="extract">my_var12</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OPCODE_ISTT</span><span class="plain"> </span> <span class="comment">an Inform assembly language opcode such as <code class="display"><span class="extract">@pull</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DIRECTIVE_ISTT</span><span class="plain"> </span> <span class="comment">an Inform compiler directive such as <code class="display"><span class="extract">#iftrue</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NUMBER_ISTT</span><span class="plain"> </span> <span class="comment">a constant number</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BIN_NUMBER_ISTT</span><span class="plain"> </span> <span class="comment">a constant number</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">HEX_NUMBER_ISTT</span><span class="plain"> </span> <span class="comment">a constant number</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REAL_NUMBER_ISTT</span><span class="plain"> </span> <span class="comment">a constant number</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DQUOTED_ISTT</span><span class="plain"> </span> <span class="comment">a constant piece of text <code class="display"><span class="extract">"like this"</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SQUOTED_ISTT</span><span class="plain"> </span> <span class="comment">a constant piece of text such as <code class="display"><span class="extract">'x'</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">I7_ISTT</span><span class="plain"> </span> <span class="comment">I7 material in <code class="display"><span class="extract">(+ ... +)</span></code> notation</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">INLINE_ISTT</span><span class="plain"> </span> <span class="comment">an inline command such as <code class="display"><span class="extract">{-my:1}</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ASM_ARROW_ISTT</span><span class="plain"> </span> <span class="comment">the arrow sign <code class="display"><span class="extract">-></span></code> used in assembly language only</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ASM_SP_ISTT</span><span class="plain"> </span> <span class="comment">the stack pointer pseudo-variable <code class="display"><span class="extract">sp</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ASM_LABEL_ISTT</span><span class="plain"> </span> <span class="comment">the label sign <code class="display"><span class="extract">?</span></code> used in assembly language only</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ASM_NEGATED_LABEL_ISTT</span><span class="plain"> </span> <span class="comment">the label sign <code class="display"><span class="extract">?~</span></code> used in assembly language only</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_token</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">; </span> <span class="comment">these form a linked list attached to the owner node</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ist_type</span><span class="plain">; </span> <span class="comment">one of the <code class="display"><span class="extract">*_ISTT</span></code> values above</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">material</span><span class="plain">; </span> <span class="comment">textual form of token</span>
|
|
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">operation_primitive</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">OPERATOR_ISTT</span></code> only: e.g. <code class="display"><span class="extract">PLUS_BIP</span></code> for <code class="display"><span class="extract">+</span></code></span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">reserved_word</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">RESERVED_ISTT</span></code> only: which one</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">constant_number</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">NUMBER_ISTT</span></code> only: if non-negative, value of number</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">as_quoted</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">IDENTIFIER_ISTT</span></code> only: the identified symbol if known</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inline_command</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">INLINE_ISTT</span></code> only: one of the <code class="display"><span class="extract">*_ISINC</span></code> values</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inline_modifiers</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inline_subcommand</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">INLINE_ISTT</span></code> only: one of the <code class="display"><span class="extract">*_ISINSC</span></code> values</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">bracing</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">operand</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">operand2</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">property</span><span class="plain"> *</span><span class="identifier">extremal_property</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">extremal_property_sign</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">preinsert</span><span class="plain">; </span> <span class="comment">fleeting markers only</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">postinsert</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">inter_schema_token</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure inter_schema_token is accessed in 2/eis and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">type</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">material</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">operation_primitive</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reserved_word</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inter_schema_token</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="identifier">type</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">material</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>operand2</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>extremal_property</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">that is, none given</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>extremal_property_sign</span><span class="plain"> = </span><span class="identifier">MEASURE_T_EXACTLY</span><span class="plain">; </span> <span class="comment">that is, none given</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">no_ISINC</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">no_ISINSC</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> = </span><span class="identifier">operation_primitive</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>as_quoted</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> = </span><span class="identifier">reserved_word</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>constant_number</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>preinsert</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>postinsert</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::new_token is used in <a href="#SP20_2_2">§20.2.2</a>, <a href="#SP20_2_3_1">§20.2.3.1</a>, <a href="#SP20_2_4_1">§20.2.4.1</a>, <a href="#SP20_2_5">§20.2.5</a>, <a href="#SP20_2_2_1_4">§20.2.2.1.4</a>, <a href="#SP21">§21</a>, <a href="#SP26">§26</a>, <a href="#SP29">§29</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b>The value of <code class="display"><span class="extract">reserved_word</span></code>, in a <code class="display"><span class="extract">RESERVED_ISTT</span></code> node, must be one of:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IF_I6RW</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ELSE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">STYLE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">RETURN_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">RTRUE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">RFALSE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">FOR_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OBJECTLOOP_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">WHILE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DO_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">UNTIL_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">PRINT_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">PRINTRET_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NEWLINE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">GIVE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">MOVE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REMOVE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">JUMP_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SWITCH_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DEFAULT_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">FONT_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BREAK_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CONTINUE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">QUIT_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">RESTORE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SPACES_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">READ_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">INVERSION_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IFDEF_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IFNDEF_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IFTRUE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IFFALSE_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">IFNOT_I6RW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ENDIF_I6RW</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>The value of <code class="display"><span class="extract">inline_command</span></code>, in an <code class="display"><span class="extract">INLINE_ISTT</span></code> node, must be one of:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">no_ISINC</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">primitive_definition_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">new_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">new_list_of_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">printing_routine_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">next_routine_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">previous_routine_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ranger_routine_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">strong_kind_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">weak_kind_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">backspace_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">erase_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">open_brace_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">close_brace_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">label_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">counter_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">counter_storage_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">counter_up_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">counter_down_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">counter_makes_array_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">by_reference_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">by_reference_blank_out_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">reference_exists_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">lvalue_by_reference_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">by_value_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">box_quotation_text_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">try_action_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">try_action_silently_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">return_value_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">return_value_from_rule_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">property_holds_block_value_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">mark_event_used_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">my_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">unprotect_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">copy_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">initialise_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">matches_description_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">now_matches_description_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">arithmetic_operation_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">say_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">show_me_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">segment_count_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">final_segment_marker_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">list_together_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">rescale_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">unknown_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">substitute_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">current_sentence_ISINC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">combine_ISINC</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b>The value of <code class="display"><span class="extract">inline_subcommand</span></code>, in an <code class="display"><span class="extract">INLINE_ISTT</span></code> node, must be one of:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">no_ISINSC</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">unarticled_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">articled_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">repeat_through_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">repeat_through_list_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">number_of_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">random_of_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">total_of_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">extremal_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">function_application_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">description_application_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">solve_equation_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">switch_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">break_ISINSC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">verbose_checking_ISINSC</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Token insertion. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="functiontext">InterSchemas::add_token_to_node</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::add_token_to_node</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">, </span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">) && (</span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)) </span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::add_token_after</span><span class="plain">(</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">existing</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't add after null element"</span><span class="plain">);</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">was</span><span class="plain"> = </span><span class="identifier">existing</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">existing</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">was</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">existing</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::add_token is used in <a href="#SP20_2_2">§20.2.2</a>, <a href="#SP20_2_3_1">§20.2.3.1</a>, <a href="#SP20_2_4_1">§20.2.4.1</a>, <a href="#SP20_2_5">§20.2.5</a>, <a href="#SP20_2_2_1_4">§20.2.2.1.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::add_token_to_node is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::add_token_after is used in <a href="#SP21">§21</a>, <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Logging. </b>It is invaluable to be able to see compiled schemas in the debugging log, so
|
|
we go to some trouble here.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::log</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vis</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = (</span><span class="reserved">inter_schema</span><span class="plain"> *) </span><span class="identifier">vis</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<null schema>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<schema without nodes>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">InterSchemas::log_depth</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain">, 0);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::log_depth</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">)</span>
|
|
<span class="functiontext">InterSchemas::log_just</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::log_just</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>blocked_by_conditional</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"XX"</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = 0; </span><span class="identifier">d</span><span class="plain"> < </span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">d</span><span class="plain">++) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">STATEMENT_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (statement) %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">Primitives::name</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain">));</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPERATION_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (operation) %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">Primitives::name</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain">));</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CODE_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (code)"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>unclosed</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" <"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>unopened</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" >"</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EVAL_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (eval)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASSEMBLY_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (assembly)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DIRECTIVE_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (directive) "</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>dir_clarifier</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IFDEF_I6RW</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"#ifdef"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IFNDEF_I6RW</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"#ifndef"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IFTRUE_I6RW</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"#iftrue"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IFFALSE_I6RW</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"#iffalse"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IFNOT_I6RW</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"#ifnot"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ENDIF_I6RW</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"#endif"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<unknown>"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">LABEL_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (label)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALL_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (call)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MESSAGE_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (message)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALLMESSAGE_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (call-message)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SUBEXPRESSION_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (subexpression)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">:</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (expr)"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" ;"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>unclosed</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" <"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>unopened</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" >"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" - empty"</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = 0; </span><span class="identifier">d</span><span class="plain"> < </span><span class="identifier">depth</span><span class="plain"> + 1; </span><span class="identifier">d</span><span class="plain">++) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="functiontext">InterSchemas::log_ist</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain"> != </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" !!! ownership incorrect here"</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">InterSchemas::log_depth</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::log_ist</span><span class="plain">(</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<NULL-IST>"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RAW_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"RAW "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPERATOR_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"OPERATOR "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPCODE_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"OPCODE "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"DIRECTIVE "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"IDENTIFIER "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RESERVED_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"RESERVED "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NUMBER_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NUMBER "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BIN_NUMBER_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"BIN_NUMBER "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">HEX_NUMBER_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"HEX_NUMBER "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REAL_NUMBER_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"REAL_NUMBER "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DQUOTED_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"DQUOTED "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SQUOTED_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"SQUOTED "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"WHITE_SPACE "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DIVIDER_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"DIVIDER "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"OPEN_ROUND "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"CLOSE_ROUND "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"OPEN_BRACE "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"CLOSE_BRACE "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COMMA_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"COMMA "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COLON_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"COLON "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">I7_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"I7 "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INLINE_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"INLINE "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_ARROW_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASM_ARROW "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_SP_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASM_SP "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_LABEL_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASM_LABEL "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_NEGATED_LABEL_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NEGASM_LABEL "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<unknown>"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>material</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">GIVE_KIND_ID_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" GIVE_KIND_ID"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">GIVE_COMPARISON_ROUTINE_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" GIVE_COMPARISON_ROUTINE"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">DEREFERENCE_PROPERTY_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" DEREFERENCE_PROPERTY"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" ADOPT_LOCAL_STACK_FRAME"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" CAST_TO_KIND_OF_OTHER_TERM"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">BY_REFERENCE_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" BY_REFERENCE"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" PERMIT_LOCALS_IN_TEXT_CMODE"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::log is used in 1/bm (<a href="1-bm.html#SP4_5">§4.5</a>).</p>
|
|
|
|
<p class="endnote">The function InterSchemas::log_depth appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::log_just is used in 2/eis (<a href="2-eis.html#SP2_1">§2.1</a>).</p>
|
|
|
|
<p class="endnote">The function InterSchemas::log_ist appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Lint. </b>As can be seen, the <code class="display"><span class="extract">inter_schema</span></code> structure is quite complicated, and there
|
|
are numerous invariants it has to satisfy. As a precaution, then, we check that
|
|
all of these invariants hold before shipping out a compiled schema. This is
|
|
where the check is done:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::lint</span><span class="plain">(</span><span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">) {</span>
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">err</span><span class="plain"> = </span><span class="functiontext">InterSchemas::lint_isn</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain">, 0);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">err</span><span class="plain">) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Lint fail: %S\</span><span class="plain">n</span><span class="string">$1\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">);</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"inter schema failed lint"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">InterSchemas::lint_isn</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">asm</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPCODE_ISTT</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> == </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) </span><span class="identifier">asm</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains loose assembler"</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RAW_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains raw node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains open-brace node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains close-brace node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains open-round node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains close-round node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COMMA_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains comma node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DIVIDER_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains divider node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RESERVED_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains reserved word node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COLON_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains colon node"</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPERATOR_ISTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains operator node"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">INLINE_ISTT</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> == </span><span class="constant">open_brace_ISINC</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains manual open-brace"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">INLINE_ISTT</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> == </span><span class="constant">close_brace_ISINC</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"contains manual close-brace"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">NUMBER_ISTT</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">NUMBER_ISTT</span><span class="plain">) && (</span><span class="identifier">asm</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"two consecutive numbers"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain"> != </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"ownership linkage broken"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"expression has child nodes"</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"non-expression has elements"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> != </span><span class="identifier">isn</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"child-parent linkage broken"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"ambiguous is-node"</span><span class="plain">;</span>
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">InterSchemas::lint_isn</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::lint is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::lint_isn appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. I6S. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">dictionary</span><span class="plain"> *</span><span class="identifier">compiled_i6s_dict</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="functiontext">InterSchemas::from_i6s</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">prototype</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_quoted_inames</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> **</span><span class="identifier">quoted_inames</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compiled_i6s_dict</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">compiled_i6s_dict</span><span class="plain"> = </span><span class="identifier">Dictionaries::new</span><span class="plain">(512, </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">dict_entry</span><span class="plain"> *</span><span class="identifier">de</span><span class="plain"> = </span><span class="identifier">Dictionaries::find</span><span class="plain">(</span><span class="identifier">compiled_i6s_dict</span><span class="plain">, </span><span class="identifier">prototype</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">de</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> (</span><span class="reserved">inter_schema</span><span class="plain"> *) </span><span class="identifier">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">compiled_i6s_dict</span><span class="plain">, </span><span class="identifier">prototype</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">prototype</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">no_quoted_inames</span><span class="plain">, </span><span class="identifier">quoted_inames</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="identifier">compiled_i6s_dict</span><span class="plain">, </span><span class="identifier">prototype</span><span class="plain">);</span>
|
|
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">compiled_i6s_dict</span><span class="plain">, </span><span class="identifier">prototype</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">result</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">result</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::from_i6s appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Heads and tails. </b>Most inline-defined phrases compile to a single schema, but some compile to
|
|
two, the head and the tail (which typically bookend a loop structure). A
|
|
general inline definition must therefore in principle be compiled to two
|
|
schemas, not one.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The definition is in a wide C string because it's coming raw from the lexer,
|
|
as the content of a <code class="display"><span class="extract">(- ... -)</span></code> lexeme, but with the <code class="display"><span class="extract">(-</span></code> and <code class="display"><span class="extract">-)</span></code> removed.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::from_inline_phrase_definition</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">inter_schema</span><span class="plain"> **</span><span class="identifier">head</span><span class="plain">, </span><span class="reserved">inter_schema</span><span class="plain"> **</span><span class="identifier">tail</span><span class="plain">) {</span>
|
|
<span class="plain">*</span><span class="identifier">head</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; *</span><span class="identifier">tail</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">head_defn</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">tail_defn</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<<span class="cwebmacro">Fetch the head and tail definitions</span> <span class="cwebmacronumber">19.1</span>><span class="plain">;</span>
|
|
|
|
<span class="plain">*</span><span class="identifier">head</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">tail_defn</span><span class="plain">) > 0)</span>
|
|
<span class="plain">*</span><span class="identifier">tail</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">tail_defn</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::from_inline_phrase_definition appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19_1"></a><b>§19.1. </b>A tail will only be present if the definition contains <code class="display"><span class="extract">{-block}</span></code>. If it
|
|
does, we then split the definition into a head and a tail, and again trim
|
|
white space from each. Note that <code class="display"><span class="extract">{-block}</span></code> is not legal anywhere else.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>To repeat with a King's Court begin -- end loop:</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">could be given the definition:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">@push {-my:trcount};</span>
|
|
<span class="plain">for (trcount=1; trcount<=3; trcount++)</span>
|
|
<span class="plain"> {-block}</span>
|
|
<span class="plain">@pull trcount;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">This then repeats what it's given three times, while guaranteeing that the
|
|
counter is always a local variable called <code class="display"><span class="extract">trcount</span></code>, and that no matter how
|
|
such operations are nested, they will work. We might then write:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">To say iteration: (- print {-my:trcount}; -).</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">and then this will work as might be hoped:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">repeat with a King's Court:</span>
|
|
<span class="plain"> say "[iteration]...";</span>
|
|
<span class="plain"> repeat with a King's Court:</span>
|
|
<span class="plain"> say "[iteration]. You play a Shanty Town, getting +2 Actions.";</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">This is a slightly contrived example, and often <code class="display"><span class="extract">{-block}</span></code> isn't needed. If
|
|
we didn't care about accessing the iteration count in the body of the loop,
|
|
for instance, we could simply have defined:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">for ({-my:1}=1; {-my:1}<=3; {-my:1}++)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">and Inform would then have allocated a new variable as loop counter each time.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Fetch the head and tail definitions</span> <span class="cwebmacronumber">19.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(*</span><span class="identifier">p</span><span class="plain">)) </span><span class="identifier">p</span><span class="plain">++;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="string">"%w"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">effective_end</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">L</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (!(</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">))))</span>
|
|
<span class="identifier">effective_end</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">+1;</span>
|
|
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">effective_end</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">L</span><span class="plain">=</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::includes_wide_string_at</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"{-block}"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">after</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">+8, </span><span class="identifier">before</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">))) </span><span class="identifier">after</span><span class="plain">++;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">-1))) </span><span class="identifier">before</span><span class="plain">--;</span>
|
|
<span class="identifier">Str::copy_tail</span><span class="plain">(</span><span class="identifier">tail_defn</span><span class="plain">, </span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">);</span>
|
|
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">head_defn</span><span class="plain">, </span><span class="identifier">before</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP19">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. Compiler. </b>This is a two-stage process.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="functiontext">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">abbreviated</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_quoted_inames</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> **</span><span class="identifier">quoted_inames</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">SCHEMA_COMPILATION_DA</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">SCHEMA_COMPILATION_DETAILS_DA</span><span class="plain">)))</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">------------\</span><span class="plain">n</span><span class="string">Compiling inter schema from: <%S>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">);</span>
|
|
|
|
<<span class="cwebmacro">Begin the schema as a single expression node with a linked list of tokens</span> <span class="cwebmacronumber">20.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Perform transformations to grow the tree and reduce the token count</span> <span class="cwebmacronumber">20.4</span>><span class="plain">;</span>
|
|
|
|
<span class="functiontext">InterSchemas::lint</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">SCHEMA_COMPILATION_DA</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">SCHEMA_COMPILATION_DETAILS_DA</span><span class="plain">)))</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Completed inter schema:\</span><span class="plain">n</span><span class="string">$1"</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sch</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::from_text is used in <a href="#SP18">§18</a>, <a href="#SP19">§19</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_1"></a><b>§20.1. Stage 1. </b>Our method is to tokenise the source code as if it were Inform 6, but to look
|
|
out for the two extra syntaxes allowed, <code class="display"><span class="extract">{-bracing}</span></code> and <code class="display"><span class="extract">(+ Inform 7 interpolation +)</span></code>.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NO_TOKSTATE</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">COMMENT_TOKSTATE</span><span class="plain"> </span> <span class="comment">currently scanning an I6 comment <code class="display"><span class="extract">! ...</span></code></span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DQUOTED_TOKSTATE</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SQUOTED_TOKSTATE</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">WHITE_TOKSTATE</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">TOK_TOKSTATE</span><span class="plain"> </span> <span class="comment">an actual token</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP20_2"></a><b>§20.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Begin the schema as a single expression node with a linked list of tokens</span> <span class="cwebmacronumber">20.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">preceding_token</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">definition_length</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">);</span>
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">current_raw</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">NO_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">abbreviated</span><span class="plain">) && (</span><span class="identifier">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"*=-"</span><span class="plain">))) {</span>
|
|
<span class="identifier">sch</span><span class="plain">-</span><span class="element">>dereference_mode</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">pos</span><span class="plain"> = 3;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">pos</span><span class="plain"><</span><span class="identifier">definition_length</span><span class="plain">; </span><span class="identifier">pos</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tokeniser_state</span><span class="plain"> == </span><span class="constant">TOK_TOKSTATE</span><span class="plain">) || (</span><span class="identifier">tokeniser_state</span><span class="plain"> == </span><span class="constant">NO_TOKSTATE</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">WHITE_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="character">' '</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tokeniser_state</span><span class="plain"> == </span><span class="constant">WHITE_TOKSTATE</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">NO_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">tokeniser_state</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DQUOTED_TOKSTATE</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">NO_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SQUOTED_TOKSTATE</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">NO_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COMMENT_TOKSTATE</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">) </span><span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">NO_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WHITE_TOKSTATE</span><span class="plain">: </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'!'</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">COMMENT_TOKSTATE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'"'</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">DQUOTED_TOKSTATE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">SQUOTED_TOKSTATE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'{'</span><span class="plain">) && (</span><span class="identifier">abbreviated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Look for a possible bracing</span> <span class="cwebmacronumber">20.2.4</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'*'</span><span class="plain">) && (</span><span class="identifier">abbreviated</span><span class="plain"> == </span><span class="identifier">TRUE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Look for a possible abbreviated command</span> <span class="cwebmacronumber">20.2.5</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'('</span><span class="plain">) && (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">+1) == </span><span class="character">'+'</span><span class="plain">) && (</span><span class="identifier">abbreviated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Look for a possible Inform 7 fragment</span> <span class="cwebmacronumber">20.2.3</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Absorb a raw character</span> <span class="cwebmacronumber">20.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_1"></a><b>§20.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Absorb a raw character</span> <span class="cwebmacronumber">20.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">TOK_TOKSTATE</span><span class="plain">;</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2">§20.2</a>, <a href="#SP20_2_3">§20.2.3</a>, <a href="#SP20_2_4">§20.2.4</a>, <a href="#SP20_2_5">§20.2.5</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2"></a><b>§20.2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">)) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">tokeniser_state</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WHITE_TOKSTATE</span><span class="plain">:</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">, 0, 0, -1));</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DQUOTED_TOKSTATE</span><span class="plain">:</span>
|
|
<span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">);</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">DQUOTED_ISTT</span><span class="plain">, </span><span class="identifier">current_raw</span><span class="plain">, 0, 0, -1));</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SQUOTED_TOKSTATE</span><span class="plain">:</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">SQUOTED_ISTT</span><span class="plain">, </span><span class="identifier">current_raw</span><span class="plain">, 0, 0, -1));</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">:</span>
|
|
<<span class="cwebmacro">Look for individual tokens</span> <span class="cwebmacronumber">20.2.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">tokeniser_state</span><span class="plain"> = </span><span class="constant">NO_TOKSTATE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2">§20.2</a> (8 times), <a href="#SP20_2_3">§20.2.3</a>, <a href="#SP20_2_4">§20.2.4</a>, <a href="#SP20_2_5">§20.2.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_3"></a><b>§20.2.3. </b>Material in <code class="display"><span class="extract">(+ ... +)</span></code> notation is an interpolation of I7 source text.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Look for a possible Inform 7 fragment</span> <span class="cwebmacronumber">20.2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">save_pos</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">accept</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">source_text_fragment</span><span class="plain">);</span>
|
|
<span class="identifier">pos</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">-1) == </span><span class="character">'+'</span><span class="plain">) && (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">) == </span><span class="character">')'</span><span class="plain">)) {</span>
|
|
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">source_text_fragment</span><span class="plain">);</span>
|
|
<span class="identifier">accept</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">source_text_fragment</span><span class="plain">, </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">++));</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">accept</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Expand a fragment of Inform 7 text</span> <span class="cwebmacronumber">20.2.3.1</span>><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> { </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="character">'('</span><span class="plain">; </span><<span class="cwebmacro">Absorb a raw character</span> <span class="cwebmacronumber">20.2.1</span>><span class="plain">; </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">save_pos</span><span class="plain">; }</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">source_text_fragment</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2">§20.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_3_1"></a><b>§20.2.3.1. </b>The empty I7 interpolation is legal, but produces no result.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Expand a fragment of Inform 7 text</span> <span class="cwebmacronumber">20.2.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">source_text_fragment</span><span class="plain">) > 0) {</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">I7_ISTT</span><span class="plain">, </span><span class="identifier">source_text_fragment</span><span class="plain">, 0, 0, -1));</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_3">§20.2.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_4"></a><b>§20.2.4. </b>Material in braces sometimes indicates an inline command, but not always,
|
|
because braces often occur innocently in I6 code. So we require the first
|
|
character after the open-brace not to be white-space, and also not to be
|
|
a pipe (though I've forgotten why). The text inside the braces is called
|
|
a "bracing".
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Look for a possible bracing</span> <span class="cwebmacronumber">20.2.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">save_pos</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">++, </span><span class="identifier">accept</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">bracing</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">TRUE</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'}'</span><span class="plain">) { </span><span class="identifier">accept</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">bracing</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="identifier">pos</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> = </span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">bracing</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">accept</span><span class="plain">) && (</span><span class="identifier">first</span><span class="plain"> != </span><span class="character">' '</span><span class="plain">) && (</span><span class="identifier">first</span><span class="plain"> != </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">) && (</span><span class="identifier">first</span><span class="plain"> != </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">) && (</span><span class="identifier">first</span><span class="plain"> != </span><span class="character">'|'</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Parse a bracing into an inline command</span> <span class="cwebmacronumber">20.2.4.1</span>><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> { </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="character">'{'</span><span class="plain">; </span><<span class="cwebmacro">Absorb a raw character</span> <span class="cwebmacronumber">20.2.1</span>><span class="plain">; </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">save_pos</span><span class="plain">; }</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">bracing</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2">§20.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_4_1"></a><b>§20.2.4.1. </b>That's everything, then, except the one thing that counts: how to expand
|
|
a bracing.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Parse a bracing into an inline command</span> <span class="cwebmacronumber">20.2.4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">INLINE_ISTT</span><span class="plain">, </span><span class="identifier">bracing</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">bracing</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>operand2</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<<span class="cwebmacro">Decompose the bracing</span> <span class="cwebmacronumber">20.2.4.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">) > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"primitive-definition"</span><span class="plain">)) {</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">primitive_definition_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"repeat-through"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">repeat_through_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"repeat-through-list"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">repeat_through_list_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"number-of"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">number_of_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"random-of"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">random_of_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"total-of"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">total_of_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"extremal"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">extremal_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"function-application"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">function_application_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"description-application"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">description_application_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"solve-equation"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">solve_equation_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"switch"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">switch_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"break"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">break_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"verbose-checking"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">verbose_checking_ISINSC</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"new"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">new_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"new-list-of"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">new_list_of_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"printing-routine"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">printing_routine_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ranger-routine"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">ranger_routine_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"next-routine"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">next_routine_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"previous-routine"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">previous_routine_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"strong-kind"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">strong_kind_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"weak-kind"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">weak_kind_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"backspace"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">backspace_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"erase"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">erase_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"open-brace"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">open_brace_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"close-brace"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">close_brace_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"label"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">label_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"counter"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">counter_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"counter-storage"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">counter_storage_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"counter-up"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">counter_up_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"counter-down"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">counter_down_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"counter-makes-array"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">counter_makes_array_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"by-reference"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">by_reference_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"by-reference-blank-out"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">by_reference_blank_out_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"reference-exists"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">reference_exists_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"lvalue-by-reference"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">lvalue_by_reference_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"by-value"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">by_value_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"box-quotation-text"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">box_quotation_text_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"try-action"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">try_action_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"try-action-silently"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">try_action_silently_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"return-value"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">return_value_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"return-value-from-rule"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">return_value_from_rule_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"property-holds-block-value"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">property_holds_block_value_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"mark-event-used"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">mark_event_used_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"my"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">my_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"unprotect"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">unprotect_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"copy"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">copy_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"initialise"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">initialise_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"matches-description"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">matches_description_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"now-matches-description"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">now_matches_description_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"arithmetic-operation"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">arithmetic_operation_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"say"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">say_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"show-me"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">show_me_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"segment-count"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">segment_count_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"final-segment-marker"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">final_segment_marker_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"list-together"</span><span class="plain">)) {</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">list_together_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"unarticled"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">unarticled_ISINSC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"articled"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_subcommand</span><span class="plain"> = </span><span class="constant">articled_ISINSC</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"rescale"</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">rescale_ISINC</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">unknown_ISINC</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="identifier">preceding_token</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_4">§20.2.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_4_1_1"></a><b>§20.2.4.1.1. </b>A bracing can take any of the following forms:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">{-command}</span>
|
|
<span class="plain">{-command:operand}</span>
|
|
<span class="plain">{-command:operand:operand2}</span>
|
|
<span class="plain">{-command:operand<property name}</span>
|
|
<span class="plain">{-command:operand>property name}</span>
|
|
<span class="plain">{some text}</span>
|
|
<span class="plain">{-annotation:some text}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">We parse this with the command or annotation in <code class="display"><span class="extract">command</span></code>, the "some text"
|
|
or operand in <code class="display"><span class="extract">bracing</span></code>, the property name (if given) in <code class="display"><span class="extract">extremal_property</span></code>,
|
|
the direction of the <code class="display"><span class="extract"><</span></code> or <code class="display"><span class="extract">></span></code> in <code class="display"><span class="extract">extremal_property_sign</span></code>, and the second,
|
|
optional, operand in <code class="display"><span class="extract">operand2</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Decompose the bracing</span> <span class="cwebmacronumber">20.2.4.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_first_char</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain">) == </span><span class="character">'-'</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">portion</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=1, </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">portion</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> 1:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">':'</span><span class="plain">) </span><span class="identifier">portion</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>command</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 2:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">':'</span><span class="plain">) </span><span class="identifier">portion</span><span class="plain"> = 3;</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'<'</span><span class="plain">) { </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>extremal_property_sign</span><span class="plain"> = </span><span class="identifier">MEASURE_T_OR_LESS</span><span class="plain">; </span><span class="identifier">portion</span><span class="plain"> = 4; }</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'>'</span><span class="plain">) { </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>extremal_property_sign</span><span class="plain"> = </span><span class="identifier">MEASURE_T_OR_MORE</span><span class="plain">; </span><span class="identifier">portion</span><span class="plain"> = 4; }</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 3:</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand2</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 4:</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>extremal_property_sign</span><span class="plain"> != </span><span class="identifier">MEASURE_T_EXACTLY</span><span class="plain">) {</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">property</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>extremal_property</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>operand</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">pname</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_4_1">§20.2.4.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_5"></a><b>§20.2.5. </b>In abbreviated prototypes, <code class="display"><span class="extract">*1</span></code> and <code class="display"><span class="extract">*2</span></code> are placeholders.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">GIVE_KIND_ID_ISSBM</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">GIVE_COMPARISON_ROUTINE_ISSBM</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DEREFERENCE_PROPERTY_ISSBM</span><span class="plain"> 4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain"> 8</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain"> 16</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">BY_REFERENCE_ISSBM</span><span class="plain"> 32</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM</span><span class="plain"> 64</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">TREAT_AS_LVALUE_CMODE_ISSBM</span><span class="plain"> 128</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">JUST_ROUTINE_CMODE_ISSBM</span><span class="plain"> 256</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">TABLE_EXISTENCE_CMODE_ISSBM</span><span class="plain"> 512</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Look for a possible abbreviated command</span> <span class="cwebmacronumber">20.2.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">iss_bitmap</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'!'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'%'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">TREAT_AS_LVALUE_CMODE_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'$'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">JUST_ROUTINE_CMODE_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'#'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">GIVE_KIND_ID_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'_'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">GIVE_COMPARISON_ROUTINE_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'+'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">DEREFERENCE_PROPERTY_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'|'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | (</span><span class="constant">DEREFERENCE_PROPERTY_ISSBM</span><span class="plain"> + </span><span class="constant">TREAT_AS_LVALUE_CMODE_ISSBM</span><span class="plain">); </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'?'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'<'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'^'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | (</span><span class="constant">ADOPT_LOCAL_STACK_FRAME_ISSBM</span><span class="plain"> + </span><span class="constant">BY_REFERENCE_ISSBM</span><span class="plain">); </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'>'</span><span class="plain">: </span><span class="identifier">iss_bitmap</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain"> | </span><span class="constant">BY_REFERENCE_ISSBM</span><span class="plain">; </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, ++</span><span class="identifier">at</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Absorb raw material, if any</span> <span class="cwebmacronumber">20.2.2</span>><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">pos</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"><=</span><span class="identifier">at</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">INLINE_ISTT</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">substitute_ISINC</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>constant_number</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain"> - </span><span class="character">'1'</span><span class="plain">;</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="identifier">preceding_token</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'?'</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">INLINE_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*?"</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"*?"</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">current_sentence_ISINC</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain">;</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="identifier">preceding_token</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'&'</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">INLINE_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*&"</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>bracing</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"*&"</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> = </span><span class="constant">combine_ISINC</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> = </span><span class="identifier">iss_bitmap</span><span class="plain">;</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="identifier">preceding_token</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) {</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"the '*-' schema notation has been abolished"</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'*'</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="character">'*'</span><span class="plain">; </span><<span class="cwebmacro">Absorb a raw character</span> <span class="cwebmacronumber">20.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="character">'{'</span><span class="plain">; </span><<span class="cwebmacro">Absorb a raw character</span> <span class="cwebmacronumber">20.2.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2">§20.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2_1"></a><b>§20.2.2.1. </b>That leaves us with just the main case to handle: raw I6 code which is
|
|
outside of quotation marks and commentary, and which doesn't include
|
|
bracings or I7 interpolations. That might look like, for instance,
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">Frog + 2*Toad(</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">(there is no reason to suppose that this stretch of code is complete or
|
|
matches parentheses); we must tokenise it into
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">Frog| |W| |+| |W| |2| |*| |Toad| |(</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">where <code class="display"><span class="extract">W</span></code> indicates a white space token. What we do is scan through the
|
|
text until we reach the start of a new token, and then break off what we
|
|
scanned through since the last time.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Look for individual tokens</span> <span class="cwebmacronumber">20.2.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c_start</span><span class="plain"> = 0, </span><span class="identifier">escaped</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">p</span><span class="plain"> = 0; </span><span class="identifier">p</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">), </span><span class="identifier">c2</span><span class="plain"> = 0, </span><span class="identifier">c3</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">-1) </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">+1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">-2) </span><span class="identifier">c3</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">+2);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">escaped</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'$'</span><span class="plain">) && ((</span><span class="identifier">p</span><span class="plain"> == 0) || (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">-1)) == </span><span class="identifier">FALSE</span><span class="plain">)))</span>
|
|
<<span class="cwebmacro">Break off here for real, binary or hexadecimal notation</span> <span class="cwebmacronumber">20.2.2.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) </span><<span class="cwebmacro">Break off here for negative number</span> <span class="cwebmacronumber">20.2.2.1.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Break off here for operators</span> <span class="cwebmacronumber">20.2.2.1.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c1</span><span class="plain"> == 0</span><span class="identifier">x00A7</span><span class="plain">) </span><span class="identifier">escaped</span><span class="plain"> = </span><span class="identifier">escaped</span><span class="plain">?</span><span class="identifier">FALSE</span><span class="plain">:</span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_start</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_2">§20.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2_1_1"></a><b>§20.2.2.1.1. </b>Recall that in I6 notation, a dollar introduces a non-decimal number, and
|
|
the character after the initial dollar determines which:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">$+3.14159E2</span>
|
|
<span class="plain">$$1001001</span>
|
|
<span class="plain">$1FE6</span>
|
|
|
|
<<span class="cwebmacrodefn">Break off here for real, binary or hexadecimal notation</span> <span class="cwebmacronumber">20.2.2.1.1</span>> =
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">c2</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'+'</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">:</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1) == </span><span class="character">'.'</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1) == </span><span class="character">'E'</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1) == </span><span class="character">'e'</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1))))</span>
|
|
<span class="identifier">y</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'$'</span><span class="plain">:</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1) == </span><span class="character">'0'</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1) == </span><span class="character">'1'</span><span class="plain">))</span>
|
|
<span class="identifier">y</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">:</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">+1)))</span>
|
|
<span class="identifier">y</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_2_1">§20.2.2.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2_1_2"></a><b>§20.2.2.1.2. </b>A token beginning with a minus sign and continuing with digits may still
|
|
not be a negative number: it may be the binary subtraction operator.
|
|
For example, we need to tokenise <code class="display"><span class="extract">x-1</span></code> as
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">x| |-| |1</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">and not as
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain">x| |-1</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">This requires context, that is, remembering what the previous token was.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Break off here for negative number</span> <span class="cwebmacronumber">20.2.2.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">preceding_token</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">preceding_token</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">preceding_token</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPERATOR_ISTT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">preceding_token</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DIVIDER_ISTT</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">c_start</span><span class="plain"> == </span><span class="identifier">p</span><span class="plain">) &&</span>
|
|
<span class="plain">(!((</span><span class="identifier">abbreviated</span><span class="plain">) && (</span><span class="identifier">preceding_token</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">INLINE_ISTT</span><span class="plain">)))) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dc</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">dc</span><span class="plain">))) </span><span class="identifier">dc</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dc</span><span class="plain"> > </span><span class="identifier">p</span><span class="plain">+1) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">dc</span><span class="plain"> - 1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_2_1">§20.2.2.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2_1_3"></a><b>§20.2.2.1.3. </b>In I6, operators made of non-alphanumeric characters can be up to three
|
|
characters long, and we take the longest match: thus <code class="display"><span class="extract">--></span></code> is a trigraph,
|
|
not the monograph <code class="display"><span class="extract">-</span></code> followed by the digraph <code class="display"><span class="extract">-></span></code>.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">We treat the <code class="display"><span class="extract">@</span></code> sign as if it were alphanumeric for the sake of assembly
|
|
language opcodes such as <code class="display"><span class="extract">@pull</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Break off here for operators</span> <span class="cwebmacronumber">20.2.2.1.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">trigraph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">c1</span><span class="plain">)) || (</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) || (</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'$'</span><span class="plain">)) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c1</span><span class="plain"> == 0</span><span class="identifier">x00A7</span><span class="plain">) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c2</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c2</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c3</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'@'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c2</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'+'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'+'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'>'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'='</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'<'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'='</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'='</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'='</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'>'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'.'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'&'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'.'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'~'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'~'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'~'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'='</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'&'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'&'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'|'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'|'</span><span class="plain">)) </span><span class="identifier">digraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) && (</span><span class="identifier">c3</span><span class="plain"> == </span><span class="character">'>'</span><span class="plain">)) </span><span class="identifier">trigraph</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trigraph</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+2;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain"> += 2;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">digraph</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">p</span><span class="plain">++;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">monograph</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">x</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">; </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
|
<span class="identifier">c_start</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">+1;</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_2_1">§20.2.2.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2_1_4"></a><b>§20.2.2.1.4. </b>In this code, the new token is between character positions <code class="display"><span class="extract">x</span></code> and <code class="display"><span class="extract">y</span></code>
|
|
inclusive; we ignore an empty token.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">y</span><span class="plain"> >= </span><span class="identifier">x</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"> <= </span><span class="identifier">y</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RAW_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">which</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">which_rw</span><span class="plain"> = 0, </span><span class="identifier">which_number</span><span class="plain"> = -1, </span><span class="identifier">which_quote</span><span class="plain"> = -1;</span>
|
|
<<span class="cwebmacro">Identify this new token</span> <span class="cwebmacronumber">20.2.2.1.4.1</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="identifier">is</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">which</span><span class="plain">, </span><span class="identifier">which_rw</span><span class="plain">, </span><span class="identifier">which_number</span><span class="plain">);</span>
|
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">which_quote</span><span class="plain"> >= 0) </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>as_quoted</span><span class="plain"> = </span><span class="identifier">quoted_inames</span><span class="plain">[</span><span class="identifier">which_quote</span><span class="plain">];</span>
|
|
<span class="plain">#</span><span class="identifier">endif</span>
|
|
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">) </span><span class="identifier">preceding_token</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_2_1">§20.2.2.1</a>, <a href="#SP20_2_2_1_1">§20.2.2.1.1</a> (four times), <a href="#SP20_2_2_1_2">§20.2.2.1.2</a> (twice), <a href="#SP20_2_2_1_3">§20.2.2.1.3</a> (6 times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2_2_1_4_1"></a><b>§20.2.2.1.4.1. </b>Finally, we identify what sort of token we're looking at.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Identify this new token</span> <span class="cwebmacronumber">20.2.2.1.4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == </span><span class="character">'@'</span><span class="plain">) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPCODE_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == 0</span><span class="identifier">x00A7</span><span class="plain">)</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 1) == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 2)))) {</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'_'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'#'</span><span class="plain">) && (!</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)))</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">RAW_ISTT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 1)))) {</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'_'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'$'</span><span class="plain">) && (!</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)))</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">RAW_ISTT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == </span><span class="character">'_'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 1)))) {</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'_'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'#'</span><span class="plain">) && (!</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)))</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">RAW_ISTT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0))) {</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> != </span><span class="character">'_'</span><span class="plain">) && (!</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)))</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">RAW_ISTT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"QUOTED_INAME_0_"</span><span class="plain">)) </span><span class="identifier">which_quote</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"QUOTED_INAME_1_"</span><span class="plain">)) </span><span class="identifier">which_quote</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"I7_string"</span><span class="plain">)) { </span><span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"I7_String"</span><span class="plain">); }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"COMMA_WORD"</span><span class="plain">)) { </span><span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"comma_word"</span><span class="plain">); }</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0))) {</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">NUMBER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">Characters::isdigit</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">))</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">RAW_ISTT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == </span><span class="character">'$'</span><span class="plain">) {</span>
|
|
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">HEX_NUMBER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 1);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'$'</span><span class="plain">) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">BIN_NUMBER_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'+'</span><span class="plain">) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">REAL_NUMBER_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">REAL_NUMBER_ISTT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 0) == </span><span class="character">'-'</span><span class="plain">) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">NUMBER_ISTT</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"false"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">NUMBER_ISTT</span><span class="plain">; </span><span class="identifier">which_number</span><span class="plain"> = 0; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"true"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">NUMBER_ISTT</span><span class="plain">; </span><span class="identifier">which_number</span><span class="plain"> = 1; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"nothing"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">NUMBER_ISTT</span><span class="plain">; </span><span class="identifier">which_number</span><span class="plain"> = 0; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"if"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">IF_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"else"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">ELSE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"style"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">STYLE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"return"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">RETURN_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rtrue"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">RTRUE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rfalse"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">RFALSE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"for"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">FOR_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"objectloop"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">OBJECTLOOP_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"while"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">WHILE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"do"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">DO_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"until"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">UNTIL_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"print"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">PRINT_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"print_ret"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">PRINTRET_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"new_line"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">NEWLINE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"give"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">GIVE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"move"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">MOVE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"remove"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">REMOVE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"jump"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">JUMP_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"switch"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">SWITCH_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"default"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">DEFAULT_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"font"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">FONT_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"continue"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">CONTINUE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"break"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">BREAK_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"quit"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">QUIT_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"restore"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">RESTORE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"spaces"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">SPACES_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"read"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">READ_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inversion"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">INVERSION_I6RW</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#IFDEF"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">IFDEF_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#IFNDEF"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">IFNDEF_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#IFTRUE"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">IFTRUE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#IFFALSE"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">IFFALSE_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#IFNOT"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">IFNOT_I6RW</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#ENDIF"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">; </span><span class="identifier">which_rw</span><span class="plain"> = </span><span class="constant">ENDIF_I6RW</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">","</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">COMMA_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">":"</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">COLON_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"("</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">")"</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"{"</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"}"</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">";"</span><span class="plain">)) </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">DIVIDER_ISTT</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">".&"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">".#"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"="</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">STORE_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"+"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">PLUS_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"-"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">MINUS_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">TIMES_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"/"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">DIVIDE_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"%"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">MODULO_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">">"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">GT_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">">="</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">GE_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"<"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">LT_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"<="</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">LE_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"=="</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">EQ_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"~="</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">NE_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"~~"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">NOT_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"&&"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">AND_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"||"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">OR_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"or"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">ALTERNATIVE_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"ofclass"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">OFCLASS_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"has"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">HAS_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"hasnt"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">HASNT_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"provides"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">PROVIDES_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">IN_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"notin"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">NOTIN_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"|"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">BITWISEOR_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"&"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">BITWISEAND_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"~"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">BITWISENOT_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"++"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">; }</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"->"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">LOOKUPBYTE_BIP</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"-->"</span><span class="plain">)) { </span><span class="identifier">is</span><span class="plain"> = </span><span class="constant">OPERATOR_ISTT</span><span class="plain">; </span><span class="identifier">which</span><span class="plain"> = </span><span class="constant">LOOKUP_BIP</span><span class="plain">; }</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_2_2_1_4">§20.2.2.1.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_3"></a><b>§20.3. Stage 2. </b>In the second half of the process, we apply a series of transformations to
|
|
the schema tree, gradually shaking out the (sometimes ambiguous) syntactic
|
|
markers such as <code class="display"><span class="extract">COMMA_ISTT</span></code> and replacing them with semantically clear
|
|
subtrees.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Each transformation will be applied until it returns <code class="display"><span class="extract">FALSE</span></code> to say that
|
|
it could see nothing to do, or <code class="display"><span class="extract">NOT_APPLICABLE</span></code> to say that it did but
|
|
that it doesn't want to be called again. Some transformations make use
|
|
of temporary markers attached to nodes or tokens in the tree, so we clear
|
|
these out at the start of each iteration.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="identifier">X</span><span class="plain">)</span>
|
|
<span class="plain">{</span>
|
|
<span class="functiontext">InterSchemas::unmark</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">TRUE</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">X</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">SCHEMA_COMPILATION_DETAILS</span><span class="plain">, </span><span class="string">"After round of "</span><span class="plain"> #</span><span class="identifier">X</span><span class="plain"> </span><span class="string">":\</span><span class="plain">n</span><span class="string">$1\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> == </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::unmark</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>preinsert</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>postinsert</span><span class="plain"> = 0;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">InterSchemas::unmark</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::unmark appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_4"></a><b>§20.4. </b>With that mechanism in place, we can do the business:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Perform transformations to grow the tree and reduce the token count</span> <span class="cwebmacronumber">20.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::implied_braces</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::unbrace_schema</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::divide_schema</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::undivide_schema</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::resolve_halfopen_blocks</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::break_early_bracings</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::strip_spacing</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::splitprints</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::splitcases</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::strip_spacing</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::splitprints</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::identify_constructs</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::treat_constructs</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::add_missing_bodies</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::remove_empties</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::outer_subexpressions</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::top_level_commas</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::alternatecases</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::outer_subexpressions</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::strip_all_spacing</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::debracket</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::implied_return_values</span><span class="plain">);</span>
|
|
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::message_calls</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::implied_braces</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">IF_I6RW</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">WHILE_I6RW</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">FOR_I6RW</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">SWITCH_I6RW</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">OBJECTLOOP_I6RW</span><span class="plain">))) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) { </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Make pre and post markers from here</span> <span class="cwebmacronumber">21.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">ELSE_I6RW</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Make pre and post markers from here</span> <span class="cwebmacronumber">21.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">changed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">rounds</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">changed</span><span class="plain">) {</span>
|
|
<span class="identifier">changed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">rounds</span><span class="plain">++;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prev</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>preinsert</span><span class="plain"> > 0)) {</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>preinsert</span><span class="plain">--;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">open_b</span><span class="plain"> =</span>
|
|
<span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"{"</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="functiontext">InterSchemas::add_token_after</span><span class="plain">(</span><span class="identifier">open_b</span><span class="plain">, </span><span class="identifier">prev</span><span class="plain">);</span>
|
|
<span class="identifier">changed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>postinsert</span><span class="plain"> > 0) {</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>postinsert</span><span class="plain">--;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">close_b</span><span class="plain"> =</span>
|
|
<span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"}"</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="functiontext">InterSchemas::add_token_after</span><span class="plain">(</span><span class="identifier">close_b</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
|
|
<span class="identifier">changed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rounds</span><span class="plain"> > 1) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::implied_braces is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21_1"></a><b>§21.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Make pre and post markers from here</span> <span class="cwebmacronumber">21.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>preinsert</span><span class="plain">++;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found_if</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">brl</span><span class="plain"> = 0, </span><span class="identifier">posted</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">upped</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">last_n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">) { </span><span class="identifier">brl</span><span class="plain">++; </span><span class="identifier">upped</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">brl</span><span class="plain"> == 0) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">IF_I6RW</span><span class="plain">))</span>
|
|
<span class="identifier">found_if</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">brl</span><span class="plain"> == 0) &&</span>
|
|
<span class="plain">((</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DIVIDER_ISTT</span><span class="plain">) ||</span>
|
|
<span class="plain">((</span><span class="identifier">upped</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">)))) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">m</span><span class="plain">) && (</span><span class="identifier">m</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">found_if</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) || (</span><span class="identifier">m</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">m</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">RESERVED_ISTT</span><span class="plain">) || (</span><span class="identifier">m</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> != </span><span class="constant">ELSE_I6RW</span><span class="plain">)) {</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>postinsert</span><span class="plain">++; </span><span class="identifier">posted</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">last_n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">posted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">last_n</span><span class="plain">-</span><span class="element">>postinsert</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP21">§21</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::unbrace_schema</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prev</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">code_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">CODE_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">code_isn</span><span class="plain">;</span>
|
|
<span class="identifier">code_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">code_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">code_isn</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) { </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">; }</span>
|
|
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">pn</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">brl</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_BRACE_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_BRACE_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">brl</span><span class="plain">--;</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">brl</span><span class="plain"> == 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">pn</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">resumed</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">resumed</span><span class="plain">) && (</span><span class="identifier">resumed</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">resumed</span><span class="plain"> = </span><span class="identifier">resumed</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">resumed</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">resumed</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::unbrace_schema</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::divide_schema</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DIVIDER_ISTT</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">) {</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::divide_schema</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::undivide_schema</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DIVIDER_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DIVIDER_ISTT</span><span class="plain">) { </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::undivide_schema</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::resolve_halfopen_blocks</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">INLINE_ISTT</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> == </span><span class="constant">open_brace_ISINC</span><span class="plain">)) {</span>
|
|
<span class="functiontext">InterSchemas::mark_unclosed</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">INLINE_ISTT</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_command</span><span class="plain"> == </span><span class="constant">close_brace_ISINC</span><span class="plain">)) {</span>
|
|
<span class="functiontext">InterSchemas::mark_unopened</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">);</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">) {</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::resolve_halfopen_blocks</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::permitted_early</span><span class="plain">(</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">INLINE_ISTT</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::break_early_bracings</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">InterSchemas::permitted_early</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">)) {</span>
|
|
<span class="identifier">m</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">m</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">) {</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
|
|
<span class="identifier">m</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::break_early_bracings</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::strip_spacing</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">t</span><span class="plain">) && (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::strip_spacing</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::strip_all_spacing</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">) { </span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">; </span><span class="identifier">d</span><span class="plain">++; }</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> > 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::strip_all_spacing</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::unbrace_schema is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::divide_schema is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::undivide_schema is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::resolve_halfopen_blocks is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::permitted_early appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::break_early_bracings is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::strip_spacing is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::strip_all_spacing is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::splitprints</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">)</span>
|
|
<span class="plain">&& ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">PRINT_I6RW</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">PRINTRET_I6RW</span><span class="plain">))) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">COMMA_ISTT</span><span class="plain">) && (</span><span class="identifier">bl</span><span class="plain"> == 0)) {</span>
|
|
<span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">RESERVED_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> = </span><span class="constant">PRINT_I6RW</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"print"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">PRINT_I6RW</span><span class="plain">) </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"print"</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"print_ret"</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::splitprints</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::splitprints is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP24"></a><b>§24. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::casey</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">COLON_ISTT</span><span class="plain">) && (</span><span class="identifier">bl</span><span class="plain"> == 0)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::splitcases</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">COLON_ISTT</span><span class="plain">) && (</span><span class="identifier">bl</span><span class="plain"> == 0)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">original_child</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defaulter</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">DEFAULT_I6RW</span><span class="plain">)) </span><span class="identifier">defaulter</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">sw_val</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">sw_code</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defaulter</span><span class="plain">) {</span>
|
|
<span class="identifier">sw_code</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">CODE_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">sw_code</span><span class="plain">;</span>
|
|
<span class="identifier">sw_code</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">sw_val</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">sw_code</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">CODE_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">sw_val</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">sw_code</span><span class="plain">;</span>
|
|
<span class="identifier">sw_val</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">sw_val</span><span class="plain">;</span>
|
|
<span class="identifier">sw_code</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">switch_begins</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">switch_ends</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">pn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">pn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">SWITCH_I6RW</span><span class="plain">)) {</span>
|
|
<span class="identifier">switch_begins</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">pn2</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">pn2</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pn2</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) { </span><span class="identifier">switch_ends</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="identifier">pn2</span><span class="plain"> = </span><span class="identifier">pn2</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">pn</span><span class="plain"> = </span><span class="identifier">pn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_ends</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">InterSchemas::mark_unclosed</span><span class="plain">(</span><span class="identifier">sw_code</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_begins</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">InterSchemas::mark_case_closed</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sw_val</span><span class="plain">) </span><span class="identifier">sw_val</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">STATEMENT_ISNT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defaulter</span><span class="plain">)</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">DEFAULT_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">CASE_BIP</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">sw_code_exp</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">sw_code_exp</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">sw_code</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">sw_code_exp</span><span class="plain">;</span>
|
|
<span class="identifier">sw_code_exp</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">sw_code</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sw_val</span><span class="plain">)</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">sw_val</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">sw_val</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">sw_code_exp</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">sw_code_exp</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">sw_code_exp</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">original_child</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">attach</span><span class="plain"> = </span><span class="identifier">sw_code_exp</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">at</span><span class="plain">) && (</span><span class="functiontext">InterSchemas::casey</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">next_at</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">sw_code</span><span class="plain">;</span>
|
|
<span class="identifier">attach</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="identifier">attach</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">next_at</span><span class="plain">;</span>
|
|
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">next_at</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::splitcases</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::casey appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::splitcases is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::alternatecases</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">CASE_BIP</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">) && (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">OPERATION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">ALTERNATIVECASE_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">A</span><span class="plain">;</span>
|
|
<span class="identifier">A</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">; </span><span class="identifier">B</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">B</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">; </span><span class="identifier">B</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::alternatecases</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::alternatecases is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26"></a><b>§26. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::identify_constructs</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) {</span>
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">subordinate_to</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">operand2</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">operand2_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dangle</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">dangle_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PRINT_I6RW</span><span class="plain">:</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PRINTRET_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTNUMBER_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pr</span><span class="plain">) {</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"address"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTADDRESS_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"number"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTNLNUMBER_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"char"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTCHAR_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"string"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTSTRING_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"name"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTNAME_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"object"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTOBJ_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"property"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTPROPERTY_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"the"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTDEF_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"The"</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTCDEF_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"a"</span><span class="plain">)) || (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"an"</span><span class="plain">))) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTINDEF_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"A"</span><span class="plain">)) || (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"An"</span><span class="plain">))) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINTCINDEF_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">pr</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">open_b</span><span class="plain"> =</span>
|
|
<span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"("</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="functiontext">InterSchemas::add_token_after</span><span class="plain">(</span><span class="identifier">open_b</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">);</span>
|
|
<span class="identifier">open_b</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">open_b</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">close_b</span><span class="plain"> =</span>
|
|
<span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">")"</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="functiontext">InterSchemas::add_token_after</span><span class="plain">(</span><span class="identifier">close_b</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subordinate_to</span><span class="plain"> == </span><span class="constant">PRINTNUMBER_BIP</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DQUOTED_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINT_BIP</span><span class="plain">;</span>
|
|
<span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">PRINTRET_I6RW</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">save_next</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">STATEMENT_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">PRINT_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="functiontext">InterSchemas::add_token_to_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">DQUOTED_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, 0, 0, -1));</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">STATEMENT_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">RETURN_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">save_next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">STYLE_I6RW</span><span class="plain">: {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"roman"</span><span class="plain">))) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">STYLEROMAN_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"bold"</span><span class="plain">))) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">STYLEBOLD_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"underline"</span><span class="plain">))) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">STYLEUNDERLINE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"reverse"</span><span class="plain">))) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">STYLEREVERSE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subordinate_to</span><span class="plain">) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INVERSION_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">INVERSION_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FONT_I6RW</span><span class="plain">: {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">FONT_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"on"</span><span class="plain">))) </span><span class="identifier">dangle</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"off"</span><span class="plain">))) </span><span class="identifier">dangle</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OBJECTLOOP_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">OBJECTLOOP_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SWITCH_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">SWITCH_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IF_I6RW</span><span class="plain">: {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">IF_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">next_isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">next_isn</span><span class="plain">) && (</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">ELSE_I6RW</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand2</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">IFELSE_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">operand2_node</span><span class="plain"> = </span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FOR_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">FOR_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">WHILE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">WHILE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DO_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">DO_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">next_isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">next_isn</span><span class="plain">) && (</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">RESERVED_ISTT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain"> == </span><span class="constant">UNTIL_I6RW</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">next_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"do without until"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">JUMP_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">JUMP_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RETURN_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">RETURN_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RTRUE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">RETURN_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">dangle</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RFALSE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">RETURN_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">dangle</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BREAK_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">BREAK_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CONTINUE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">CONTINUE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">QUIT_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">QUIT_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RESTORE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">RESTORE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SPACES_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">SPACES_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NEWLINE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PRINT_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">dangle_text</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MOVE_I6RW</span><span class="plain">: {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"to"</span><span class="plain">)) {</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">;</span>
|
|
<span class="identifier">operand2</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">operand2</span><span class="plain">) && (</span><span class="identifier">operand2</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">operand2</span><span class="plain"> = </span><span class="identifier">operand2</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">operand1</span><span class="plain">) && (</span><span class="identifier">operand2</span><span class="plain">)) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">MOVE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">READ_I6RW</span><span class="plain">: {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand2</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">operand2</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">operand1</span><span class="plain">) && (</span><span class="identifier">operand2</span><span class="plain">)) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">READ_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REMOVE_I6RW</span><span class="plain">:</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">REMOVE_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">GIVE_I6RW</span><span class="plain">: {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand1</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPERATOR_ISTT</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> == </span><span class="constant">BITWISENOT_BIP</span><span class="plain">)) {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">TAKE_BIP</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">GIVE_BIP</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">operand2</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">DIRECTIVE_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">DIRECTIVE_ISNT</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>dir_clarifier</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>reserved_word</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">)</span>
|
|
<span class="identifier">n</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">subordinate_to</span><span class="plain"> = 0;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPCODE_ISTT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"@push"</span><span class="plain">)) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PUSH_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"@pull"</span><span class="plain">)) </span><span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="constant">PULL_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">ASSEMBLY_ISNT</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">prev_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">l</span><span class="plain">?(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">):</span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">=</span><span class="identifier">n</span><span class="plain">?(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">):</span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> = 0;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"-"</span><span class="plain">))) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="string">"-%S"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">);</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">NUMBER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"->"</span><span class="plain">)) </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">ASM_ARROW_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sp"</span><span class="plain">)) </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">ASM_SP_ISTT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"?"</span><span class="plain">)) && (</span><span class="identifier">n</span><span class="plain">)) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">ASM_LABEL_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"~"</span><span class="plain">)) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">ASM_NEGATED_LABEL_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev_node</span><span class="plain">) </span><span class="identifier">prev_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="identifier">prev_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subordinate_to</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">operand1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">operand1</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">operand1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="identifier">subordinate_to</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">STATEMENT_ISNT</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dangle</span><span class="plain"> != </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">) {</span>
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">dangle</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">NUMBER_ISTT</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dangle_text</span><span class="plain">) {</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">DQUOTED_ISTT</span><span class="plain">, </span><span class="identifier">dangle_text</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>material</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">operand2</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">subordinate_to</span><span class="plain"> == </span><span class="constant">IFELSE_BIP</span><span class="plain">) {</span>
|
|
<span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_new_isn</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">operand2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">))</span>
|
|
<span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">operand2_node</span><span class="plain">) {</span>
|
|
<span class="identifier">operand2_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">operand2_node</span><span class="plain">;</span>
|
|
<span class="identifier">operand2_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">operand2_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">operand2_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> != </span><span class="constant">ASSEMBLY_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> != </span><span class="constant">DIRECTIVE_ISNT</span><span class="plain">))</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::identify_constructs</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::identify_constructs is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27"></a><b>§27. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::treat_constructs</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">FOR_BIP</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">predicates</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">predicates</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">predicates</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> != </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">))</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"malformed proto-for"</span><span class="plain">);</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">predicates</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">code_node</span><span class="plain"> = </span><span class="identifier">predicates</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0, </span><span class="identifier">cw</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">[3], *</span><span class="identifier">to</span><span class="plain">[3];</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><3; </span><span class="identifier">i</span><span class="plain">++) { </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = 0; </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = 0; }</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> > 0) && (</span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span><<span class="cwebmacro">End a wodge</span> <span class="cwebmacronumber">27.1</span>><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 1) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">COLON_ISTT</span><span class="plain">) </span><<span class="cwebmacro">End a wodge</span> <span class="cwebmacronumber">27.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cw</span><span class="plain"> != 3) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"malformed for prototype"</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><3; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">eval_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EVAL_ISNT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 0) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 1) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 2) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
|
|
<span class="identifier">eval_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">code_node</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">eval_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">expr_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">eval_isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">expr_isn</span><span class="plain">;</span>
|
|
<span class="identifier">expr_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">m</span><span class="plain">) && (</span><span class="identifier">m</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">m</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">expr_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">m</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) </span><span class="identifier">expr_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">m</span><span class="plain">) {</span>
|
|
<span class="identifier">m</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">expr_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">m</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) </span><span class="identifier">m</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">m</span><span class="plain"> = </span><span class="identifier">m</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::treat_constructs</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::treat_constructs is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27_1"></a><b>§27.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">End a wodge</span> <span class="cwebmacronumber">27.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] == </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">]) { </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">; }</span>
|
|
<span class="identifier">cw</span><span class="plain">++;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP27">§27</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP28"></a><b>§28. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::add_missing_bodies</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">req</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">IF_BIP</span><span class="plain">)) </span><span class="identifier">req</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">IFELSE_BIP</span><span class="plain">)) </span><span class="identifier">req</span><span class="plain"> = 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">FOR_BIP</span><span class="plain">)) </span><span class="identifier">req</span><span class="plain"> = 4;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">WHILE_BIP</span><span class="plain">)) </span><span class="identifier">req</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">OBJECTLOOP_BIP</span><span class="plain">)) </span><span class="identifier">req</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">req</span><span class="plain"> > 0) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">actual</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">ch</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">; </span><span class="identifier">ch</span><span class="plain">; </span><span class="identifier">ch</span><span class="plain">=</span><span class="identifier">ch</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) </span><span class="identifier">actual</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actual</span><span class="plain"> < </span><span class="identifier">req</span><span class="plain">-1) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"far too few child nodes"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actual</span><span class="plain"> > </span><span class="identifier">req</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"too many child nodes"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">actual</span><span class="plain"> == </span><span class="identifier">req</span><span class="plain">-1) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">code_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">CODE_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">code_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">ch</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">ch</span><span class="plain">) && (</span><span class="identifier">ch</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">)) </span><span class="identifier">ch</span><span class="plain">=</span><span class="identifier">ch</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">ch</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">code_isn</span><span class="plain">;</span>
|
|
|
|
<span class="functiontext">InterSchemas::mark_unclosed</span><span class="plain">(</span><span class="identifier">code_isn</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::add_missing_bodies</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::remove_empties</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev</span><span class="plain">) </span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">par</span><span class="plain">) </span><span class="identifier">par</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">-</span><span class="element">>node_tree</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::remove_empties</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::top_level_commas</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> ( ; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">COMMA_ISTT</span><span class="plain">) && (</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">prev</span><span class="plain">)) {</span>
|
|
<span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) { </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">; }</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>semicolon_terminated</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::top_level_commas</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::debracket</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::outer_subexpressions</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::op_subexpressions</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::place_calls</span><span class="plain">(</span><span class="identifier">par</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::outer_subexpressions</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> ( ; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 1, </span><span class="identifier">fails</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">, *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">fails</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">fails</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain">) && (</span><span class="identifier">to</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">SUBEXPRESSION_ISNT</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::outer_subexpressions</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::prefer_over</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">existing</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::precedence</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) < </span><span class="functiontext">InterSchemas::precedence</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InterSchemas::precedence</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="functiontext">InterSchemas::precedence</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InterSchemas::right_associative</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InterSchemas::arity</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == 2) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">InterSchemas::arity</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">) == 2)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::op_subexpressions</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> ( ; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>node_marked</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">best_operator</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">break_at</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPERATOR_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">this_operator</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::prefer_over</span><span class="plain">(</span><span class="identifier">this_operator</span><span class="plain">, </span><span class="identifier">best_operator</span><span class="plain">)) {</span>
|
|
<span class="identifier">break_at</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">best_operator</span><span class="plain"> = </span><span class="identifier">this_operator</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">break_at</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">, *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">break_at</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">has_operand_before</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">has_operand_after</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="identifier">has_operand_before</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">best_operator</span><span class="plain"> == </span><span class="constant">IN_BIP</span><span class="plain">) {</span>
|
|
<span class="identifier">break_at</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
|
<span class="identifier">break_at</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">break_at</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">break_at</span><span class="plain">) {</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">break_at</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">from</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="identifier">has_operand_after</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">OPERATION_ISNT</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="identifier">break_at</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">break_at</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> == </span><span class="constant">MINUS_BIP</span><span class="plain">) && (</span><span class="identifier">has_operand_before</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">UNARYMINUS_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">break_at</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> == </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">) && (</span><span class="identifier">has_operand_before</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">PREINCREMENT_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">break_at</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> == </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">) && (</span><span class="identifier">has_operand_before</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = </span><span class="constant">PREDECREMENT_BIP</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">break_at</span><span class="plain">-</span><span class="element">>operation_primitive</span><span class="plain"> == </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">) && (</span><span class="identifier">has_operand_before</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">LABEL_ISNT</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = 0;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">a</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">has_operand_before</span><span class="plain">) </span><span class="identifier">a</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">has_operand_after</span><span class="plain">) </span><span class="identifier">a</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">a</span><span class="plain"> != </span><span class="functiontext">InterSchemas::arity</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain">)) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Seem to have arity %d with isn %S which needs %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
|
|
<span class="identifier">a</span><span class="plain">, </span><span class="functiontext">Primitives::name</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain">),</span>
|
|
<span class="functiontext">InterSchemas::arity</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain">));</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$1\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">);</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad arity"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::op_subexpressions</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::place_calls</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> ( ; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0, </span><span class="identifier">term_count</span><span class="plain"> = 0, </span><span class="identifier">tops</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">opener</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">closer</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 1) { </span><span class="identifier">opener</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">closer</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">term_count</span><span class="plain">++; }</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) { </span><span class="identifier">closer</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; }</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span><span class="identifier">tops</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">term_count</span><span class="plain"> == 2) && (</span><span class="identifier">tops</span><span class="plain"> == 0) && (</span><span class="identifier">opener</span><span class="plain">) && (</span><span class="identifier">closer</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Call brackets found</span> <span class="cwebmacronumber">28.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">opener</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">closer</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pre_count</span><span class="plain"> = 0, </span><span class="identifier">pre_bracings</span><span class="plain"> = 0, </span><span class="identifier">post_count</span><span class="plain"> = 0, </span><span class="identifier">veto</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 1) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">opener</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">opener</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">veto</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
|
<span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">closer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">closer</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> != </span><span class="constant">INLINE_ISTT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">opener</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">pre_count</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">opener</span><span class="plain">) && (</span><span class="identifier">closer</span><span class="plain">)) </span><span class="identifier">post_count</span><span class="plain">++;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">opener</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">pre_bracings</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">pre_count</span><span class="plain"> == 1) || ((</span><span class="identifier">pre_count</span><span class="plain"> == 0) && (</span><span class="identifier">pre_bracings</span><span class="plain"> > 0))) &&</span>
|
|
<span class="plain">(</span><span class="identifier">post_count</span><span class="plain"> == 0) && (</span><span class="identifier">opener</span><span class="plain">) && (</span><span class="identifier">closer</span><span class="plain">) && (</span><span class="identifier">veto</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Call brackets found</span> <span class="cwebmacronumber">28.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::place_calls</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::add_missing_bodies is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::remove_empties is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::top_level_commas is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::debracket is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::outer_subexpressions is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::prefer_over appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::op_subexpressions appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::place_calls appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP28_1"></a><b>§28.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Call brackets found</span> <span class="cwebmacronumber">28.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">, *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">opener</span><span class="plain">, *</span><span class="identifier">resume</span><span class="plain"> = </span><span class="identifier">opener</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Relegate node</span> <span class="cwebmacronumber">28.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">resume</span><span class="plain">; </span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain"> != </span><span class="identifier">closer</span><span class="plain">) && (</span><span class="identifier">n</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">COMMA_ISTT</span><span class="plain">)) {</span>
|
|
<span class="identifier">to</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">resume</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Relegate node</span> <span class="cwebmacronumber">28.1.1</span>><span class="plain">;</span>
|
|
<span class="identifier">from</span><span class="plain"> = </span><span class="identifier">resume</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">to</span><span class="plain"> = </span><span class="identifier">closer</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Relegate node</span> <span class="cwebmacronumber">28.1.1</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">CALL_ISNT</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP28">§28</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP28_1_1"></a><b>§28.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Relegate node</span> <span class="cwebmacronumber">28.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain">) && (</span><span class="identifier">to</span><span class="plain">) && (</span><span class="identifier">from</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="identifier">from</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">l</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">l</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) </span><span class="identifier">l</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">xisn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">xisn</span><span class="plain">) && (</span><span class="identifier">xisn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">)) </span><span class="identifier">xisn</span><span class="plain"> = </span><span class="identifier">xisn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">xisn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP28_1">§28.1</a> (three times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP29"></a><b>§29. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::implied_return_values</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">STATEMENT_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">RETURN_BIP</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">NUMBER_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"1"</span><span class="plain">, 0, 0, -1);</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">-</span><span class="element">>owner</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::implied_return_values</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::implied_return_values is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP30"></a><b>§30. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::message_calls</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">OPERATION_ISNT</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> == </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">) && (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">CALL_ISNT</span><span class="plain">)) {</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">;</span>
|
|
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">;</span>
|
|
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">MESSAGE_ISNT</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_clarifier</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">obj</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">message</span><span class="plain">; </span><span class="identifier">message</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">message</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">args</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">message</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
|
|
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">message</span><span class="plain">-</span><span class="element">>expression_tokens</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) && (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"call"</span><span class="plain">))) {</span>
|
|
<span class="identifier">obj</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">args</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain"> = </span><span class="constant">CALLMESSAGE_ISNT</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">args</span><span class="plain">) { </span><span class="identifier">args</span><span class="plain">-</span><span class="element">>parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">args</span><span class="plain"> = </span><span class="identifier">args</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain">; }</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::message_calls</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::message_calls is used in <a href="#SP20_4">§20.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP31"></a><b>§31. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">m</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">run_start</span><span class="plain"> = -1, </span><span class="identifier">run_len</span><span class="plain"> = 0, </span><span class="identifier">run_includes</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">run_start</span><span class="plain"> == -1) {</span>
|
|
<span class="identifier">run_start</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="identifier">run_len</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">run_includes</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">run_len</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">) </span><span class="identifier">run_includes</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">run_start</span><span class="plain"> >= 0) && (</span><span class="identifier">run_includes</span><span class="plain">)) {</span>
|
|
<span class="identifier">Str::put_at</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">run_start</span><span class="plain">, </span><span class="character">' '</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain"><</span><span class="identifier">run_len</span><span class="plain">-1; </span><span class="identifier">j</span><span class="plain">++)</span>
|
|
<span class="identifier">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">run_start</span><span class="plain">+1);</span>
|
|
<span class="identifier">i</span><span class="plain"> = </span><span class="identifier">run_start</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">run_start</span><span class="plain"> = -1;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">m</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'^'</span><span class="plain">)</span>
|
|
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'~'</span><span class="plain">)</span>
|
|
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::de_escape_text is used in <a href="#SP20_2_2">§20.2.2</a>, <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP32"></a><b>§32. Operators in I6. </b>The following routines return data which is essentially the content of the
|
|
table shown in section 6.2 of the Inform 6 Technical Manual: which operators
|
|
take precedence over which others, which are right or left associative,
|
|
which are prefix or postfix, and so on.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The superclass operator <code class="display"><span class="extract">::</span></code> is not allowed in schemas, but nor is it needed.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">UNPRECEDENTED_OPERATOR</span><span class="plain"> 10000</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::precedence</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STORE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">AND_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OR_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">EQ_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">HAS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">HASNT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OFCLASS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROVIDES_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IN_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOTIN_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 3;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">ALTERNATIVE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 4;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">ALTERNATIVECASE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 4;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PLUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 5;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 5;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">TIMES_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 6;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DIVIDE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 6;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MODULO_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 6;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISEAND_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 6;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISEOR_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 6;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISENOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 6;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LOOKUP_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 7;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LOOKUPBYTE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 7;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">UNARYMINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 8;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 9;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 9;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 9;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 9;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 10;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 10;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 12;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">UNPRECEDENTED_OPERATOR</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::first_operand_ref</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STORE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">InterSchemas::text_form</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STORE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"="</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">AND_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"&&"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OR_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"||"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"~~"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">EQ_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"=="</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">">"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">">="</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"<"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"<="</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"~="</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">HAS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"has"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">HASNT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"hasnt"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OFCLASS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"ofclass"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROVIDES_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"provides"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IN_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"in"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOTIN_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"notin"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">ALTERNATIVE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"or"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PLUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"+"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"-"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">TIMES_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"*"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DIVIDE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"/"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MODULO_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"%"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISEAND_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"&"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISEOR_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"|"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISENOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"~"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LOOKUP_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"-->"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LOOKUPBYTE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"->"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">UNARYMINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"-"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"++"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"++"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">".&"</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">".#"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="string">"???"</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::arity</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STORE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">AND_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OR_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">ALTERNATIVE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">ALTERNATIVECASE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">EQ_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">HAS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">HASNT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OFCLASS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROVIDES_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IN_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOTIN_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PLUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">TIMES_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DIVIDE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MODULO_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISEAND_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISEOR_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISENOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LOOKUP_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">LOOKUPBYTE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">UNARYMINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 2;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::prefix</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">NOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BITWISENOT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">UNARYMINUS_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PREDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTINCREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">POSTDECREMENT_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::right_associative</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STORE_BIP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::precedence is used in <a href="#SP28">§28</a>.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::first_operand_ref is used in 2/eis (<a href="2-eis.html#SP3_8">§3.8</a>).</p>
|
|
|
|
<p class="endnote">The function InterSchemas::text_form appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::arity is used in <a href="#SP28">§28</a>, 2/eis (<a href="2-eis.html#SP3_8">§3.8</a>).</p>
|
|
|
|
<p class="endnote">The function InterSchemas::prefix appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::right_associative is used in <a href="#SP28">§28</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP33"></a><b>§33. Metadata on inter primitives. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::ip_arity</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">arity</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STYLEROMAN_BIP</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STYLEBOLD_BIP</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STYLEUNDERLINE_BIP</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">STYLEREVERSE_BIP</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">INVERSION_BIP</span><span class="plain">)) </span><span class="identifier">arity</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">BREAK_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">CONTINUE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">QUIT_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">MOVE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">GIVE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">TAKE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DEFAULT_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">CASE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">SWITCH_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OBJECTLOOP_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IF_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IFELSE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">FOR_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 4;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">WHILE_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DO_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">READ_BIP</span><span class="plain">) </span><span class="identifier">arity</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">arity</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::ip_loopy</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">loopy</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">OBJECTLOOP_BIP</span><span class="plain">) </span><span class="identifier">loopy</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">FOR_BIP</span><span class="plain">) </span><span class="identifier">loopy</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">WHILE_BIP</span><span class="plain">) </span><span class="identifier">loopy</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DO_BIP</span><span class="plain">) </span><span class="identifier">loopy</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">loopy</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::ip_prim_cat</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">O</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">VAL_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">JUMP_BIP</span><span class="plain">) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">LAB_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">RESTORE_BIP</span><span class="plain">) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">LAB_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">PULL_BIP</span><span class="plain">) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">REF_PRIM_CAT</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IF_BIP</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"> == 1)) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">SWITCH_BIP</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"> == 1)) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">CASE_BIP</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"> == 1)) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">DEFAULT_BIP</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"> == 0)) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">O</span><span class="plain"> == </span><span class="constant">IFELSE_BIP</span><span class="plain">) && (</span><span class="identifier">i</span><span class="plain"> >= 1)) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">InterSchemas::ip_loopy</span><span class="plain">(</span><span class="identifier">O</span><span class="plain">)) && (</span><span class="identifier">i</span><span class="plain"> == </span><span class="functiontext">InterSchemas::ip_arity</span><span class="plain">(</span><span class="identifier">O</span><span class="plain">) - 1)) </span><span class="identifier">ok</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ok</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function InterSchemas::ip_arity is used in 2/eis (<a href="2-eis.html#SP3_10">§3.10</a>).</p>
|
|
|
|
<p class="endnote">The function InterSchemas::ip_loopy appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function InterSchemas::ip_prim_cat is used in 2/eis (<a href="2-eis.html#SP3_10">§3.10</a>).</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><i>(This section begins Chapter 2: Blueprints.)</i></li><li><a href="2-eis.html">Continue with 'Emitting Inter Schemas'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</body>
|
|
</html>
|
|
|