1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-02 23:14:57 +03:00

Pushed back threshold for schema compilation to 200

This commit is contained in:
Graham Nelson 2019-05-05 14:54:24 +01:00
parent 331c70ee6f
commit 790010b4b7
30 changed files with 1296 additions and 654 deletions

View file

@ -32,6 +32,7 @@
<span class="definitionkeyword">enum</span> <span class="constant">inter_schema_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inter_schema_node_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inter_schema_token_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">routine_body_request_MT</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>With allocation functions:
</p>
@ -46,6 +47,7 @@
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inter_schema</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inter_schema_token</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">routine_body_request</span><span class="plain">)</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -67,6 +67,7 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::Assimilate::routine_bodies</span><span class="plain">();</span>
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">outer</span><span class="plain"> = </span><span class="identifier">Inter::Packages::container</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">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">outer</span><span class="plain">-&gt;</span><span class="identifier">codelike_package</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) &amp;&amp;</span>
@ -133,7 +134,7 @@
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">identifier</span><span class="plain">) &amp;&amp; (</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">)) {</span>
<span class="identifier">Str::trim_all_white_space_at_end</span><span class="plain">(</span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">switch_on</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">PLM_SPLAT_IFLD</span><span class="plain">];</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASSIM: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_on</span><span class="plain"> == </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain"> = </span><span class="functiontext">CodeGen::Link::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</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">symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">switch_on</span><span class="plain"> = </span><span class="identifier">CONSTANT_PLM</span><span class="plain">;</span>
@ -418,18 +419,18 @@
<span class="identifier">Inter::Symbols::label</span><span class="plain">(</span><span class="identifier">end_name</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Label::new</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">begin_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">int</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="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">) &gt; 0) {</span>
<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">body</span><span class="plain">) - 1;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">&gt;0) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) != </span><span class="character">']'</span><span class="plain">)) </span><span class="identifier">L</span><span class="plain">--;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">&gt;0) &amp;&amp; (</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">body</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-1)))) </span><span class="identifier">L</span><span class="plain">--;</span>
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+2, </span><span class="identifier">body</span><span class="plain">);</span>
<span class="identifier">veto</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+2, </span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">block_bookmark</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Label::new</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">end_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::pass2</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, &amp;</span><span class="identifier">block_bookmark</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">baseline</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">veto</span><span class="plain">) </span><span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::pass2</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, &amp;</span><span class="identifier">block_bookmark</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">baseline</span><span class="plain">));</span>
<span class="identifier">Inter::Defn::unset_current_package</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">IP</span><span class="plain">, 0);</span>
@ -736,12 +737,46 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mcc_name</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">routine_body_request</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">block_bookmark</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">package_request</span><span class="plain"> *</span><span class="identifier">enclosure</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">block_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass2_offset</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">body</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">routine_body_request</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rb_splat_count</span><span class="plain"> = 1;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">body</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">)) </span><span class="reserved">return</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">body</span><span class="plain">) &lt; 150) {</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">Candidate (%S) len %d: '%S'\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">), </span><span class="identifier">body</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::from_text</span><span class="plain">(</span><span class="identifier">body</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">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">bb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">body</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">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">) &lt; 200) {</span>
<span class="reserved">routine_body_request</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">routine_body_request</span><span class="plain">);</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_bookmark</span><span class="plain"> = </span><span class="identifier">bb</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;enclosure</span><span class="plain"> = </span><span class="identifier">Packaging::enclosure</span><span class="plain">();</span>
<span class="comment">CodeGen::Link::entire_splat(IRS, NULL, I"! Magic\n", offset, block_name);</span>
<span class="comment">CodeGen::Link::entire_splat(IRS, NULL, I"! Yay\n", offset, block_name);</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;position</span><span class="plain"> = </span><span class="identifier">Packaging::bubble_at</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="comment">CodeGen::Link::entire_splat(IRS, NULL, I"! Manic\n", offset, block_name);</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain"> = </span><span class="identifier">block_name</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;pass2_offset</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">offset</span><span class="plain"> - 2;</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">body</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="identifier">endif</span>
<span class="functiontext">CodeGen::Link::entire_splat</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Splat %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">rb_splat_count</span><span class="plain">++);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::routine_bodies</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">routine_body_request</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">routine_body_request</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">Candidate (%S) len %d: '%S'\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</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::from_text</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</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">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 SCH\</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">&gt;node_tree</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
@ -750,20 +785,19 @@
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="functiontext">InterSchemas::log</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="identifier">sch</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">current_inter_routine</span><span class="plain"> = </span><span class="identifier">block_name</span><span class="plain">;</span>
<span class="identifier">Packaging::set_state</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">Packaging::enclosure</span><span class="plain">());</span>
<span class="identifier">Emit::push_code_position</span><span class="plain">(</span><span class="identifier">Emit::new_cip</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">));</span>
<span class="identifier">current_inter_routine</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain">;</span>
<span class="identifier">Packaging::set_state</span><span class="plain">(&amp;(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;position</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;enclosure</span><span class="plain">);</span>
<span class="identifier">Emit::push_code_position</span><span class="plain">(</span><span class="identifier">Emit::new_cip</span><span class="plain">(&amp;(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;position</span><span class="plain">)));</span>
<span class="identifier">value_holster</span><span class="plain"> </span><span class="identifier">VH</span><span class="plain"> = </span><span class="identifier">Holsters::new</span><span class="plain">(</span><span class="identifier">INTER_VOID_VHMODE</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope1</span><span class="plain"> = </span><span class="identifier">Inter::Package::local_symbols</span><span class="plain">(</span><span class="identifier">block_name</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope1</span><span class="plain"> = </span><span class="identifier">Inter::Package::local_symbols</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope2</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">Hierarchy::template</span><span class="plain">()));</span>
<span class="identifier">EmitInterSchemas::emit</span><span class="plain">(&amp;</span><span class="identifier">VH</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">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">scope1</span><span class="plain">, </span><span class="identifier">scope2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">Emit::pop_code_position</span><span class="plain">();</span>
<span class="identifier">current_inter_routine</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="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::pass2</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_bookmark</span><span class="plain">.</span><span class="identifier">read_into</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, &amp;(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_bookmark</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;pass2_offset</span><span class="plain">));</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::Link::entire_splat</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Splat %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">rb_splat_count</span><span class="plain">++);</span>
<span class="plain">}</span>
</pre>
@ -785,6 +819,10 @@
<p class="endnote">The function CodeGen::Assimilate::routine_body is used in <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::routine_bodies is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The structure routine_body_request is private to this section.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-rcc.html">Back to 'Resolving Conditional Compilation'</a></li><li><a href="2-res.html">Continue with 'Resolve External Symbols'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -22,6 +22,7 @@
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">continue_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">quit_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">restore_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">spaces_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">modulo_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">random_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">not_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -148,6 +149,7 @@
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!return"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">return_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!quit"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"void -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">quit_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!restore"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lab -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">restore_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!spaces"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">spaces_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!break"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"void -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">break_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!continue"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"void -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">continue_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!jump"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lab -&gt; void"</span><span class="plain">, &amp;</span><span class="identifier">jump_interp</span><span class="plain">);</span>
@ -335,6 +337,7 @@
<span class="definitionkeyword">enum</span> <span class="constant">JUMP_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">QUIT_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">RESTORE_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">SPACES_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">BREAK_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">CONTINUE_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">STYLEROMAN_BIP</span>
@ -444,6 +447,7 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!move"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">MOVE_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">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!quit"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">QUIT_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">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!restore"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">RESTORE_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">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!spaces"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">SPACES_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">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!break"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">BREAK_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">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!continue"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">CONTINUE_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">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!font"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">FONT_BIP</span><span class="plain">;</span>
@ -520,7 +524,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function Primitives::to_bip is used in 4/cg (<a href="4-cg.html#SP4">&#167;4</a>, <a href="4-cg.html#SP4_69">&#167;4.69</a>).</p>
<p class="endnote">The function Primitives::to_bip is used in 4/cg (<a href="4-cg.html#SP4">&#167;4</a>, <a href="4-cg.html#SP4_70">&#167;4.70</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 3: Inform 6 to Inter.)</i></li><li><a href="3-is.html">Continue with 'Inter Schemas'</a></li></ul><hr class="tocbar">

View file

@ -131,6 +131,8 @@ but the need to do this went away.)
<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>
@ -161,6 +163,7 @@ but the need to do this went away.)
<span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;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>
@ -329,6 +332,7 @@ compilation process, and never survive into the final schema:
<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">-&gt;</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">
@ -431,6 +435,7 @@ compilation process, and never survive into the final schema:
<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">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>
@ -569,6 +574,7 @@ we go to some trouble here.
<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">&gt;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"> &lt; </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">&gt;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>
@ -626,42 +632,7 @@ we go to some trouble here.
<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">&gt;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">&gt;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"> &lt; </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="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;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">default</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"&lt;unknown&gt;"</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">&gt;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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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="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">&gt;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>
@ -669,6 +640,47 @@ we go to some trouble here.
<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">&gt;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">"&lt;NULL-IST&gt;"</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">&gt;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">"&lt;unknown&gt;"</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">&gt;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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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">&gt;inline_modifiers</span><span class="plain"> &amp; </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>
@ -679,6 +691,8 @@ we go to some trouble here.
<p class="endnote">The function InterSchemas::log_just appears nowhere else.</p>
<p class="endnote">The function InterSchemas::log_ist is used in <a href="#SP27">&#167;27</a>.</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;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
@ -1425,15 +1439,18 @@ scanned through since the last time.
<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="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"> &lt; </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"> &lt; </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"> &lt; </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">c1</span><span class="plain"> == </span><span class="character">'$'</span><span class="plain">) </span>&lt;<span class="cwebmacro">Break off here for real, binary or hexadecimal notation</span> <span class="cwebmacronumber">20.2.2.1.1</span>&gt;<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>&lt;<span class="cwebmacro">Break off here for negative number</span> <span class="cwebmacronumber">20.2.2.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Break off here for operators</span> <span class="cwebmacronumber">20.2.2.1.3</span>&gt;<span class="plain">;</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>&lt;<span class="cwebmacro">Break off here for real, binary or hexadecimal notation</span> <span class="cwebmacronumber">20.2.2.1.1</span>&gt;<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>&lt;<span class="cwebmacro">Break off here for negative number</span> <span class="cwebmacronumber">20.2.2.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Break off here for operators</span> <span class="cwebmacronumber">20.2.2.1.3</span>&gt;<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"> &lt; </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>
@ -1569,6 +1586,7 @@ language opcodes such as <code class="display"><span class="extract">@pull</span
<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">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">) &amp;&amp; (</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">) &amp;&amp; (</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">) &amp;&amp; (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) &amp;&amp; (</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>
@ -1668,6 +1686,8 @@ inclusive; we ignore an empty token.
<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">) &amp;&amp; (</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">) &amp;&amp; (</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>
@ -1701,6 +1721,7 @@ inclusive; we ignore an empty token.
<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="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>
@ -1745,6 +1766,7 @@ inclusive; we ignore an empty token.
<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_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>
@ -2552,6 +2574,9 @@ these out at the start of each iteration.
<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="identifier">restore_interp</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="identifier">spaces_interp</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="identifier">print_interp</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>
@ -2633,6 +2658,11 @@ these out at the start of each iteration.
<span class="identifier">l</span><span class="plain">-</span><span class="element">&gt;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">&gt;material</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;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">&gt;material</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;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">&gt;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">&gt;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">&gt;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">&gt;next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
@ -2722,8 +2752,10 @@ these out at the start of each iteration.
<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">&lt;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">&gt;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">&gt;ist_type</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">n</span><span class="plain">-</span><span class="element">&gt;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"> &gt; 0) &amp;&amp; (</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">&gt;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>&lt;<span class="cwebmacro">End a wodge</span> <span class="cwebmacronumber">27.1</span>&gt;<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>
@ -2736,6 +2768,7 @@ these out at the start of each iteration.
<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">&lt;3; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="comment">LOG("For clause %d is :", i); InterSchemas::log_ist(from[i]); LOG(" to "); InterSchemas::log_ist(to[i]); LOG("\n");</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">&gt;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">&gt;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">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
@ -3211,6 +3244,27 @@ these out at the start of each iteration.
<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">&lt;</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"> &gt;= 0) &amp;&amp; (</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">&lt;</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>

File diff suppressed because it is too large Load diff

View file

@ -60,7 +60,7 @@ kinds being compiled to an I6 <code class="display"><span class="extract">Class<
<p class="inwebparagraph"></p>
<p class="endnote">The function Kinds::RunTime::I6_classname is used in <a href="#SP25">&#167;25</a>, 6/bp (<a href="6-bp.html#SP25">&#167;25</a>), 6/rlt (<a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>), 12/ter (<a href="12-ter.html#SP8_6">&#167;8.6</a>), 12/ca (<a href="12-ca.html#SP6_2">&#167;6.2</a>), 12/dtd (<a href="12-dtd.html#SP24">&#167;24</a>), 13/kak (<a href="13-kak.html#SP2">&#167;2</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP4">&#167;4</a>), 27/eis (<a href="27-eis.html#SP2_10_1">&#167;2.10.1</a>).</p>
<p class="endnote">The function Kinds::RunTime::I6_classname is used in <a href="#SP25">&#167;25</a>, 6/bp (<a href="6-bp.html#SP25">&#167;25</a>), 6/rlt (<a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>), 12/ter (<a href="12-ter.html#SP8_6">&#167;8.6</a>), 12/ca (<a href="12-ca.html#SP6_2">&#167;6.2</a>), 12/dtd (<a href="12-dtd.html#SP24">&#167;24</a>), 13/kak (<a href="13-kak.html#SP2">&#167;2</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP4">&#167;4</a>), 27/eis (<a href="27-eis.html#SP3_10_1">&#167;3.10.1</a>).</p>
<p class="endnote">The function Kinds::RunTime::I6_classnumber is used in <a href="#SP23">&#167;23</a>, 16/ic (<a href="16-ic.html#SP6">&#167;6</a>, <a href="16-ic.html#SP10">&#167;10</a>).</p>

View file

@ -51,7 +51,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function Holsters::new is used in 5/nv (<a href="5-nv.html#SP25">&#167;25</a>), 12/is (<a href="12-is.html#SP7">&#167;7</a>), 12/ca (<a href="12-ca.html#SP5">&#167;5</a>), 12/dtd (<a href="12-dtd.html#SP7">&#167;7</a>), 13/rsfk (<a href="13-rsfk.html#SP4">&#167;4</a>), 14/cfs (<a href="14-cfs.html#SP9">&#167;9</a>), 15/epv (<a href="15-epv.html#SP2">&#167;2</a>), 24/pb (<a href="24-pb.html#SP14">&#167;14</a>), 25/ci (<a href="25-ci.html#SP3_1_1">&#167;3.1.1</a>, <a href="25-ci.html#SP3_2_3_3_1_3">&#167;3.2.3.3.1.3</a>), 25/cp (<a href="25-cp.html#SP6">&#167;6</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/eis (<a href="27-eis.html#SP2_1">&#167;2.1</a>), 27/ei (<a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Holsters::new is used in 5/nv (<a href="5-nv.html#SP25">&#167;25</a>), 12/is (<a href="12-is.html#SP7">&#167;7</a>), 12/ca (<a href="12-ca.html#SP5">&#167;5</a>), 12/dtd (<a href="12-dtd.html#SP7">&#167;7</a>), 13/rsfk (<a href="13-rsfk.html#SP4">&#167;4</a>), 14/cfs (<a href="14-cfs.html#SP9">&#167;9</a>), 15/epv (<a href="15-epv.html#SP2">&#167;2</a>), 24/pb (<a href="24-pb.html#SP14">&#167;14</a>), 25/ci (<a href="25-ci.html#SP3_1_1">&#167;3.1.1</a>, <a href="25-ci.html#SP3_2_3_3_1_3">&#167;3.2.3.3.1.3</a>), 25/cp (<a href="25-cp.html#SP6">&#167;6</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/eis (<a href="27-eis.html#SP3_1">&#167;3.1</a>), 27/ei (<a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Conversions. </b></p>

View file

@ -670,7 +670,7 @@ given fresh names in between now and then.
<p class="endnote">The function LocalVariables::by_name is used in 14/lv (<a href="14-lv.html#SP14_5">&#167;14.5</a>), 25/cii (<a href="25-cii.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function LocalVariables::by_name_any is used in 27/eis (<a href="27-eis.html#SP2_11">&#167;2.11</a>).</p>
<p class="endnote">The function LocalVariables::by_name_any is used in 27/eis (<a href="27-eis.html#SP3_11">&#167;3.11</a>).</p>
<p class="endnote">The function LocalVariables::phrase_options is used in 14/cn (<a href="14-cn.html#SP16_3">&#167;16.3</a>).</p>
@ -1648,7 +1648,7 @@ need in the compilation of any given routine:
<p class="endnote">The function LocalVariables::declare is used in 26/rt (<a href="26-rt.html#SP3">&#167;3</a>, <a href="26-rt.html#SP4">&#167;4</a>, <a href="26-rt.html#SP4_1_1">&#167;4.1.1</a>).</p>
<p class="endnote">The function LocalVariables::declare_this is used in <a href="#SP8">&#167;8</a>, <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP27">&#167;27</a>, <a href="#SP28">&#167;28</a>, <a href="#SP29">&#167;29</a>, <a href="#SP41">&#167;41</a>, <a href="#SP43">&#167;43</a>, <a href="#SP45">&#167;45</a>, 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>), 11/tr (<a href="11-tr.html#SP10">&#167;10</a>), 12/dtd (<a href="12-dtd.html#SP9">&#167;9</a>, <a href="12-dtd.html#SP23">&#167;23</a>, <a href="12-dtd.html#SP25">&#167;25</a>, <a href="12-dtd.html#SP26">&#167;26</a>, <a href="12-dtd.html#SP27">&#167;27</a>), 12/cad (<a href="12-cad.html#SP7">&#167;7</a>), 13/rsfk (<a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>), 14/lv (<a href="14-lv.html#SP14_1">&#167;14.1</a>, <a href="14-lv.html#SP14_5">&#167;14.5</a>), 14/cn (<a href="14-cn.html#SP16_3">&#167;16.3</a>), 20/eq (<a href="20-eq.html#SP48">&#167;48</a>), 25/cii (<a href="25-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="25-cii.html#SP3_5_1">&#167;3.5.1</a>, <a href="25-cii.html#SP3_5_3">&#167;3.5.3</a>), 25/cp (<a href="25-cp.html#SP5_3_5">&#167;5.3.5</a>), 27/eis (<a href="27-eis.html#SP2_11">&#167;2.11</a>).</p>
<p class="endnote">The function LocalVariables::declare_this is used in <a href="#SP8">&#167;8</a>, <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP27">&#167;27</a>, <a href="#SP28">&#167;28</a>, <a href="#SP29">&#167;29</a>, <a href="#SP41">&#167;41</a>, <a href="#SP43">&#167;43</a>, <a href="#SP45">&#167;45</a>, 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>), 11/tr (<a href="11-tr.html#SP10">&#167;10</a>), 12/dtd (<a href="12-dtd.html#SP9">&#167;9</a>, <a href="12-dtd.html#SP23">&#167;23</a>, <a href="12-dtd.html#SP25">&#167;25</a>, <a href="12-dtd.html#SP26">&#167;26</a>, <a href="12-dtd.html#SP27">&#167;27</a>), 12/cad (<a href="12-cad.html#SP7">&#167;7</a>), 13/rsfk (<a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>), 14/lv (<a href="14-lv.html#SP14_1">&#167;14.1</a>, <a href="14-lv.html#SP14_5">&#167;14.5</a>), 14/cn (<a href="14-cn.html#SP16_3">&#167;16.3</a>), 20/eq (<a href="20-eq.html#SP48">&#167;48</a>), 25/cii (<a href="25-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="25-cii.html#SP3_5_1">&#167;3.5.1</a>, <a href="25-cii.html#SP3_5_3">&#167;3.5.3</a>), 25/cp (<a href="25-cp.html#SP5_3_5">&#167;5.3.5</a>), 27/eis (<a href="27-eis.html#SP3_11">&#167;3.11</a>).</p>
<p class="endnote">The function LocalVariables::create_and_declare is used in 13/rsfk (<a href="13-rsfk.html#SP24_4_1">&#167;24.4.1</a>, <a href="13-rsfk.html#SP24_4_2">&#167;24.4.2</a>).</p>

View file

@ -140,7 +140,7 @@ counter value.
<p class="endnote">The function JumpLabels::read_counter is used in 25/cii (<a href="25-cii.html#SP3_4_2">&#167;3.4.2</a>, <a href="25-cii.html#SP3_4_4">&#167;3.4.4</a>, <a href="25-cii.html#SP3_4_5">&#167;3.4.5</a>), 25/cp (<a href="25-cp.html#SP5_4_3">&#167;5.4.3</a>), 26/iti (<a href="26-iti.html#SP7_8_3">&#167;7.8.3</a>).</p>
<p class="endnote">The function JumpLabels::write is used in 25/cii (<a href="25-cii.html#SP3_4_1">&#167;3.4.1</a>), 25/cp (<a href="25-cp.html#SP5_4_3">&#167;5.4.3</a>), 27/eis (<a href="27-eis.html#SP2_1">&#167;2.1</a>).</p>
<p class="endnote">The function JumpLabels::write is used in 25/cii (<a href="25-cii.html#SP3_4_1">&#167;3.4.1</a>), 25/cp (<a href="25-cp.html#SP5_4_3">&#167;5.4.3</a>), 27/eis (<a href="27-eis.html#SP3_1">&#167;3.1</a>).</p>
<p class="endnote">The function JumpLabels::storage is used in 25/cii (<a href="25-cii.html#SP3_4_3">&#167;3.4.3</a>).</p>

File diff suppressed because one or more lines are too long

View file

@ -20,6 +20,13 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">mid_case</span><span class="plain">) { </span><span class="functiontext">Emit::to_last_level</span><span class="plain">(4); }</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">prim_cat</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">to_code</span><span class="plain">) </span><span class="identifier">prim_cat</span><span class="plain"> = </span><span class="identifier">CODE_PRIM_CAT</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">again</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">again</span><span class="plain">) {</span>
<span class="identifier">again</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">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">node_tree</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">-&gt;</span><span class="identifier">next_node</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">EmitInterSchemas::process_conditionals</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">second_call</span><span class="plain">))</span>
<span class="identifier">again</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">node_tree</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">-&gt;</span><span class="identifier">next_node</span><span class="plain">)</span>
<span class="functiontext">EmitInterSchemas::emit_inner</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">opaque_state</span><span class="plain">, </span><span class="identifier">prim_cat</span><span class="plain">, </span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">second_call</span><span class="plain">, </span><span class="identifier">inline_command_handler</span><span class="plain">, </span><span class="identifier">i7_source_handler</span><span class="plain">);</span>
<span class="plain">}</span>
@ -32,25 +39,142 @@
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">EmitInterSchemas::process_conditionals</span><span class="plain">(</span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">second_call</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">-&gt;</span><span class="identifier">blocked_by_conditional</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">-&gt;</span><span class="identifier">isn_type</span><span class="plain"> == </span><span class="identifier">DIRECTIVE_ISNT</span><span class="plain">) </span>&lt;<span class="cwebmacro">Directive</span> <span class="cwebmacronumber">2.1</span>&gt;<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">-&gt;</span><span class="identifier">child_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="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">EmitInterSchemas::process_conditionals</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">second_call</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function EmitInterSchemas::process_conditionals is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Directive</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFDEF_I6RW</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNDEF_I6RW</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFTRUE_I6RW</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFFALSE_I6RW</span><span class="plain">)) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Cond dir!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">ifnot_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">endif_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">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">-&gt;</span><span class="identifier">next_node</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="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</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">at</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFDEF_I6RW</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">ifnot_node</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">at</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNDEF_I6RW</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">ifnot_node</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">at</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFTRUE_I6RW</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">ifnot_node</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">at</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFFALSE_I6RW</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">ifnot_node</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">at</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNOT_I6RW</span><span class="plain">) </span><span class="identifier">ifnot_node</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">ENDIF_I6RW</span><span class="plain">) { </span><span class="identifier">endif_node</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="identifier">at</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">endif_node</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">"no matching #endif"</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">symbol_to_check</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">value_to_check</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">operation_to_check</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">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFDEF_I6RW</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNDEF_I6RW</span><span class="plain">)) {</span>
<span class="identifier">symbol_to_check</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">symbol_to_check</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">;</span>
<span class="identifier">operation_to_check</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain">;</span>
<span class="identifier">value_to_check</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Means checking %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">symbol_to_check</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">value_to_check</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Against %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">value_to_check</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain"> = -1, </span><span class="identifier">def</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">Str::eq</span><span class="plain">(</span><span class="identifier">symbol_to_check</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#version_number"</span><span class="plain">)) { </span><span class="identifier">val</span><span class="plain"> = 8; </span><span class="identifier">def</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="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">EmitInterSchemas::find_identifier_text</span><span class="plain">(</span><span class="identifier">symbol_to_check</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">second_call</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Symb is $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">)) {</span>
<span class="identifier">def</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">val</span><span class="plain"> = </span><span class="identifier">Inter::Symbols::evaluate_to_int</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Defined: %d, value: %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">def</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">decision</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">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNDEF_I6RW</span><span class="plain">)</span>
<span class="plain">|| (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFDEF_I6RW</span><span class="plain">)) </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">def</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">h</span><span class="plain"> = </span><span class="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">value_to_check</span><span class="plain">, 0);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Want value %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">operation_to_check</span><span class="plain"> == </span><span class="identifier">eq_interp</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = (</span><span class="identifier">val</span><span class="plain"> == </span><span class="identifier">h</span><span class="plain">)?</span><span class="identifier">TRUE</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">operation_to_check</span><span class="plain"> == </span><span class="identifier">ne_interp</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = (</span><span class="identifier">val</span><span class="plain"> != </span><span class="identifier">h</span><span class="plain">)?</span><span class="identifier">TRUE</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">operation_to_check</span><span class="plain"> == </span><span class="identifier">ge_interp</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = (</span><span class="identifier">val</span><span class="plain"> &gt;= </span><span class="identifier">h</span><span class="plain">)?</span><span class="identifier">TRUE</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">operation_to_check</span><span class="plain"> == </span><span class="identifier">gt_interp</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = (</span><span class="identifier">val</span><span class="plain"> &gt; </span><span class="identifier">h</span><span class="plain">)?</span><span class="identifier">TRUE</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">operation_to_check</span><span class="plain"> == </span><span class="identifier">le_interp</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = (</span><span class="identifier">val</span><span class="plain"> &lt;= </span><span class="identifier">h</span><span class="plain">)?</span><span class="identifier">TRUE</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">operation_to_check</span><span class="plain"> == </span><span class="identifier">lt_interp</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = (</span><span class="identifier">val</span><span class="plain"> &lt; </span><span class="identifier">h</span><span class="plain">)?</span><span class="identifier">TRUE</span><span class="plain">:</span><span class="identifier">FALSE</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">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNDEF_I6RW</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">decision</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="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFFALSE_I6RW</span><span class="plain">) </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">decision</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="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">endif_node</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</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">ifnot_node</span><span class="plain">) </span><span class="identifier">ifnot_node</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</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">decision</span><span class="plain">) {</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">ifnot_node</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">at</span><span class="plain">) &amp;&amp; (</span><span class="identifier">at</span><span class="plain"> != </span><span class="identifier">endif_node</span><span class="plain">)) {</span>
<span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">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="reserved">while</span><span class="plain"> ((</span><span class="identifier">at</span><span class="plain">) &amp;&amp; (</span><span class="identifier">at</span><span class="plain"> != </span><span class="identifier">endif_node</span><span class="plain">) &amp;&amp; (</span><span class="identifier">at</span><span class="plain"> != </span><span class="identifier">ifnot_node</span><span class="plain">)) {</span>
<span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">at</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"--- Resulting in: ---\</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="identifier">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="identifier">at</span><span class="plain">; </span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">)</span>
<span class="identifier">InterSchemas::log_just</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">, 0);</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">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">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">EmitInterSchemas::emit_inner</span><span class="plain">(</span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">, </span><span class="reserved">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">,</span>
<span class="identifier">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">opaque_state</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">prim_cat</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">second_call</span><span class="plain">,</span>
<span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">inline_command_handler</span><span class="plain">)(</span><span class="reserved">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">opaque_state</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">prim_cat</span><span class="plain">),</span>
<span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">i7_source_handler</span><span class="plain">)(</span><span class="reserved">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</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="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">blocked_by_conditional</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">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LABEL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Label</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CODE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Code block</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVAL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Eval block</span> <span class="cwebmacronumber">2.7</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Expression</span> <span class="cwebmacronumber">2.11</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUBEXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Subexpression</span> <span class="cwebmacronumber">2.9</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STATEMENT_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Statement</span> <span class="cwebmacronumber">2.10</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OPERATION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Operation</span> <span class="cwebmacronumber">2.8</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ASSEMBLY_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Assembly</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Call</span> <span class="cwebmacronumber">2.4</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Message</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLMESSAGE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Call-message</span> <span class="cwebmacronumber">2.6</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DIRECTIVE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Directive</span> <span class="cwebmacronumber">2.12</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LABEL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Label</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CODE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Code block</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVAL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Eval block</span> <span class="cwebmacronumber">3.7</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Expression</span> <span class="cwebmacronumber">3.11</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUBEXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Subexpression</span> <span class="cwebmacronumber">3.9</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STATEMENT_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Statement</span> <span class="cwebmacronumber">3.10</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OPERATION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Operation</span> <span class="cwebmacronumber">3.8</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ASSEMBLY_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Assembly</span> <span class="cwebmacronumber">3.3</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Call</span> <span class="cwebmacronumber">3.4</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Message</span> <span class="cwebmacronumber">3.5</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLMESSAGE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Call-message</span> <span class="cwebmacronumber">3.6</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DIRECTIVE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Non-conditional directive</span> <span class="cwebmacronumber">3.12</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown schema node type"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -58,10 +182,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function EmitInterSchemas::emit_inner is used in <a href="#SP1">&#167;1</a>, <a href="#SP2_2">&#167;2.2</a>, <a href="#SP2_3">&#167;2.3</a>, <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_5">&#167;2.5</a>, <a href="#SP2_6">&#167;2.6</a>, <a href="#SP2_7">&#167;2.7</a>, <a href="#SP2_8">&#167;2.8</a>, <a href="#SP2_9">&#167;2.9</a>, <a href="#SP2_10">&#167;2.10</a>, <a href="#SP2_10_1">&#167;2.10.1</a>.</p>
<p class="endnote">The function EmitInterSchemas::emit_inner is used in <a href="#SP1">&#167;1</a>, <a href="#SP3_2">&#167;3.2</a>, <a href="#SP3_3">&#167;3.3</a>, <a href="#SP3_4">&#167;3.4</a>, <a href="#SP3_5">&#167;3.5</a>, <a href="#SP3_6">&#167;3.6</a>, <a href="#SP3_7">&#167;3.7</a>, <a href="#SP3_8">&#167;3.8</a>, <a href="#SP3_9">&#167;3.9</a>, <a href="#SP3_10">&#167;3.10</a>, <a href="#SP3_10_1">&#167;3.10.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Label</span> <span class="cwebmacronumber">2.1</span>&gt; =
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Label</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
@ -89,10 +213,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Code block</span> <span class="cwebmacronumber">2.2</span>&gt; =
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Code block</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
@ -114,10 +238,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assembly</span> <span class="cwebmacronumber">2.3</span>&gt; =
<p class="inwebparagraph"><a id="SP3_3"></a><b>&#167;3.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assembly</span> <span class="cwebmacronumber">3.3</span>&gt; =
</code></p>
@ -144,10 +268,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_4"></a><b>&#167;2.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Call</span> <span class="cwebmacronumber">2.4</span>&gt; =
<p class="inwebparagraph"><a id="SP3_4"></a><b>&#167;3.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Call</span> <span class="cwebmacronumber">3.4</span>&gt; =
</code></p>
@ -191,10 +315,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_5"></a><b>&#167;2.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Message</span> <span class="cwebmacronumber">2.5</span>&gt; =
<p class="inwebparagraph"><a id="SP3_5"></a><b>&#167;3.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Message</span> <span class="cwebmacronumber">3.5</span>&gt; =
</code></p>
@ -221,10 +345,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_6"></a><b>&#167;2.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Call-message</span> <span class="cwebmacronumber">2.6</span>&gt; =
<p class="inwebparagraph"><a id="SP3_6"></a><b>&#167;3.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Call-message</span> <span class="cwebmacronumber">3.6</span>&gt; =
</code></p>
@ -251,10 +375,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_7"></a><b>&#167;2.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Eval block</span> <span class="cwebmacronumber">2.7</span>&gt; =
<p class="inwebparagraph"><a id="SP3_7"></a><b>&#167;3.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Eval block</span> <span class="cwebmacronumber">3.7</span>&gt; =
</code></p>
@ -280,10 +404,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_8"></a><b>&#167;2.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Operation</span> <span class="cwebmacronumber">2.8</span>&gt; =
<p class="inwebparagraph"><a id="SP3_8"></a><b>&#167;3.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Operation</span> <span class="cwebmacronumber">3.8</span>&gt; =
</code></p>
@ -309,10 +433,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_9"></a><b>&#167;2.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Subexpression</span> <span class="cwebmacronumber">2.9</span>&gt; =
<p class="inwebparagraph"><a id="SP3_9"></a><b>&#167;3.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Subexpression</span> <span class="cwebmacronumber">3.9</span>&gt; =
</code></p>
@ -333,10 +457,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_10"></a><b>&#167;2.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Statement</span> <span class="cwebmacronumber">2.10</span>&gt; =
<p class="inwebparagraph"><a id="SP3_10"></a><b>&#167;3.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Statement</span> <span class="cwebmacronumber">3.10</span>&gt; =
</code></p>
@ -348,7 +472,7 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">arity</span><span class="plain"> &gt; 0) {</span>
<span class="functiontext">Emit::down</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">objectloop_interp</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.10.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add the objectloop range tokens</span> <span class="cwebmacronumber">3.10.1</span>&gt;<span class="plain">;</span>
<span class="identifier">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">-&gt;</span><span class="identifier">child_node</span><span class="plain">;</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">last</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">actual_arity</span><span class="plain"> = 0;</span>
@ -368,10 +492,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_10_1"></a><b>&#167;2.10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.10.1</span>&gt; =
<p class="inwebparagraph"><a id="SP3_10_1"></a><b>&#167;3.10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the objectloop range tokens</span> <span class="cwebmacronumber">3.10.1</span>&gt; =
</code></p>
@ -404,10 +528,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_10">&#167;2.10</a>.</p>
<p class="endnote">This code is used in <a href="#SP3_10">&#167;3.10</a>.</p>
<p class="inwebparagraph"><a id="SP2_11"></a><b>&#167;2.11. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expression</span> <span class="cwebmacronumber">2.11</span>&gt; =
<p class="inwebparagraph"><a id="SP3_11"></a><b>&#167;3.11. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expression</span> <span class="cwebmacronumber">3.11</span>&gt; =
</code></p>
@ -446,8 +570,19 @@
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ASM_SP_ISTT</span><span class="plain">:</span>
<span class="functiontext">Emit::val_symbol</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">InterNames::to_symbol</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ASM_SP_HL</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="identifier">ASM_NEGATED_LABEL_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">-&gt;</span><span class="identifier">material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rtrue"</span><span class="plain">))</span>
<span class="functiontext">Emit::val_symbol</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">InterNames::to_symbol</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ASM_NEG_RTRUE_HL</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">t</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rfalse"</span><span class="plain">))</span>
<span class="functiontext">Emit::val_symbol</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">InterNames::to_symbol</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ASM_NEG_RFALSE_HL</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">"can only negate rtrue or rfalse"</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="identifier">ASM_LABEL_ISTT</span><span class="plain">:</span>
<span class="functiontext">Emit::lab</span><span class="plain">(</span><span class="functiontext">Emit::reserve_label</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">material</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">-&gt;</span><span class="identifier">material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rtrue"</span><span class="plain">))</span>
<span class="functiontext">Emit::val_symbol</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">InterNames::to_symbol</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ASM_RTRUE_HL</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">t</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rfalse"</span><span class="plain">))</span>
<span class="functiontext">Emit::val_symbol</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">InterNames::to_symbol</span><span class="plain">(</span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">ASM_RFALSE_HL</span><span class="plain">)));</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Emit::lab</span><span class="plain">(</span><span class="functiontext">Emit::reserve_label</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">material</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="identifier">NUMBER_ISTT</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">BIN_NUMBER_ISTT</span><span class="plain">:</span>
@ -497,57 +632,22 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP2_12"></a><b>&#167;2.12. </b><code class="display">
&lt;<span class="cwebmacrodefn">Directive</span> <span class="cwebmacronumber">2.12</span>&gt; =
<p class="inwebparagraph"><a id="SP3_12"></a><b>&#167;3.12. </b><code class="display">
&lt;<span class="cwebmacrodefn">Non-conditional directive</span> <span class="cwebmacronumber">3.12</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Gen on dir!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">InterSchemas::log_just</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, 0);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">ENDIF_I6RW</span><span class="plain">) {</span>
<span class="functiontext">Emit::entire_splat_code</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"#endif;"</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">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNOT_I6RW</span><span class="plain">) {</span>
<span class="functiontext">Emit::entire_splat_code</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"#ifnot;"</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">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFDEF_I6RW</span><span class="plain">) || (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain"> == </span><span class="identifier">IFNDEF_I6RW</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">switch</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IFDEF_I6RW</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">"#ifdef %S;"</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</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="identifier">IFNDEF_I6RW</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">"#ifndef %S;"</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Emit::entire_splat_code</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Resorted to %S\</span><span class="plain">n</span><span class="string">"</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="plain">} </span><span class="reserved">else</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">switch</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">dir_clarifier</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IFTRUE_I6RW</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">"#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="identifier">IFFALSE_I6RW</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">"#iffalse "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown directive"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</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">"%S"</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">eq_interp</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">" == "</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">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">ne_interp</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">" ~= "</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">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">gt_interp</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">" &gt; "</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">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">ge_interp</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">" &gt;= "</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">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">lt_interp</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">" &lt; "</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">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">le_interp</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">" &lt;= "</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">"unknown operator"</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">"%S;"</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">);</span>
<span class="functiontext">Emit::entire_splat_code</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Resorted to %S\</span><span class="plain">n</span><span class="string">"</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="plain">}</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown directive"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
@ -557,6 +657,15 @@
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">EmitInterSchemas::find_identifier_text</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">second_call</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">S</span><span class="plain">, 0) == 0</span><span class="identifier">x00A7</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">SR</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">SR</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">SR</span><span class="plain">);</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">SR</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::url_name_to_symbol</span><span class="plain">(</span><span class="functiontext">Emit::repository</span><span class="plain">(), </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SR</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">SR</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_call</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="functiontext">Emit::seek_symbol</span><span class="plain">(</span><span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">;</span>
@ -577,9 +686,9 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function EmitInterSchemas::find_identifier is used in <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_11">&#167;2.11</a>.</p>
<p class="endnote">The function EmitInterSchemas::find_identifier is used in <a href="#SP3_4">&#167;3.4</a>, <a href="#SP3_11">&#167;3.11</a>.</p>
<p class="endnote">The function EmitInterSchemas::find_identifier_text is used in 25/cii (<a href="25-cii.html#SP3_6_2">&#167;3.6.2</a>).</p>
<p class="endnote">The function EmitInterSchemas::find_identifier_text is used in <a href="#SP2_1">&#167;2.1</a>, 25/cii (<a href="25-cii.html#SP3_6_2">&#167;3.6.2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="27-in.html">Back to 'Inter Namespace'</a></li><li><a href="27-ei.html">Continue with 'Emitting Inter'</a></li></ul><hr class="tocbar">

File diff suppressed because one or more lines are too long

View file

@ -324,7 +324,7 @@ automatically here:
<p class="inwebparagraph"></p>
<p class="endnote">The function InterNames::to_symbol is used in 15/epv (<a href="15-epv.html#SP4">&#167;4</a>), 21/rl (<a href="21-rl.html#SP11_2">&#167;11.2</a>, <a href="21-rl.html#SP22">&#167;22</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/eis (<a href="27-eis.html#SP2_11">&#167;2.11</a>, <a href="27-eis.html#SP3">&#167;3</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP4">&#167;4</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function InterNames::to_symbol is used in 15/epv (<a href="15-epv.html#SP4">&#167;4</a>), 21/rl (<a href="21-rl.html#SP11_2">&#167;11.2</a>, <a href="21-rl.html#SP22">&#167;22</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/eis (<a href="27-eis.html#SP3_11">&#167;3.11</a>, <a href="27-eis.html#SP4">&#167;4</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP4">&#167;4</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="27-pt.html">Back to 'Package Types'</a></li><li><a href="27-eis.html">Continue with 'Emitting Inter Schemas'</a></li></ul><hr class="tocbar">

View file

@ -263,12 +263,21 @@ material will be placed between them.
<span class="functiontext">Emit::nop</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">b</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="functiontext">Packaging::bubble_at</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">) {</span>
<span class="functiontext">Emit::nop_at</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">b</span><span class="plain"> = </span><span class="functiontext">Emit::bookmark_at</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="functiontext">Emit::nop_at</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">b</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Packaging::bubble is used in <a href="#SP11">&#167;11</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>.</p>
<p class="endnote">The function Packaging::bubble_at appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Outside the packages. </b>The Inter specification calls for just a handful of resources to be placed
at the top level, outside even the <code class="display"><span class="extract">main</span></code> package. Using bubbles, we leave
room to insert those resources, then incarnate <code class="display"><span class="extract">main</span></code> and enter it.

View file

@ -258,7 +258,7 @@ to access this: one following equations, the other not.
<p class="endnote">The function Inter::SymbolsTables::unequated_symbol_from_id is used in 2/vi (<a href="2-vi.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_id is used in <a href="#SP7">&#167;7</a>, 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>, <a href="2-iibf.html#SP1_6">&#167;1.6</a>), 2/vi (<a href="2-vi.html#SP1">&#167;1</a>), 2/idt (<a href="2-idt.html#SP2">&#167;2</a>, <a href="2-idt.html#SP3">&#167;3</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_id is used in <a href="#SP7">&#167;7</a>, 2/sym (<a href="2-sym.html#SP4">&#167;4</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>, <a href="2-iibf.html#SP1_6">&#167;1.6</a>), 2/vi (<a href="2-vi.html#SP1">&#167;1</a>), 2/idt (<a href="2-idt.html#SP2">&#167;2</a>, <a href="2-idt.html#SP3">&#167;3</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>It's convenient to have some abbreviations for common ways to access the above.
</p>

View file

@ -181,6 +181,25 @@
<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">Inter::Symbols::evaluate_to_int</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::defining_frame</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Inter::Frame::valid</span><span class="plain">(&amp;</span><span class="identifier">P</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] == </span><span class="constant">CONSTANT_IST</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">FORMAT_CONST_IFLD</span><span class="plain">] == </span><span class="constant">CONSTANT_DIRECT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">DATA_CONST_IFLD</span><span class="plain">] == </span><span class="constant">LITERAL_IVAL</span><span class="plain">)) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">DATA_CONST_IFLD</span><span class="plain"> + 1];</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Inter::Frame::valid</span><span class="plain">(&amp;</span><span class="identifier">P</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] == </span><span class="constant">CONSTANT_IST</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">FORMAT_CONST_IFLD</span><span class="plain">] == </span><span class="constant">CONSTANT_DIRECT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">DATA_CONST_IFLD</span><span class="plain">] == </span><span class="constant">ALIAS_IVAL</span><span class="plain">)) {</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;owning_table</span><span class="plain">;</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">alias_to</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">scope</span><span class="plain">, </span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">DATA_CONST_IFLD</span><span class="plain"> + 1]);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::Symbols::evaluate_to_int</span><span class="plain">(</span><span class="identifier">alias_to</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="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Symbols::strike_definition</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::defining_frame</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
@ -323,6 +342,8 @@
<p class="endnote">The function Inter::Symbols::is_defined appears nowhere else.</p>
<p class="endnote">The function Inter::Symbols::evaluate_to_int appears nowhere else.</p>
<p class="endnote">The function Inter::Symbols::strike_definition appears nowhere else.</p>
<p class="endnote">The function Inter::Symbols::undefine is used in <a href="#SP2">&#167;2</a>, 2/iitf (<a href="2-iitf.html#SP1">&#167;1</a>).</p>

View file

@ -275,7 +275,10 @@
<span class="reserved">inter_frame</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">F</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_THROUGH_INTER_FRAME_LIST_FROM</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, (&amp;(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;sequence</span><span class="plain">)), </span><span class="identifier">just_this</span><span class="plain">-</span><span class="element">&gt;pos</span><span class="plain">) {</span>
<span class="identifier">F</span><span class="plain">++;</span>
<span class="comment">LOG("P2 F = %d baseline = %d gl = %d\n", F, baseline, Inter::Defn::get_level(P));</span>
<span class="comment">Inter::Defn::write_construct_text(DL, P);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">stop_at_top</span><span class="plain">) &amp;&amp; (</span><span class="identifier">F</span><span class="plain"> &gt; 1) &amp;&amp; (</span><span class="functiontext">Inter::Defn::get_level</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="identifier">baseline</span><span class="plain">)) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::gather_first</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="functiontext">Inter::Defn::pass2_on_frame</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">issue</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -298,6 +301,7 @@
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Inter::Defn::get_level</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) - </span><span class="identifier">baseline</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">stop_at_top</span><span class="plain">) &amp;&amp; (</span><span class="identifier">L</span><span class="plain"> &lt;= 0) &amp;&amp; (</span><span class="identifier">F</span><span class="plain"> &gt; 1)) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] == </span><span class="constant">COMMENT_IST</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] == </span><span class="constant">NOP_IST</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">frame_sp</span><span class="plain"> == </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Inter::Frame::valid</span><span class="plain">(&amp;</span><span class="identifier">PREV</span><span class="plain">))</span>
<span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::gather_first</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">, </span><span class="functiontext">Inter::Defn::no_more_children</span><span class="plain">(</span><span class="identifier">PREV</span><span class="plain">, </span><span class="identifier">issue</span><span class="plain">));</span>

View file

@ -26,10 +26,19 @@ inter_reading_state Emit::bookmark(void) {
return b;
}
inter_reading_state Emit::bookmark_at(inter_reading_state *IRS) {
inter_reading_state b = Inter::Bookmarks::snapshot(IRS);
return b;
}
void Emit::nop(void) {
Emit::guard(Inter::Nop::new(Packaging::at(), Emit::baseline(Packaging::at()), NULL));
}
void Emit::nop_at(inter_reading_state *IRS) {
Emit::guard(Inter::Nop::new(IRS, Emit::baseline(IRS) + 2, NULL));
}
dictionary *extern_symbols = NULL;
int glob_count = 0;
@ -74,12 +83,8 @@ void Emit::begin(void) {
VirtualMachines::emit_fundamental_constants();
NewVerbs::ConjugateVerbDefinitions();
// Emit::named_numeric_constant(Hierarchy::find(INDIRECT_HL), 0);
// Emit::named_numeric_constant(Hierarchy::find(ACTIONS_TABLE_HL), 0);
// Emit::named_numeric_constant(Hierarchy::find(ASM_ARROW_HL), 0);
// Emit::named_numeric_constant(Hierarchy::find(ASM_SP_HL), 0);
Hierarchy::find(INFORMLIBRARY_HL);
Hierarchy::find(INDIV_PROP_START_HL);
// Hierarchy::find(INDIV_PROP_START_HL);
}
void Emit::version(int N) {

View file

@ -10,16 +10,122 @@ void EmitInterSchemas::emit(value_holster *VH, inter_schema *sch, void *opaque_s
if (sch->mid_case) { Emit::to_last_level(4); }
int prim_cat = VAL_PRIM_CAT;
if (to_code) prim_cat = CODE_PRIM_CAT;
int again = TRUE;
while (again) {
again = FALSE;
for (inter_schema_node *isn = sch->node_tree; isn; isn=isn->next_node)
if (EmitInterSchemas::process_conditionals(isn, first_call, second_call))
again = TRUE;
}
for (inter_schema_node *isn = sch->node_tree; isn; isn=isn->next_node)
EmitInterSchemas::emit_inner(isn, VH, sch, opaque_state, prim_cat, first_call, second_call, inline_command_handler, i7_source_handler);
}
@ =
int EmitInterSchemas::process_conditionals(inter_schema_node *isn, inter_symbols_table *first_call, inter_symbols_table *second_call) {
if (isn == NULL) return FALSE;
if (isn->blocked_by_conditional) return FALSE;
if (isn->isn_type == DIRECTIVE_ISNT) @<Directive@>;
for (isn=isn->child_node; isn; isn=isn->next_node)
if (EmitInterSchemas::process_conditionals(isn, first_call, second_call))
return TRUE;
return FALSE;
}
@<Directive@> =
if ((isn->dir_clarifier == IFDEF_I6RW) ||
(isn->dir_clarifier == IFNDEF_I6RW) ||
(isn->dir_clarifier == IFTRUE_I6RW) ||
(isn->dir_clarifier == IFFALSE_I6RW)) {
LOG("Cond dir!\n");
inter_schema_node *ifnot_node = NULL, *endif_node = NULL;
inter_schema_node *at = isn->next_node;
while (at) {
if (at->blocked_by_conditional == FALSE) {
if (at->dir_clarifier == IFDEF_I6RW) { isn = at; ifnot_node = NULL; }
if (at->dir_clarifier == IFNDEF_I6RW) { isn = at; ifnot_node = NULL; }
if (at->dir_clarifier == IFTRUE_I6RW) { isn = at; ifnot_node = NULL; }
if (at->dir_clarifier == IFFALSE_I6RW) { isn = at; ifnot_node = NULL; }
if (at->dir_clarifier == IFNOT_I6RW) ifnot_node = at;
if (at->dir_clarifier == ENDIF_I6RW) { endif_node = at; break; }
}
at = at->next_node;
}
if (endif_node == NULL) internal_error("no matching #endif");
text_stream *symbol_to_check = NULL;
text_stream *value_to_check = NULL;
inter_symbol *operation_to_check = NULL;
if ((isn->dir_clarifier == IFDEF_I6RW) ||
(isn->dir_clarifier == IFNDEF_I6RW)) {
symbol_to_check = isn->child_node->expression_tokens->material;
} else {
symbol_to_check = isn->child_node->child_node->expression_tokens->material;
operation_to_check = isn->child_node->isn_clarifier;
value_to_check = isn->child_node->child_node->next_node->expression_tokens->material;
}
LOG("Means checking %S\n", symbol_to_check);
if (value_to_check) LOG("Against %S\n", value_to_check);
int val = -1, def = FALSE;
if (Str::eq(symbol_to_check, I"#version_number")) { val = 8; def = TRUE; }
else {
inter_symbol *symb = EmitInterSchemas::find_identifier_text(symbol_to_check, NULL, second_call);
while ((symb) && (symb->equated_to)) symb = symb->equated_to;
LOG("Symb is $3\n", symb);
if (Inter::Symbols::is_defined(symb)) {
def = TRUE;
val = Inter::Symbols::evaluate_to_int(symb);
}
}
LOG("Defined: %d, value: %d\n", def, val);
int decision = TRUE;
if ((isn->dir_clarifier == IFNDEF_I6RW)
|| (isn->dir_clarifier == IFDEF_I6RW)) decision = def;
else {
int h = Str::atoi(value_to_check, 0);
LOG("Want value %d\n", h);
if (operation_to_check == eq_interp) decision = (val == h)?TRUE:FALSE;
if (operation_to_check == ne_interp) decision = (val != h)?TRUE:FALSE;
if (operation_to_check == ge_interp) decision = (val >= h)?TRUE:FALSE;
if (operation_to_check == gt_interp) decision = (val > h)?TRUE:FALSE;
if (operation_to_check == le_interp) decision = (val <= h)?TRUE:FALSE;
if (operation_to_check == lt_interp) decision = (val < h)?TRUE:FALSE;
}
if (isn->dir_clarifier == IFNDEF_I6RW) decision = decision?FALSE:TRUE;
if (isn->dir_clarifier == IFFALSE_I6RW) decision = decision?FALSE:TRUE;
isn->blocked_by_conditional = TRUE;
endif_node->blocked_by_conditional = TRUE;
if (ifnot_node) ifnot_node->blocked_by_conditional = TRUE;
if (decision) {
inter_schema_node *at = ifnot_node;
while ((at) && (at != endif_node)) {
at->blocked_by_conditional = TRUE;
at = at->next_node;
}
} else {
inter_schema_node *at = isn;
while ((at) && (at != endif_node) && (at != ifnot_node)) {
at->blocked_by_conditional = TRUE;
at = at->next_node;
}
}
LOG("--- Resulting in: ---\n");
for (inter_schema_node *at = isn; at; at = at->next_node)
InterSchemas::log_just(at, 0);
LOG("------\n");
return TRUE;
}
@ =
void EmitInterSchemas::emit_inner(inter_schema_node *isn, value_holster *VH,
inter_schema *sch, void *opaque_state, int prim_cat, inter_symbols_table *first_call, inter_symbols_table *second_call,
void (*inline_command_handler)(value_holster *VH, inter_schema_token *t, void *opaque_state, int prim_cat),
void (*i7_source_handler)(value_holster *VH, text_stream *OUT, text_stream *S)) {
if (isn == NULL) return;
if (isn->blocked_by_conditional) return;
switch (isn->isn_type) {
case LABEL_ISNT: @<Label@>; break;
case CODE_ISNT: @<Code block@>; break;
@ -32,7 +138,7 @@ void EmitInterSchemas::emit_inner(inter_schema_node *isn, value_holster *VH,
case CALL_ISNT: @<Call@>; break;
case MESSAGE_ISNT: @<Message@>; break;
case CALLMESSAGE_ISNT: @<Call-message@>; break;
case DIRECTIVE_ISNT: @<Directive@>; break;
case DIRECTIVE_ISNT: @<Non-conditional directive@>; break;
default: internal_error("unknown schema node type");
}
}
@ -308,8 +414,19 @@ void EmitInterSchemas::emit_inner(inter_schema_node *isn, value_holster *VH,
case ASM_SP_ISTT:
Emit::val_symbol(K_value, InterNames::to_symbol(Hierarchy::find(ASM_SP_HL)));
break;
case ASM_NEGATED_LABEL_ISTT:
if (Str::eq(t->material, I"rtrue"))
Emit::val_symbol(K_value, InterNames::to_symbol(Hierarchy::find(ASM_NEG_RTRUE_HL)));
else if (Str::eq(t->material, I"rfalse"))
Emit::val_symbol(K_value, InterNames::to_symbol(Hierarchy::find(ASM_NEG_RFALSE_HL)));
else internal_error("can only negate rtrue or rfalse");
break;
case ASM_LABEL_ISTT:
Emit::lab(Emit::reserve_label(t->material));
if (Str::eq(t->material, I"rtrue"))
Emit::val_symbol(K_value, InterNames::to_symbol(Hierarchy::find(ASM_RTRUE_HL)));
else if (Str::eq(t->material, I"rfalse"))
Emit::val_symbol(K_value, InterNames::to_symbol(Hierarchy::find(ASM_RFALSE_HL)));
else Emit::lab(Emit::reserve_label(t->material));
break;
case NUMBER_ISTT:
case BIN_NUMBER_ISTT:
@ -356,43 +473,8 @@ void EmitInterSchemas::emit_inner(inter_schema_node *isn, value_holster *VH,
if (cat_me) { Emit::up(); }
if (prim_cat == REF_PRIM_CAT) { Emit::up(); }
@<Directive@> =
LOG("Gen on dir!\n");
InterSchemas::log_just(isn, 0);
if (isn->dir_clarifier == ENDIF_I6RW) {
Emit::entire_splat_code(I"#endif;");
} else if (isn->dir_clarifier == IFNOT_I6RW) {
Emit::entire_splat_code(I"#ifnot;");
} else if ((isn->dir_clarifier == IFDEF_I6RW) || (isn->dir_clarifier == IFNDEF_I6RW)) {
TEMPORARY_TEXT(T);
switch(isn->dir_clarifier) {
case IFDEF_I6RW: WRITE_TO(T, "#ifdef %S;", isn->child_node->expression_tokens->material); break;
case IFNDEF_I6RW: WRITE_TO(T, "#ifndef %S;", isn->child_node->expression_tokens->material); break;
}
Emit::entire_splat_code(T);
LOG("Resorted to %S\n", T);
DISCARD_TEXT(T);
} else {
TEMPORARY_TEXT(T);
switch(isn->dir_clarifier) {
case IFTRUE_I6RW: WRITE_TO(T, "#iftrue "); break;
case IFFALSE_I6RW: WRITE_TO(T, "#iffalse "); break;
default: internal_error("unknown directive"); break;
}
WRITE_TO(T, "%S", isn->child_node->child_node->expression_tokens->material);
if (isn->child_node->isn_clarifier == eq_interp) WRITE_TO(T, " == ");
else if (isn->child_node->isn_clarifier == ne_interp) WRITE_TO(T, " ~= ");
else if (isn->child_node->isn_clarifier == gt_interp) WRITE_TO(T, " > ");
else if (isn->child_node->isn_clarifier == ge_interp) WRITE_TO(T, " >= ");
else if (isn->child_node->isn_clarifier == lt_interp) WRITE_TO(T, " < ");
else if (isn->child_node->isn_clarifier == le_interp) WRITE_TO(T, " <= ");
else internal_error("unknown operator");
WRITE_TO(T, "%S;", isn->child_node->child_node->next_node->expression_tokens->material);
Emit::entire_splat_code(T);
LOG("Resorted to %S\n", T);
DISCARD_TEXT(T);
}
@<Non-conditional directive@> =
internal_error("unknown directive");
@ =
inter_symbol *EmitInterSchemas::find_identifier(inter_schema_token *t, inter_symbols_table *first_call, inter_symbols_table *second_call) {
@ -401,6 +483,15 @@ inter_symbol *EmitInterSchemas::find_identifier(inter_schema_token *t, inter_sym
}
inter_symbol *EmitInterSchemas::find_identifier_text(text_stream *S, inter_symbols_table *first_call, inter_symbols_table *second_call) {
if (Str::get_at(S, 0) == 0x00A7) {
TEMPORARY_TEXT(SR);
Str::copy(SR, S);
Str::delete_first_character(SR);
Str::delete_last_character(SR);
inter_symbol *I = Inter::SymbolsTables::url_name_to_symbol(Emit::repository(), NULL, SR);
DISCARD_TEXT(SR);
if (I) return I;
}
if (first_call) {
inter_symbol *I = Emit::seek_symbol(first_call, S);
if (I) return I;

View file

@ -51,7 +51,12 @@ void Hierarchy::establish(void) {
@e ASM_ARROW_HL
@e ASM_SP_HL
@e ASM_LABEL_HL
@e ASM_RTRUE_HL
@e ASM_RFALSE_HL
@e ASM_NEG_RTRUE_HL
@e ASM_NEG_RFALSE_HL
@e ACTIONS_TABLE_HL
@e IDENTIFIERS_TABLE_HL
@e GRAMMAR_TABLE_HL
@e VERSION_NUMBER_HL
@e PROPERTY_METADATA_HL
@ -104,7 +109,12 @@ void Hierarchy::establish(void) {
HierarchyLocations::con(ASM_ARROW_HL, I"__assembly_arrow", Translation::to(I"->"), generic_basics);
HierarchyLocations::con(ASM_SP_HL, I"__assembly_sp", Translation::to(I"sp"), generic_basics);
HierarchyLocations::con(ASM_LABEL_HL, I"__assembly_label", Translation::to(I"?"), generic_basics);
HierarchyLocations::con(ASM_RTRUE_HL, I"__assembly_rtrue_label", Translation::to(I"?rtrue"), generic_basics);
HierarchyLocations::con(ASM_RFALSE_HL, I"__assembly_rfalse_label", Translation::to(I"?rfalse"), generic_basics);
HierarchyLocations::con(ASM_NEG_RTRUE_HL, I"__assembly_negated_rtrue_label", Translation::to(I"?~rtrue"), generic_basics);
HierarchyLocations::con(ASM_NEG_RFALSE_HL, I"__assembly_negated_rfalse_label", Translation::to(I"?~rfalse"), generic_basics);
HierarchyLocations::con(ACTIONS_TABLE_HL, I"#actions_table", Translation::same(), generic_basics);
HierarchyLocations::con(IDENTIFIERS_TABLE_HL, I"#identifiers_table", Translation::same(), generic_basics);
HierarchyLocations::con(GRAMMAR_TABLE_HL, I"#grammar_table", Translation::same(), generic_basics);
HierarchyLocations::con(VERSION_NUMBER_HL, I"#version_number", Translation::same(), generic_basics);
HierarchyLocations::con(PROPERTY_METADATA_HL, I"property_metadata", Translation::same(), generic_basics);
@ -114,7 +124,6 @@ void Hierarchy::establish(void) {
HierarchyLocations::con(DEBUG_HL, I"DEBUG", Translation::same(), generic_basics);
HierarchyLocations::con(TARGET_ZCODE_HL, I"TARGET_ZCODE", Translation::same(), generic_basics);
HierarchyLocations::con(TARGET_GLULX_HL, I"TARGET_GLULX", Translation::same(), generic_basics);
HierarchyLocations::con(INDIV_PROP_START_HL, I"INDIV_PROP_START", Translation::same(), generic_basics);
HierarchyLocations::con(DICT_WORD_SIZE_HL, I"DICT_WORD_SIZE", Translation::same(), generic_basics);
HierarchyLocations::con(WORDSIZE_HL, I"WORDSIZE", Translation::same(), generic_basics);
HierarchyLocations::con(NULL_HL, I"NULL", Translation::same(), generic_basics);
@ -133,6 +142,7 @@ void Hierarchy::establish(void) {
HierarchyLocations::con(NO_VERB_VERB_DEFINED_HL, I"NO_VERB_VERB_DEFINED", Translation::same(), generic_basics);
HierarchyLocations::con(NO_TEST_SCENARIOS_HL, I"NO_TEST_SCENARIOS", Translation::same(), generic_basics);
HierarchyLocations::con(MEMORY_HEAP_SIZE_HL, I"MEMORY_HEAP_SIZE", Translation::same(), generic_basics);
HierarchyLocations::con(INDIV_PROP_START_HL, I"INDIV_PROP_START", Translation::same(), generic_basics);
location_requirement synoptic_basics = HierarchyLocations::synoptic_submodule(basics);
HierarchyLocations::con(CCOUNT_QUOTATIONS_HL, I"CCOUNT_QUOTATIONS", Translation::same(), synoptic_basics);
@ -1612,10 +1622,15 @@ inter_name *Hierarchy::post_process(int HL_id, inter_name *iname) {
case CLASS_HL:
case DICT_PAR2_HL:
case ACTIONS_TABLE_HL:
case IDENTIFIERS_TABLE_HL:
case GRAMMAR_TABLE_HL:
case ASM_ARROW_HL:
case ASM_SP_HL:
case ASM_LABEL_HL:
case ASM_RTRUE_HL:
case ASM_RFALSE_HL:
case ASM_NEG_RTRUE_HL:
case ASM_NEG_RFALSE_HL:
Emit::named_numeric_constant(iname, 0);
break;
case SELF_HL:

View file

@ -178,6 +178,13 @@ inter_reading_state Packaging::bubble(void) {
return b;
}
inter_reading_state Packaging::bubble_at(inter_reading_state *IRS) {
Emit::nop_at(IRS);
inter_reading_state b = Emit::bookmark_at(IRS);
Emit::nop_at(IRS);
return b;
}
@h Outside the packages.
The Inter specification calls for just a handful of resources to be placed
at the top level, outside even the |main| package. Using bubbles, we leave

View file

@ -1,68 +1,153 @@
Test: parse schema from:
alpha.beta()
* (message)
* (expr)
* (message)
* (expr)
IDENTIFIER alpha
* (expr)
* (expr)
IDENTIFIER beta
=========
Test: parse schema from:
alpha.beta(x)
* (message)
* (expr)
* (message)
* (expr)
IDENTIFIER alpha
* (expr)
* (expr)
IDENTIFIER beta
* (expr)
* (expr)
IDENTIFIER x
=========
Test: parse schema from:
routine.call(x)
* (call-message)
* (expr)
* (call-message)
* (expr)
IDENTIFIER routine
* (expr)
* (expr)
IDENTIFIER x
=========
Test: parse schema from:
(alpha.beta)(x)
* (call)
* (subexpression)
* (operation) !propertyvalue
* (expr)
* (call)
* (subexpression)
* (operation) !propertyvalue
* (expr)
IDENTIFIER alpha
* (expr)
* (expr)
IDENTIFIER beta
* (expr)
* (expr)
IDENTIFIER x
=========
Test: parse schema from:
debug_rules = 2; say__p = 1;
"Rules tracing now switched to ~all~. Type ~rules off~ to switch it off again.";
* (operation) !store
* (expr)
* (operation) !store
* (expr)
IDENTIFIER debug_rules
* (expr)
* (expr)
NUMBER 2
* (operation) !store
* (expr)
* (operation) !store
* (expr)
IDENTIFIER say__p
* (expr)
* (expr)
NUMBER 1
* (expr) ;
* (expr) ;
DQUOTED Rules tracing now switched to "all". Type "rules off" to switch it off again.
=========
Test: parse schema from:
@erase_window -1;
* (assembly)
* (expr)
* (assembly)
* (expr)
OPCODE @erase_window
* (expr)
* (expr)
NUMBER -1
=========
Test: parse schema from:
restore Somewhere;
.Somewhere; print "Here!";
* (statement) !restore
* (expr)
IDENTIFIER Somewhere
* (label)
* (expr)
IDENTIFIER Somewhere
* (statement) !print
* (expr)
DQUOTED Here!
=========
Test: parse schema from:
@jl y 0 ?~rtrue;
* (assembly)
* (expr)
OPCODE @jl
* (expr)
IDENTIFIER y
* (expr)
NUMBER 0
* (expr)
NEGASM_LABEL rtrue
=========
Test: parse schema from:
"Hello, this
is a multiline string literal";
* (expr) ;
DQUOTED Hello, this is a multiline string literal
=========
Test: parse schema from:
for (n=0:((n<RE_Subexpressions-->10) && (n<10)): n++)
print n;
* (statement) !for
* (eval)
* (operation) !store
* (expr)
IDENTIFIER n
* (expr)
NUMBER 0
* (eval)
* (subexpression)
* (operation) !and
* (subexpression)
* (operation) !lt
* (expr)
IDENTIFIER n
* (operation) !lookup
* (expr)
IDENTIFIER RE_Subexpressions
* (expr)
NUMBER 10
* (subexpression)
* (operation) !lt
* (expr)
IDENTIFIER n
* (expr)
NUMBER 10
* (eval)
* (operation) !postincrement
* (expr)
IDENTIFIER n
* (code)
* (statement) !printnumber
* (expr)
IDENTIFIER n
=========
Test: parse schema from:
spaces j;
print (I7_string) str;
* (statement) !spaces
* (expr)
IDENTIFIER j
* (call)
* (expr)
IDENTIFIER I7_String
* (expr)
IDENTIFIER str
=========

View file

@ -21,3 +21,18 @@ schema
restore Somewhere;
.Somewhere; print "Here!";
end
schema
@jl y 0 ?~rtrue;
end
schema
"Hello, this
is a multiline string literal";
end
schema
for (n=0:((n<RE_Subexpressions-->10) && (n<10)): n++)
print n;
end
schema
spaces j;
print (I7_string) str;
end

View file

@ -17,6 +17,7 @@ We need to itemise the structures we'll want to allocate:
@e inter_schema_MT
@e inter_schema_node_MT
@e inter_schema_token_MT
@e routine_body_request_MT
@ With allocation functions:
@ -29,6 +30,7 @@ ALLOCATE_INDIVIDUALLY(text_literal_holder)
ALLOCATE_INDIVIDUALLY(inter_schema)
ALLOCATE_INDIVIDUALLY(inter_schema_node)
ALLOCATE_INDIVIDUALLY(inter_schema_token)
ALLOCATE_INDIVIDUALLY(routine_body_request)
@h The beginning.
(The client doesn't need to call the start and end routines, because the

View file

@ -55,6 +55,7 @@ void CodeGen::Assimilate::assimilate(inter_reading_state *IRS) {
}
}
}
CodeGen::Assimilate::routine_bodies();
LOOP_THROUGH_FRAMES(P, I) {
inter_package *outer = Inter::Packages::container(P);
if (((outer == NULL) || (outer->codelike_package == FALSE)) &&
@ -109,7 +110,7 @@ void CodeGen::Assimilate::assimilate(inter_reading_state *IRS) {
if ((identifier) && (unchecked_kind_symbol)) {
Str::trim_all_white_space_at_end(identifier);
inter_t switch_on = P.data[PLM_SPLAT_IFLD];
LOG("ASSIM: %S\n", identifier);
if (switch_on == DEFAULT_PLM) {
inter_symbol *symbol = CodeGen::Link::find_name(I, identifier, TRUE);
if (symbol == NULL) switch_on = CONSTANT_PLM;
@ -364,18 +365,18 @@ void CodeGen::Assimilate::assimilate(inter_reading_state *IRS) {
Inter::Symbols::label(end_name);
CodeGen::Link::guard(Inter::Label::new(&ib, block_name, begin_name, baseline+1, NULL));
int veto = FALSE;
if (Str::len(body) > 0) {
int L = Str::len(body) - 1;
while ((L>0) && (Str::get_at(body, L) != ']')) L--;
while ((L>0) && (Characters::is_whitespace(Str::get_at(body, L-1)))) L--;
Str::truncate(body, L);
CodeGen::Assimilate::routine_body(&ib, block_name, baseline+2, body);
veto = CodeGen::Assimilate::routine_body(&ib, block_name, baseline+2, body, block_bookmark);
}
CodeGen::Link::guard(Inter::Label::new(&ib, block_name, end_name, baseline+1, NULL));
CodeGen::Link::guard(Inter::Defn::pass2(I, FALSE, &block_bookmark, TRUE, (int) baseline));
if (!veto) CodeGen::Link::guard(Inter::Defn::pass2(I, FALSE, &block_bookmark, TRUE, (int) baseline));
Inter::Defn::unset_current_package(&ib, IP, 0);
@ -666,12 +667,46 @@ inter_symbol *CodeGen::Assimilate::computed_constant_symbol(inter_package *pack)
return mcc_name;
}
typedef struct routine_body_request {
struct inter_reading_state position;
struct inter_reading_state block_bookmark;
#ifdef CORE_MODULE
struct package_request *enclosure;
#endif
struct inter_symbol *block_name;
int pass2_offset;
struct text_stream *body;
MEMORY_MANAGEMENT
} routine_body_request;
int rb_splat_count = 1;
void CodeGen::Assimilate::routine_body(inter_reading_state *IRS, inter_symbol *block_name, inter_t offset, text_stream *body) {
if (Str::is_whitespace(body)) return;
if (Str::len(body) < 150) {
LOG("=======\n\nCandidate (%S) len %d: '%S'\n\n", block_name->symbol_name, Str::len(body), body);
inter_schema *sch = InterSchemas::from_text(body, FALSE, 0, NULL);
int CodeGen::Assimilate::routine_body(inter_reading_state *IRS, inter_symbol *block_name, inter_t offset, text_stream *body, inter_reading_state bb) {
if (Str::is_whitespace(body)) return FALSE;
#ifdef CORE_MODULE
if (Str::len(body) < 200) {
routine_body_request *req = CREATE(routine_body_request);
req->block_bookmark = bb;
req->enclosure = Packaging::enclosure();
// CodeGen::Link::entire_splat(IRS, NULL, I"! Magic\n", offset, block_name);
// CodeGen::Link::entire_splat(IRS, NULL, I"! Yay\n", offset, block_name);
req->position = Packaging::bubble_at(IRS);
// CodeGen::Link::entire_splat(IRS, NULL, I"! Manic\n", offset, block_name);
req->block_name = block_name;
req->pass2_offset = (int) offset - 2;
req->body = Str::duplicate(body);
return TRUE;
}
#endif
CodeGen::Link::entire_splat(IRS, NULL, body, offset, block_name);
LOG("Splat %d\n", rb_splat_count++);
return FALSE;
}
void CodeGen::Assimilate::routine_bodies(void) {
routine_body_request *req;
LOOP_OVER(req, routine_body_request) {
LOG("=======\n\nCandidate (%S) len %d: '%S'\n\n", req->block_name->symbol_name, Str::len(req->body), req->body);
inter_schema *sch = InterSchemas::from_text(req->body, FALSE, 0, NULL);
if (sch == NULL) LOG("NULL SCH\n");
else if (sch->node_tree == NULL) {
@ -680,18 +715,17 @@ void CodeGen::Assimilate::routine_body(inter_reading_state *IRS, inter_symbol *b
} else InterSchemas::log(DL, sch);
#ifdef CORE_MODULE
current_inter_routine = block_name;
Packaging::set_state(IRS, Packaging::enclosure());
Emit::push_code_position(Emit::new_cip(IRS));
current_inter_routine = req->block_name;
Packaging::set_state(&(req->position), req->enclosure);
Emit::push_code_position(Emit::new_cip(&(req->position)));
value_holster VH = Holsters::new(INTER_VOID_VHMODE);
inter_symbols_table *scope1 = Inter::Package::local_symbols(block_name);
inter_symbols_table *scope1 = Inter::Package::local_symbols(req->block_name);
inter_symbols_table *scope2 = Inter::Packages::scope(Packaging::incarnate(Hierarchy::template()));
EmitInterSchemas::emit(&VH, sch, NULL, TRUE, FALSE, scope1, scope2, NULL, NULL);
Emit::pop_code_position();
current_inter_routine = NULL;
return;
CodeGen::Link::guard(Inter::Defn::pass2(req->block_bookmark.read_into, FALSE, &(req->block_bookmark), TRUE, req->pass2_offset));
#endif
}
CodeGen::Link::entire_splat(IRS, NULL, body, offset, block_name);
LOG("Splat %d\n", rb_splat_count++);
}

View file

@ -12,6 +12,7 @@ inter_symbol *break_interp = NULL;
inter_symbol *continue_interp = NULL;
inter_symbol *quit_interp = NULL;
inter_symbol *restore_interp = NULL;
inter_symbol *spaces_interp = NULL;
inter_symbol *modulo_interp = NULL;
inter_symbol *random_interp = NULL;
inter_symbol *not_interp = NULL;
@ -132,6 +133,7 @@ void Primitives::emit(inter_repository *I, inter_reading_state *IRS) {
Primitives::emit_one(I, IRS, I"!return", I"val -> void", &return_interp);
Primitives::emit_one(I, IRS, I"!quit", I"void -> void", &quit_interp);
Primitives::emit_one(I, IRS, I"!restore", I"lab -> void", &restore_interp);
Primitives::emit_one(I, IRS, I"!spaces", I"val -> void", &spaces_interp);
Primitives::emit_one(I, IRS, I"!break", I"void -> void", &break_interp);
Primitives::emit_one(I, IRS, I"!continue", I"void -> void", &continue_interp);
Primitives::emit_one(I, IRS, I"!jump", I"lab -> void", &jump_interp);
@ -302,6 +304,7 @@ inter_symbol *Primitives::indirectv_interp(int arity) {
@e JUMP_BIP
@e QUIT_BIP
@e RESTORE_BIP
@e SPACES_BIP
@e BREAK_BIP
@e CONTINUE_BIP
@e STYLEROMAN_BIP
@ -410,6 +413,7 @@ inter_t Primitives::to_bip(inter_repository *I, inter_symbol *symb) {
if (Str::eq(symb->symbol_name, I"!move")) bip = MOVE_BIP;
if (Str::eq(symb->symbol_name, I"!quit")) bip = QUIT_BIP;
if (Str::eq(symb->symbol_name, I"!restore")) bip = RESTORE_BIP;
if (Str::eq(symb->symbol_name, I"!spaces")) bip = SPACES_BIP;
if (Str::eq(symb->symbol_name, I"!break")) bip = BREAK_BIP;
if (Str::eq(symb->symbol_name, I"!continue")) bip = CONTINUE_BIP;
if (Str::eq(symb->symbol_name, I"!font")) bip = FONT_BIP;

View file

@ -86,6 +86,8 @@ typedef struct inter_schema_node {
int unclosed; /* for |CODE_ISNT| only */
int unopened; /* for |CODE_ISNT| only */
int blocked_by_conditional; /* used in code generation */
MEMORY_MANAGEMENT
} inter_schema_node;
@ -108,6 +110,7 @@ inter_schema_node *InterSchemas::new_node(inter_schema *sch, int isnt) {
isn->semicolon_terminated = FALSE;
isn->unclosed = FALSE;
isn->unopened = FALSE;
isn->blocked_by_conditional = FALSE;
return isn;
}
@ -219,6 +222,7 @@ compilation process, and never survive into the final schema:
@e ASM_ARROW_ISTT /* the arrow sign |->| used in assembly language only */
@e ASM_SP_ISTT /* the stack pointer pseudo-variable |sp| */
@e ASM_LABEL_ISTT /* the label sign |?| used in assembly language only */
@e ASM_NEGATED_LABEL_ISTT /* the label sign |?~| used in assembly language only */
=
typedef struct inter_schema_token {
@ -304,6 +308,7 @@ inter_schema_token *InterSchemas::new_token(int type, text_stream *material, int
@e CONTINUE_I6RW
@e QUIT_I6RW
@e RESTORE_I6RW
@e SPACES_I6RW
@e IFDEF_I6RW
@e IFNDEF_I6RW
@ -427,6 +432,7 @@ void InterSchemas::log_depth(inter_schema_node *isn, int depth) {
InterSchemas::log_just(isn, depth);
}
void InterSchemas::log_just(inter_schema_node *isn, int depth) {
if (isn->blocked_by_conditional) LOG("XX"); else LOG(" ");
for (int d = 0; d < depth; d++) LOG(" ");
switch (isn->isn_type) {
case STATEMENT_ISNT:
@ -484,42 +490,7 @@ void InterSchemas::log_just(inter_schema_node *isn, int depth) {
LOG("\n");
for (inter_schema_token *t = isn->expression_tokens; t; t=t->next) {
for (int d = 0; d < depth + 1; d++) LOG(" ");
switch (t->ist_type) {
case RAW_ISTT: LOG("RAW "); break;
case OPERATOR_ISTT: LOG("OPERATOR "); break;
case OPCODE_ISTT: LOG("OPCODE "); break;
case DIRECTIVE_ISTT: LOG("DIRECTIVE "); break;
case IDENTIFIER_ISTT: LOG("IDENTIFIER "); break;
case RESERVED_ISTT: LOG("RESERVED "); break;
case NUMBER_ISTT: LOG("NUMBER "); break;
case BIN_NUMBER_ISTT: LOG("BIN_NUMBER "); break;
case HEX_NUMBER_ISTT: LOG("HEX_NUMBER "); break;
case REAL_NUMBER_ISTT: LOG("REAL_NUMBER "); break;
case DQUOTED_ISTT: LOG("DQUOTED "); break;
case SQUOTED_ISTT: LOG("SQUOTED "); break;
case WHITE_SPACE_ISTT: LOG("WHITE_SPACE "); break;
case DIVIDER_ISTT: LOG("DIVIDER "); break;
case OPEN_ROUND_ISTT: LOG("OPEN_ROUND "); break;
case CLOSE_ROUND_ISTT: LOG("CLOSE_ROUND "); break;
case OPEN_BRACE_ISTT: LOG("OPEN_BRACE "); break;
case CLOSE_BRACE_ISTT: LOG("CLOSE_BRACE "); break;
case COMMA_ISTT: LOG("COMMA "); break;
case COLON_ISTT: LOG("COLON "); break;
case I7_ISTT: LOG("I7 "); break;
case INLINE_ISTT: LOG("INLINE "); break;
case ASM_ARROW_ISTT: LOG("ASM_ARROW "); break;
case ASM_SP_ISTT: LOG("ASM_SP "); break;
case ASM_LABEL_ISTT: LOG("ASM_LABEL "); break;
default: LOG("<unknown>"); break;
}
LOG("%S", t->material);
if (t->inline_modifiers & GIVE_KIND_ID_ISSBM) LOG(" GIVE_KIND_ID");
if (t->inline_modifiers & GIVE_COMPARISON_ROUTINE_ISSBM) LOG(" GIVE_COMPARISON_ROUTINE");
if (t->inline_modifiers & DEREFERENCE_PROPERTY_ISSBM) LOG(" DEREFERENCE_PROPERTY");
if (t->inline_modifiers & ADOPT_LOCAL_STACK_FRAME_ISSBM) LOG(" ADOPT_LOCAL_STACK_FRAME");
if (t->inline_modifiers & CAST_TO_KIND_OF_OTHER_TERM_ISSBM) LOG(" CAST_TO_KIND_OF_OTHER_TERM");
if (t->inline_modifiers & BY_REFERENCE_ISSBM) LOG(" BY_REFERENCE");
if (t->inline_modifiers & PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM) LOG(" PERMIT_LOCALS_IN_TEXT_CMODE");
InterSchemas::log_ist(t);
if (isn != t->owner) LOG(" !!! ownership incorrect here");
LOG("\n");
}
@ -528,6 +499,47 @@ void InterSchemas::log_just(inter_schema_node *isn, int depth) {
InterSchemas::log_depth(isn->child_node, depth+1);
}
void InterSchemas::log_ist(inter_schema_token *t) {
if (t == NULL) { LOG("<NULL-IST>"); return; }
switch (t->ist_type) {
case RAW_ISTT: LOG("RAW "); break;
case OPERATOR_ISTT: LOG("OPERATOR "); break;
case OPCODE_ISTT: LOG("OPCODE "); break;
case DIRECTIVE_ISTT: LOG("DIRECTIVE "); break;
case IDENTIFIER_ISTT: LOG("IDENTIFIER "); break;
case RESERVED_ISTT: LOG("RESERVED "); break;
case NUMBER_ISTT: LOG("NUMBER "); break;
case BIN_NUMBER_ISTT: LOG("BIN_NUMBER "); break;
case HEX_NUMBER_ISTT: LOG("HEX_NUMBER "); break;
case REAL_NUMBER_ISTT: LOG("REAL_NUMBER "); break;
case DQUOTED_ISTT: LOG("DQUOTED "); break;
case SQUOTED_ISTT: LOG("SQUOTED "); break;
case WHITE_SPACE_ISTT: LOG("WHITE_SPACE "); break;
case DIVIDER_ISTT: LOG("DIVIDER "); break;
case OPEN_ROUND_ISTT: LOG("OPEN_ROUND "); break;
case CLOSE_ROUND_ISTT: LOG("CLOSE_ROUND "); break;
case OPEN_BRACE_ISTT: LOG("OPEN_BRACE "); break;
case CLOSE_BRACE_ISTT: LOG("CLOSE_BRACE "); break;
case COMMA_ISTT: LOG("COMMA "); break;
case COLON_ISTT: LOG("COLON "); break;
case I7_ISTT: LOG("I7 "); break;
case INLINE_ISTT: LOG("INLINE "); break;
case ASM_ARROW_ISTT: LOG("ASM_ARROW "); break;
case ASM_SP_ISTT: LOG("ASM_SP "); break;
case ASM_LABEL_ISTT: LOG("ASM_LABEL "); break;
case ASM_NEGATED_LABEL_ISTT: LOG("NEGASM_LABEL "); break;
default: LOG("<unknown>"); break;
}
LOG("%S", t->material);
if (t->inline_modifiers & GIVE_KIND_ID_ISSBM) LOG(" GIVE_KIND_ID");
if (t->inline_modifiers & GIVE_COMPARISON_ROUTINE_ISSBM) LOG(" GIVE_COMPARISON_ROUTINE");
if (t->inline_modifiers & DEREFERENCE_PROPERTY_ISSBM) LOG(" DEREFERENCE_PROPERTY");
if (t->inline_modifiers & ADOPT_LOCAL_STACK_FRAME_ISSBM) LOG(" ADOPT_LOCAL_STACK_FRAME");
if (t->inline_modifiers & CAST_TO_KIND_OF_OTHER_TERM_ISSBM) LOG(" CAST_TO_KIND_OF_OTHER_TERM");
if (t->inline_modifiers & BY_REFERENCE_ISSBM) LOG(" BY_REFERENCE");
if (t->inline_modifiers & PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM) LOG(" PERMIT_LOCALS_IN_TEXT_CMODE");
}
@h Lint.
As can be seen, the |inter_schema| structure is quite complicated, and there
are numerous invariants it has to satisfy. As a precaution, then, we check that
@ -1075,15 +1087,18 @@ scanned through since the last time.
@<Look for individual tokens@> =
int L = Str::len(current_raw);
int c_start = 0;
int c_start = 0, escaped = FALSE;
for (int p = 0; p < L; p++) {
int c1 = Str::get_at(current_raw, p), c2 = 0, c3 = 0;
if (p < L-1) c2 = Str::get_at(current_raw, p+1);
if (p < L-2) c3 = Str::get_at(current_raw, p+2);
if (c1 == '$') @<Break off here for real, binary or hexadecimal notation@>;
if (c1 == '-') @<Break off here for negative number@>;
@<Break off here for operators@>;
if (escaped == FALSE) {
if (c1 == '$') @<Break off here for real, binary or hexadecimal notation@>;
if (c1 == '-') @<Break off here for negative number@>;
@<Break off here for operators@>;
}
if (c1 == 0x00A7) escaped = escaped?FALSE:TRUE;
}
if (c_start < L) {
int x = c_start, y = L-1;
@ -1172,6 +1187,7 @@ language opcodes such as |@pull|.
@<Break off here for operators@> =
int monograph = TRUE, digraph = FALSE, trigraph = FALSE;
if ((Characters::isalnum(c1)) || (c1 == '_')) monograph = FALSE;
if (c1 == 0x00A7) monograph = FALSE;
if ((c1 == '#') && (Characters::isalpha(c2))) monograph = FALSE;
if ((c1 == '_') && (Characters::isalpha(c2))) monograph = FALSE;
if ((c1 == '#') && (c2 == '#') && (Characters::isalpha(c3))) monograph = FALSE;
@ -1247,6 +1263,8 @@ inclusive; we ignore an empty token.
@<Identify this new token@> =
if (Str::get_at(T, 0) == '@') is = OPCODE_ISTT;
if (Str::get_at(T, 0) == 0x00A7)
is = IDENTIFIER_ISTT;
if ((Str::get_at(T, 0) == '#') && (Str::get_at(T, 1) == '#') && (Characters::isalpha(Str::get_at(T, 2)))) {
is = IDENTIFIER_ISTT;
LOOP_THROUGH_TEXT(P, T) {
@ -1280,6 +1298,7 @@ inclusive; we ignore an empty token.
}
if (Str::begins_with_wide_string(T, L"QUOTED_INAME_0_")) which_quote = 0;
else if (Str::begins_with_wide_string(T, L"QUOTED_INAME_1_")) which_quote = 1;
if (Str::eq(T, I"I7_string")) { Str::clear(T); WRITE_TO(T, "I7_String"); }
}
if (Characters::isdigit(Str::get_at(T, 0))) {
is = NUMBER_ISTT;
@ -1324,6 +1343,7 @@ inclusive; we ignore an empty token.
if (Str::eq(T, I"break")) { is = RESERVED_ISTT; which_rw = BREAK_I6RW; }
if (Str::eq(T, I"quit")) { is = RESERVED_ISTT; which_rw = QUIT_I6RW; }
if (Str::eq(T, I"restore")) { is = RESERVED_ISTT; which_rw = RESTORE_I6RW; }
if (Str::eq(T, I"spaces")) { is = RESERVED_ISTT; which_rw = SPACES_I6RW; }
if (Str::eq_insensitive(T, I"#IFDEF")) { is = DIRECTIVE_ISTT; which_rw = IFDEF_I6RW; }
if (Str::eq_insensitive(T, I"#IFNDEF")) { is = DIRECTIVE_ISTT; which_rw = IFNDEF_I6RW; }
@ -2038,6 +2058,9 @@ int InterSchemas::identify_constructs(inter_schema_node *par, inter_schema_node
case RESTORE_I6RW:
subordinate_to = restore_interp;
break;
case SPACES_I6RW:
subordinate_to = spaces_interp;
break;
case NEWLINE_I6RW:
subordinate_to = print_interp;
dangle_text = I"\n";
@ -2119,6 +2142,11 @@ int InterSchemas::identify_constructs(inter_schema_node *par, inter_schema_node
l->ist_type = ASM_LABEL_ISTT;
l->material = n->material;
n = n->next;
if (Str::eq(l->material, I"~")) {
l->ist_type = ASM_NEGATED_LABEL_ISTT;
l->material = n->material;
n = n->next;
}
}
if (isn->child_node == NULL) isn->child_node = new_isn;
else if (prev_node) prev_node->next_node = new_isn;
@ -2200,8 +2228,10 @@ int InterSchemas::treat_constructs(inter_schema_node *par, inter_schema_node *is
inter_schema_token *from[3], *to[3];
for (int i=0; i<3; i++) { from[i] = 0; to[i] = 0; }
while (n) {
if (n->ist_type == OPEN_ROUND_ISTT) bl++;
else if (n->ist_type == CLOSE_ROUND_ISTT) {
if (n->ist_type == OPEN_ROUND_ISTT) {
if ((bl > 0) && (from[cw] == NULL)) from[cw] = n;
bl++;
} else if (n->ist_type == CLOSE_ROUND_ISTT) {
bl--;
if (bl == 0) @<End a wodge@>;
} else if (bl == 1) {
@ -2214,6 +2244,7 @@ int InterSchemas::treat_constructs(inter_schema_node *par, inter_schema_node *is
}
if (cw != 3) internal_error("malformed for prototype");
for (int i=0; i<3; i++) {
// LOG("For clause %d is :", i); InterSchemas::log_ist(from[i]); LOG(" to "); InterSchemas::log_ist(to[i]); LOG("\n");
inter_schema_node *eval_isn = InterSchemas::new_node(isn->parent_schema, EVAL_ISNT);
if (i == 0) isn->child_node = eval_isn;
if (i == 1) isn->child_node->next_node = eval_isn;
@ -2613,6 +2644,27 @@ int InterSchemas::message_calls(inter_schema_node *par, inter_schema_node *isn)
@ =
void InterSchemas::de_escape_text(text_stream *m) {
int run_start = -1, run_len = 0, run_includes = FALSE;
for (int i=0; i<Str::len(m); i++) {
wchar_t c = Str::get_at(m, i);
if ((c == ' ') || (c == '\t') || (c == '\n')) {
if (run_start == -1) {
run_start = i;
run_len = 0;
run_includes = FALSE;
}
run_len++;
if (c == '\n') run_includes = TRUE;
} else {
if ((run_start >= 0) && (run_includes)) {
Str::put_at(m, run_start, ' ');
for (int j=0; j<run_len-1; j++)
Str::delete_nth_character(m, run_start+1);
i = run_start;
}
run_start = -1;
}
}
LOOP_THROUGH_TEXT(P, m) {
if (Str::get(P) == '^')
Str::put(P, '\n');

View file

@ -295,12 +295,18 @@ void CodeGen::constant(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
if (Str::eq(con_name->symbol_name, I"Class")) return;
if (Str::eq(con_name->symbol_name, I"#dict_par2")) return;
if (Str::eq(con_name->symbol_name, I"#actions_table")) return;
if (Str::eq(con_name->symbol_name, I"#identifiers_table")) return;
if (Str::eq(con_name->symbol_name, I"#grammar_table")) return;
if (Str::eq(con_name->symbol_name, I"#version_number")) return;
if (Str::eq(con_name->symbol_name, I"property_metadata")) return;
if (Str::eq(con_name->symbol_name, I"FBNA_PROP_NUMBER")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_arrow")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_sp")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_label")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_rtrue_label")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_rfalse_label")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_negated_rtrue_label")) return;
if (Str::eq(con_name->symbol_name, I"__assembly_negated_rfalse_label")) return;
if (Str::eq(con_name->symbol_name, I"thedark")) {
// WRITE("Object thedark \"(darkness object)\";\n");
return;
@ -371,6 +377,8 @@ void CodeGen::constant(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
void_level = Inter::Defn::get_level(P) + 2;
if (code_block) {
inter_frame D = Inter::Symbols::defining_frame(code_block);
// LOG("I see code block\n");
// Inter::Defn::write_construct_text(DL, D);
CodeGen::frame(OUT, I, D);
}
return;
@ -561,12 +569,16 @@ void CodeGen::label(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
}
void CodeGen::block(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
// LOG("\nBLOCK\n");
inter_symbol *block = Inter::SymbolsTables::symbol_from_frame_data(P, DEFN_PACKAGE_IFLD);
inter_frame_list *ifl = Inter::Package::code_list(block);
if (ifl == NULL) internal_error("block without code list");
inter_frame F;
LOOP_THROUGH_INTER_FRAME_LIST(F, ifl)
LOOP_THROUGH_INTER_FRAME_LIST(F, ifl) {
// Inter::Defn::write_construct_text(DL, F);
CodeGen::frame(OUT, I, F);
}
// LOG("----\n");
}
void CodeGen::code(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
@ -621,6 +633,7 @@ void CodeGen::inv(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
case TAKE_BIP: @<Generate primitive for take@>; break;
case QUIT_BIP: @<Generate primitive for quit@>; break;
case RESTORE_BIP: @<Generate primitive for restore@>; break;
case SPACES_BIP: @<Generate primitive for spaces@>; break;
case BREAK_BIP: @<Generate primitive for break@>; break;
case CONTINUE_BIP: @<Generate primitive for continue@>; break;
case NOT_BIP: @<Generate primitive for not@>; break;
@ -850,6 +863,10 @@ void CodeGen::val(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
WRITE("restore ");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
@<Generate primitive for spaces@> =
WRITE("spaces ");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
@<Generate primitive for break@> =
WRITE("break");
@ -1311,23 +1328,23 @@ then the result.
@<Generate primitive for lookup@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE("-->");
WRITE("-->(");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE(")");
WRITE("))");
@<Generate primitive for lookupbyte@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE("->");
WRITE("->(");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE(")");
WRITE("))");
@<Generate primitive for lookupref@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE("-->");
WRITE("-->(");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE(")");
WRITE("))");
@<Generate primitive for switch@> =
WRITE("switch (");

View file

@ -139,6 +139,25 @@ int Inter::Symbols::is_defined(inter_symbol *S) {
return FALSE;
}
int Inter::Symbols::evaluate_to_int(inter_symbol *S) {
inter_frame P = Inter::Symbols::defining_frame(S);
if ((Inter::Frame::valid(&P)) &&
(P.data[ID_IFLD] == CONSTANT_IST) &&
(P.data[FORMAT_CONST_IFLD] == CONSTANT_DIRECT) &&
(P.data[DATA_CONST_IFLD] == LITERAL_IVAL)) {
return (int) P.data[DATA_CONST_IFLD + 1];
}
if ((Inter::Frame::valid(&P)) &&
(P.data[ID_IFLD] == CONSTANT_IST) &&
(P.data[FORMAT_CONST_IFLD] == CONSTANT_DIRECT) &&
(P.data[DATA_CONST_IFLD] == ALIAS_IVAL)) {
inter_symbols_table *scope = S->owning_table;
inter_symbol *alias_to = Inter::SymbolsTables::symbol_from_id(scope, P.data[DATA_CONST_IFLD + 1]);
return Inter::Symbols::evaluate_to_int(alias_to);
}
return -1;
}
void Inter::Symbols::strike_definition(inter_symbol *S) {
if (S) {
inter_frame D = Inter::Symbols::defining_frame(S);

View file

@ -242,7 +242,10 @@ inter_error_message *Inter::Defn::pass2(inter_repository *I, int issue, inter_re
inter_frame P; int F = 0;
LOOP_THROUGH_INTER_FRAME_LIST_FROM(P, (&(I->sequence)), just_this->pos) {
F++;
// LOG("P2 F = %d baseline = %d gl = %d\n", F, baseline, Inter::Defn::get_level(P));
// Inter::Defn::write_construct_text(DL, P);
if ((stop_at_top) && (F > 1) && (Inter::Defn::get_level(P) == baseline)) break;
E = Inter::Errors::gather_first(E, Inter::Defn::pass2_on_frame(P, issue));
}
}
@ -265,6 +268,7 @@ inter_error_message *Inter::Defn::scan_levels(inter_repository *I, inter_error_m
int L = Inter::Defn::get_level(P) - baseline;
if ((stop_at_top) && (L <= 0) && (F > 1)) break;
if (P.data[ID_IFLD] == COMMENT_IST) continue;
if (P.data[ID_IFLD] == NOP_IST) continue;
if (frame_sp == L) {
if (Inter::Frame::valid(&PREV))
E = Inter::Errors::gather_first(E, Inter::Defn::no_more_children(PREV, issue));