mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 00:24:22 +03:00
Pushed back threshold for schema compilation to 200
This commit is contained in:
parent
331c70ee6f
commit
790010b4b7
|
@ -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>§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>
|
||||
|
|
|
@ -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">-></span><span class="identifier">codelike_package</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) &&</span>
|
||||
|
@ -133,7 +134,7 @@
|
|||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">identifier</span><span class="plain">) && (</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">(&</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">) > 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">>0) && (</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">>0) && (</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">(&</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">(&</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">(&</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">, &</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">, &</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">(&</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">) < 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">-></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">) < 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">>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">>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">>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">>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">>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">>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">>block_name</span><span class="plain">-></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">>body</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-</span><span class="element">>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">>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">>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">>block_name</span><span class="plain">;</span>
|
||||
<span class="identifier">Packaging::set_state</span><span class="plain">(&(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">>position</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-</span><span class="element">>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">req</span><span class="plain">-</span><span class="element">>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">>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">(&</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">>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">, &(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">>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">>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">§1.2</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Assimilate::routine_bodies is used in <a href="#SP1">§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-->
|
||||
|
|
|
@ -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 -> void"</span><span class="plain">, &</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 -> void"</span><span class="plain">, &</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 -> void"</span><span class="plain">, &</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 -> void"</span><span class="plain">, &</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 -> void"</span><span class="plain">, &</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 -> void"</span><span class="plain">, &</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 -> void"</span><span class="plain">, &</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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">§4</a>, <a href="4-cg.html#SP4_69">§4.69</a>).</p>
|
||||
<p class="endnote">The function Primitives::to_bip is used in 4/cg (<a href="4-cg.html#SP4">§4</a>, <a href="4-cg.html#SP4_70">§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">
|
||||
|
|
|
@ -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">>semicolon_terminated</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>unclosed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>unopened</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
<span class="identifier">isn</span><span class="plain">-</span><span class="element">>blocked_by_conditional</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
|
||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">isn</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
|
@ -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">-></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">>blocked_by_conditional</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"XX"</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = 0; </span><span class="identifier">d</span><span class="plain"> < </span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">d</span><span class="plain">++) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
||||
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>isn_type</span><span class="plain">) {</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">STATEMENT_ISNT</span><span class="plain">:</span>
|
||||
|
@ -626,6 +632,17 @@ 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">>expression_tokens</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">=</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = 0; </span><span class="identifier">d</span><span class="plain"> < </span><span class="identifier">depth</span><span class="plain"> + 1; </span><span class="identifier">d</span><span class="plain">++) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
|
||||
<span class="functiontext">InterSchemas::log_ist</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">);</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain"> != </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" !!! ownership incorrect here"</span><span class="plain">);</span>
|
||||
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="functiontext">InterSchemas::log_depth</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1);</span>
|
||||
<span class="plain">}</span>
|
||||
|
||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::log_ist</span><span class="plain">(</span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<NULL-IST>"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
||||
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain">) {</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RAW_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"RAW "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPERATOR_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"OPERATOR "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
|
@ -652,6 +669,7 @@ we go to some trouble here.
|
|||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_ARROW_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASM_ARROW "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_SP_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASM_SP "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_LABEL_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"ASM_LABEL "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ASM_NEGATED_LABEL_ISTT</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NEGASM_LABEL "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"<unknown>"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>material</span><span class="plain">);</span>
|
||||
|
@ -662,12 +680,6 @@ we go to some trouble here.
|
|||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">CAST_TO_KIND_OF_OTHER_TERM_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" CAST_TO_KIND_OF_OTHER_TERM"</span><span class="plain">);</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">BY_REFERENCE_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" BY_REFERENCE"</span><span class="plain">);</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">>inline_modifiers</span><span class="plain"> & </span><span class="constant">PERMIT_LOCALS_IN_TEXT_CMODE_ISSBM</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" PERMIT_LOCALS_IN_TEXT_CMODE"</span><span class="plain">);</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain"> != </span><span class="identifier">t</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" !!! ownership incorrect here"</span><span class="plain">);</span>
|
||||
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="functiontext">InterSchemas::log_depth</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1);</span>
|
||||
<span class="plain">}</span>
|
||||
</pre>
|
||||
|
||||
|
@ -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">§27</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP17"></a><b>§17. Lint. </b>As can be seen, the <code class="display"><span class="extract">inter_schema</span></code> structure is quite complicated, and there
|
||||
are numerous invariants it has to satisfy. As a precaution, then, we check that
|
||||
all of these invariants hold before shipping out a compiled schema. This is
|
||||
|
@ -1425,16 +1439,19 @@ 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"> < </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">++) {</span>
|
||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">), </span><span class="identifier">c2</span><span class="plain"> = 0, </span><span class="identifier">c3</span><span class="plain"> = 0;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">-1) </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">+1);</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">-2) </span><span class="identifier">c3</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">+2);</span>
|
||||
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">escaped</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'$'</span><span class="plain">) </span><<span class="cwebmacro">Break off here for real, binary or hexadecimal notation</span> <span class="cwebmacronumber">20.2.2.1.1</span>><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'-'</span><span class="plain">) </span><<span class="cwebmacro">Break off here for negative number</span> <span class="cwebmacronumber">20.2.2.1.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Break off here for operators</span> <span class="cwebmacronumber">20.2.2.1.3</span>><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c1</span><span class="plain"> == 0</span><span class="identifier">x00A7</span><span class="plain">) </span><span class="identifier">escaped</span><span class="plain"> = </span><span class="identifier">escaped</span><span class="plain">?</span><span class="identifier">FALSE</span><span class="plain">:</span><span class="identifier">TRUE</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c_start</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">) {</span>
|
||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = </span><span class="identifier">c_start</span><span class="plain">, </span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-1;</span>
|
||||
<<span class="cwebmacro">Break off a token</span> <span class="cwebmacronumber">20.2.2.1.4</span>><span class="plain">;</span>
|
||||
|
@ -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">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c2</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c2</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c1</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">c2</span><span class="plain"> == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">c3</span><span class="plain">))) </span><span class="identifier">monograph</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
|
@ -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">) && (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 1) == </span><span class="character">'#'</span><span class="plain">) && (</span><span class="identifier">Characters::isalpha</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, 2)))) {</span>
|
||||
<span class="identifier">is</span><span class="plain"> = </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">;</span>
|
||||
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
||||
|
@ -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">>ist_type</span><span class="plain"> = </span><span class="constant">ASM_LABEL_ISTT</span><span class="plain">;</span>
|
||||
<span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">;</span>
|
||||
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"~"</span><span class="plain">)) {</span>
|
||||
<span class="identifier">l</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> = </span><span class="constant">ASM_NEGATED_LABEL_ISTT</span><span class="plain">;</span>
|
||||
<span class="identifier">l</span><span class="plain">-</span><span class="element">>material</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>material</span><span class="plain">;</span>
|
||||
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
||||
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev_node</span><span class="plain">) </span><span class="identifier">prev_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
|
||||
|
@ -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"><3; </span><span class="identifier">i</span><span class="plain">++) { </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = 0; </span><span class="identifier">to</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = 0; }</span>
|
||||
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
||||
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">OPEN_ROUND_ISTT</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> > 0) && (</span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">from</span><span class="plain">[</span><span class="identifier">cw</span><span class="plain">] = </span><span class="identifier">n</span><span class="plain">;</span>
|
||||
<span class="identifier">bl</span><span class="plain">++;</span>
|
||||
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">>ist_type</span><span class="plain"> == </span><span class="constant">CLOSE_ROUND_ISTT</span><span class="plain">) {</span>
|
||||
<span class="identifier">bl</span><span class="plain">--;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span><<span class="cwebmacro">End a wodge</span> <span class="cwebmacronumber">27.1</span>><span class="plain">;</span>
|
||||
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 1) {</span>
|
||||
|
@ -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"><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">>parent_schema</span><span class="plain">, </span><span class="constant">EVAL_ISNT</span><span class="plain">);</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 0) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> == 1) </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">>child_node</span><span class="plain">-</span><span class="element">>next_node</span><span class="plain"> = </span><span class="identifier">eval_isn</span><span class="plain">;</span>
|
||||
|
@ -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"><</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
|
||||
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">)) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">run_start</span><span class="plain"> == -1) {</span>
|
||||
<span class="identifier">run_start</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
|
||||
<span class="identifier">run_len</span><span class="plain"> = 0;</span>
|
||||
<span class="identifier">run_includes</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="identifier">run_len</span><span class="plain">++;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">) </span><span class="identifier">run_includes</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
||||
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">run_start</span><span class="plain"> >= 0) && (</span><span class="identifier">run_includes</span><span class="plain">)) {</span>
|
||||
<span class="identifier">Str::put_at</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">run_start</span><span class="plain">, </span><span class="character">' '</span><span class="plain">);</span>
|
||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain"><</span><span class="identifier">run_len</span><span class="plain">-1; </span><span class="identifier">j</span><span class="plain">++)</span>
|
||||
<span class="identifier">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">m</span><span class="plain">, </span><span class="identifier">run_start</span><span class="plain">+1);</span>
|
||||
<span class="identifier">i</span><span class="plain"> = </span><span class="identifier">run_start</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="identifier">run_start</span><span class="plain"> = -1;</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="plain">}</span>
|
||||
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">m</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'^'</span><span class="plain">)</span>
|
||||
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">);</span>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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">§25</a>, 6/bp (<a href="6-bp.html#SP25">§25</a>), 6/rlt (<a href="6-rlt.html#SP29_2">§29.2</a>, <a href="6-rlt.html#SP29_3">§29.3</a>, <a href="6-rlt.html#SP29_4">§29.4</a>, <a href="6-rlt.html#SP29_5">§29.5</a>, <a href="6-rlt.html#SP29_6">§29.6</a>), 12/ter (<a href="12-ter.html#SP8_6">§8.6</a>), 12/ca (<a href="12-ca.html#SP6_2">§6.2</a>), 12/dtd (<a href="12-dtd.html#SP24">§24</a>), 13/kak (<a href="13-kak.html#SP2">§2</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">§3.1.1.4.7.1</a>), 26/iti (<a href="26-iti.html#SP9">§9</a>), 27/hr (<a href="27-hr.html#SP4">§4</a>), 27/eis (<a href="27-eis.html#SP2_10_1">§2.10.1</a>).</p>
|
||||
<p class="endnote">The function Kinds::RunTime::I6_classname is used in <a href="#SP25">§25</a>, 6/bp (<a href="6-bp.html#SP25">§25</a>), 6/rlt (<a href="6-rlt.html#SP29_2">§29.2</a>, <a href="6-rlt.html#SP29_3">§29.3</a>, <a href="6-rlt.html#SP29_4">§29.4</a>, <a href="6-rlt.html#SP29_5">§29.5</a>, <a href="6-rlt.html#SP29_6">§29.6</a>), 12/ter (<a href="12-ter.html#SP8_6">§8.6</a>), 12/ca (<a href="12-ca.html#SP6_2">§6.2</a>), 12/dtd (<a href="12-dtd.html#SP24">§24</a>), 13/kak (<a href="13-kak.html#SP2">§2</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">§3.1.1.4.7.1</a>), 26/iti (<a href="26-iti.html#SP9">§9</a>), 27/hr (<a href="27-hr.html#SP4">§4</a>), 27/eis (<a href="27-eis.html#SP3_10_1">§3.10.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kinds::RunTime::I6_classnumber is used in <a href="#SP23">§23</a>, 16/ic (<a href="16-ic.html#SP6">§6</a>, <a href="16-ic.html#SP10">§10</a>).</p>
|
||||
|
||||
|
|
|
@ -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">§25</a>), 12/is (<a href="12-is.html#SP7">§7</a>), 12/ca (<a href="12-ca.html#SP5">§5</a>), 12/dtd (<a href="12-dtd.html#SP7">§7</a>), 13/rsfk (<a href="13-rsfk.html#SP4">§4</a>), 14/cfs (<a href="14-cfs.html#SP9">§9</a>), 15/epv (<a href="15-epv.html#SP2">§2</a>), 24/pb (<a href="24-pb.html#SP14">§14</a>), 25/ci (<a href="25-ci.html#SP3_1_1">§3.1.1</a>, <a href="25-ci.html#SP3_2_3_3_1_3">§3.2.3.3.1.3</a>), 25/cp (<a href="25-cp.html#SP6">§6</a>), 26/iti (<a href="26-iti.html#SP9">§9</a>), 27/eis (<a href="27-eis.html#SP2_1">§2.1</a>), 27/ei (<a href="27-ei.html#SP5">§5</a>).</p>
|
||||
<p class="endnote">The function Holsters::new is used in 5/nv (<a href="5-nv.html#SP25">§25</a>), 12/is (<a href="12-is.html#SP7">§7</a>), 12/ca (<a href="12-ca.html#SP5">§5</a>), 12/dtd (<a href="12-dtd.html#SP7">§7</a>), 13/rsfk (<a href="13-rsfk.html#SP4">§4</a>), 14/cfs (<a href="14-cfs.html#SP9">§9</a>), 15/epv (<a href="15-epv.html#SP2">§2</a>), 24/pb (<a href="24-pb.html#SP14">§14</a>), 25/ci (<a href="25-ci.html#SP3_1_1">§3.1.1</a>, <a href="25-ci.html#SP3_2_3_3_1_3">§3.2.3.3.1.3</a>), 25/cp (<a href="25-cp.html#SP6">§6</a>), 26/iti (<a href="26-iti.html#SP9">§9</a>), 27/eis (<a href="27-eis.html#SP3_1">§3.1</a>), 27/ei (<a href="27-ei.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Conversions. </b></p>
|
||||
|
||||
|
|
|
@ -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">§14.5</a>), 25/cii (<a href="25-cii.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function LocalVariables::by_name_any is used in 27/eis (<a href="27-eis.html#SP2_11">§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">§3.11</a>).</p>
|
||||
|
||||
<p class="endnote">The function LocalVariables::phrase_options is used in 14/cn (<a href="14-cn.html#SP16_3">§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">§3</a>, <a href="26-rt.html#SP4">§4</a>, <a href="26-rt.html#SP4_1_1">§4.1.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function LocalVariables::declare_this is used in <a href="#SP8">§8</a>, <a href="#SP10">§10</a>, <a href="#SP11">§11</a>, <a href="#SP27">§27</a>, <a href="#SP28">§28</a>, <a href="#SP29">§29</a>, <a href="#SP41">§41</a>, <a href="#SP43">§43</a>, <a href="#SP45">§45</a>, 4/am (<a href="4-am.html#SP34_2">§34.2</a>), 11/tr (<a href="11-tr.html#SP10">§10</a>), 12/dtd (<a href="12-dtd.html#SP9">§9</a>, <a href="12-dtd.html#SP23">§23</a>, <a href="12-dtd.html#SP25">§25</a>, <a href="12-dtd.html#SP26">§26</a>, <a href="12-dtd.html#SP27">§27</a>), 12/cad (<a href="12-cad.html#SP7">§7</a>), 13/rsfk (<a href="13-rsfk.html#SP24_6_2">§24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">§24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">§24.6.4</a>), 14/lv (<a href="14-lv.html#SP14_1">§14.1</a>, <a href="14-lv.html#SP14_5">§14.5</a>), 14/cn (<a href="14-cn.html#SP16_3">§16.3</a>), 20/eq (<a href="20-eq.html#SP48">§48</a>), 25/cii (<a href="25-cii.html#SP1_2_1">§1.2.1</a>, <a href="25-cii.html#SP3_5_1">§3.5.1</a>, <a href="25-cii.html#SP3_5_3">§3.5.3</a>), 25/cp (<a href="25-cp.html#SP5_3_5">§5.3.5</a>), 27/eis (<a href="27-eis.html#SP2_11">§2.11</a>).</p>
|
||||
<p class="endnote">The function LocalVariables::declare_this is used in <a href="#SP8">§8</a>, <a href="#SP10">§10</a>, <a href="#SP11">§11</a>, <a href="#SP27">§27</a>, <a href="#SP28">§28</a>, <a href="#SP29">§29</a>, <a href="#SP41">§41</a>, <a href="#SP43">§43</a>, <a href="#SP45">§45</a>, 4/am (<a href="4-am.html#SP34_2">§34.2</a>), 11/tr (<a href="11-tr.html#SP10">§10</a>), 12/dtd (<a href="12-dtd.html#SP9">§9</a>, <a href="12-dtd.html#SP23">§23</a>, <a href="12-dtd.html#SP25">§25</a>, <a href="12-dtd.html#SP26">§26</a>, <a href="12-dtd.html#SP27">§27</a>), 12/cad (<a href="12-cad.html#SP7">§7</a>), 13/rsfk (<a href="13-rsfk.html#SP24_6_2">§24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">§24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">§24.6.4</a>), 14/lv (<a href="14-lv.html#SP14_1">§14.1</a>, <a href="14-lv.html#SP14_5">§14.5</a>), 14/cn (<a href="14-cn.html#SP16_3">§16.3</a>), 20/eq (<a href="20-eq.html#SP48">§48</a>), 25/cii (<a href="25-cii.html#SP1_2_1">§1.2.1</a>, <a href="25-cii.html#SP3_5_1">§3.5.1</a>, <a href="25-cii.html#SP3_5_3">§3.5.3</a>), 25/cp (<a href="25-cp.html#SP5_3_5">§5.3.5</a>), 27/eis (<a href="27-eis.html#SP3_11">§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">§24.4.1</a>, <a href="13-rsfk.html#SP24_4_2">§24.4.2</a>).</p>
|
||||
|
||||
|
|
|
@ -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">§3.4.2</a>, <a href="25-cii.html#SP3_4_4">§3.4.4</a>, <a href="25-cii.html#SP3_4_5">§3.4.5</a>), 25/cp (<a href="25-cp.html#SP5_4_3">§5.4.3</a>), 26/iti (<a href="26-iti.html#SP7_8_3">§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">§3.4.1</a>), 25/cp (<a href="25-cp.html#SP5_4_3">§5.4.3</a>), 27/eis (<a href="27-eis.html#SP2_1">§2.1</a>).</p>
|
||||
<p class="endnote">The function JumpLabels::write is used in 25/cii (<a href="25-cii.html#SP3_4_1">§3.4.1</a>), 25/cp (<a href="25-cp.html#SP5_4_3">§5.4.3</a>), 27/eis (<a href="27-eis.html#SP3_1">§3.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function JumpLabels::storage is used in 25/cii (<a href="25-cii.html#SP3_4_3">§3.4.3</a>).</p>
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -20,6 +20,13 @@
|
|||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">-></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">-></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">-></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">-></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">-></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>§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">-></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">-></span><span class="identifier">isn_type</span><span class="plain"> == </span><span class="identifier">DIRECTIVE_ISNT</span><span class="plain">) </span><<span class="cwebmacro">Directive</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
||||
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-></span><span class="identifier">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">-></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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Directive</span> <span class="cwebmacronumber">2.1</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
<pre class="displaydefn">
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">next_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">) && (</span><span class="identifier">symb</span><span class="plain">-></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">-></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">-></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">-></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"> >= </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"> > </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"> <= </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"> < </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">-></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">-></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">-></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">-></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">-></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">) && (</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">-></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">-></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">) && (</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"> != </span><span class="identifier">ifnot_node</span><span class="plain">)) {</span>
|
||||
<span class="identifier">at</span><span class="plain">-></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">-></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">-></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">§2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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">-></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">-></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><<span class="cwebmacro">Label</span> <span class="cwebmacronumber">2.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CODE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Code block</span> <span class="cwebmacronumber">2.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVAL_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Eval block</span> <span class="cwebmacronumber">2.7</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">EXPRESSION_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Expression</span> <span class="cwebmacronumber">2.11</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">SUBEXPRESSION_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Subexpression</span> <span class="cwebmacronumber">2.9</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">STATEMENT_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Statement</span> <span class="cwebmacronumber">2.10</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">OPERATION_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Operation</span> <span class="cwebmacronumber">2.8</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">ASSEMBLY_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Assembly</span> <span class="cwebmacronumber">2.3</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">CALL_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Call</span> <span class="cwebmacronumber">2.4</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">MESSAGE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Message</span> <span class="cwebmacronumber">2.5</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">CALLMESSAGE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Call-message</span> <span class="cwebmacronumber">2.6</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">DIRECTIVE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Directive</span> <span class="cwebmacronumber">2.12</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">LABEL_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Label</span> <span class="cwebmacronumber">3.1</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CODE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Code block</span> <span class="cwebmacronumber">3.2</span>><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVAL_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Eval block</span> <span class="cwebmacronumber">3.7</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">EXPRESSION_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Expression</span> <span class="cwebmacronumber">3.11</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">SUBEXPRESSION_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Subexpression</span> <span class="cwebmacronumber">3.9</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">STATEMENT_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Statement</span> <span class="cwebmacronumber">3.10</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">OPERATION_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Operation</span> <span class="cwebmacronumber">3.8</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">ASSEMBLY_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Assembly</span> <span class="cwebmacronumber">3.3</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">CALL_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Call</span> <span class="cwebmacronumber">3.4</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">MESSAGE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Message</span> <span class="cwebmacronumber">3.5</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">CALLMESSAGE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Call-message</span> <span class="cwebmacronumber">3.6</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">DIRECTIVE_ISNT</span><span class="plain">: </span><<span class="cwebmacro">Non-conditional directive</span> <span class="cwebmacronumber">3.12</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 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">§1</a>, <a href="#SP2_2">§2.2</a>, <a href="#SP2_3">§2.3</a>, <a href="#SP2_4">§2.4</a>, <a href="#SP2_5">§2.5</a>, <a href="#SP2_6">§2.6</a>, <a href="#SP2_7">§2.7</a>, <a href="#SP2_8">§2.8</a>, <a href="#SP2_9">§2.9</a>, <a href="#SP2_10">§2.10</a>, <a href="#SP2_10_1">§2.10.1</a>.</p>
|
||||
<p class="endnote">The function EmitInterSchemas::emit_inner is used in <a href="#SP1">§1</a>, <a href="#SP3_2">§3.2</a>, <a href="#SP3_3">§3.3</a>, <a href="#SP3_4">§3.4</a>, <a href="#SP3_5">§3.5</a>, <a href="#SP3_6">§3.6</a>, <a href="#SP3_7">§3.7</a>, <a href="#SP3_8">§3.8</a>, <a href="#SP3_9">§3.9</a>, <a href="#SP3_10">§3.10</a>, <a href="#SP3_10_1">§3.10.1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Label</span> <span class="cwebmacronumber">2.1</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_1"></a><b>§3.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Label</span> <span class="cwebmacronumber">3.1</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -89,10 +213,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_2"></a><b>§2.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Code block</span> <span class="cwebmacronumber">2.2</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_2"></a><b>§3.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Code block</span> <span class="cwebmacronumber">3.2</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -114,10 +238,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_3"></a><b>§2.3. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Assembly</span> <span class="cwebmacronumber">2.3</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_3"></a><b>§3.3. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Assembly</span> <span class="cwebmacronumber">3.3</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -144,10 +268,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_4"></a><b>§2.4. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Call</span> <span class="cwebmacronumber">2.4</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_4"></a><b>§3.4. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Call</span> <span class="cwebmacronumber">3.4</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -191,10 +315,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_5"></a><b>§2.5. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Message</span> <span class="cwebmacronumber">2.5</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_5"></a><b>§3.5. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Message</span> <span class="cwebmacronumber">3.5</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -221,10 +345,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_6"></a><b>§2.6. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Call-message</span> <span class="cwebmacronumber">2.6</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_6"></a><b>§3.6. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Call-message</span> <span class="cwebmacronumber">3.6</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -251,10 +375,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_7"></a><b>§2.7. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Eval block</span> <span class="cwebmacronumber">2.7</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_7"></a><b>§3.7. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Eval block</span> <span class="cwebmacronumber">3.7</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -280,10 +404,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_8"></a><b>§2.8. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Operation</span> <span class="cwebmacronumber">2.8</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_8"></a><b>§3.8. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Operation</span> <span class="cwebmacronumber">3.8</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -309,10 +433,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_9"></a><b>§2.9. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Subexpression</span> <span class="cwebmacronumber">2.9</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_9"></a><b>§3.9. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Subexpression</span> <span class="cwebmacronumber">3.9</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -333,10 +457,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_10"></a><b>§2.10. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Statement</span> <span class="cwebmacronumber">2.10</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_10"></a><b>§3.10. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Statement</span> <span class="cwebmacronumber">3.10</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -348,7 +472,7 @@
|
|||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">arity</span><span class="plain"> > 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">-></span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">objectloop_interp</span><span class="plain">)</span>
|
||||
<<span class="cwebmacro">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.10.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Add the objectloop range tokens</span> <span class="cwebmacronumber">3.10.1</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">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">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_10_1"></a><b>§2.10.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.10.1</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_10_1"></a><b>§3.10.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Add the objectloop range tokens</span> <span class="cwebmacronumber">3.10.1</span>> =
|
||||
</code></p>
|
||||
|
||||
|
||||
|
@ -404,10 +528,10 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP2_10">§2.10</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3_10">§3.10</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_11"></a><b>§2.11. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Expression</span> <span class="cwebmacronumber">2.11</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_11"></a><b>§3.11. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Expression</span> <span class="cwebmacronumber">3.11</span>> =
|
||||
</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">-></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">-></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">-></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">-></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">-></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">-></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">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_12"></a><b>§2.12. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Directive</span> <span class="cwebmacronumber">2.12</span>> =
|
||||
<p class="inwebparagraph"><a id="SP3_12"></a><b>§3.12. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Non-conditional directive</span> <span class="cwebmacronumber">3.12</span>> =
|
||||
</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">-></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">-></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">-></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">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">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></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">-></span><span class="identifier">child_node</span><span class="plain">-></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">" > "</span><span class="plain">);</span>
|
||||
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></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">" >= "</span><span class="plain">);</span>
|
||||
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></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">" < "</span><span class="plain">);</span>
|
||||
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></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">" <= "</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">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">child_node</span><span class="plain">-></span><span class="identifier">next_node</span><span class="plain">-></span><span class="identifier">expression_tokens</span><span class="plain">-></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">§2</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP3">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">§2.4</a>, <a href="#SP2_11">§2.11</a>.</p>
|
||||
<p class="endnote">The function EmitInterSchemas::find_identifier is used in <a href="#SP3_4">§3.4</a>, <a href="#SP3_11">§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">§3.6.2</a>).</p>
|
||||
<p class="endnote">The function EmitInterSchemas::find_identifier_text is used in <a href="#SP2_1">§2.1</a>, 25/cii (<a href="25-cii.html#SP3_6_2">§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
|
@ -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">§4</a>), 21/rl (<a href="21-rl.html#SP11_2">§11.2</a>, <a href="21-rl.html#SP22">§22</a>), 26/iti (<a href="26-iti.html#SP9">§9</a>), 27/eis (<a href="27-eis.html#SP2_11">§2.11</a>, <a href="27-eis.html#SP3">§3</a>), 27/ei (<a href="27-ei.html#SP2">§2</a>, <a href="27-ei.html#SP3">§3</a>, <a href="27-ei.html#SP4">§4</a>, <a href="27-ei.html#SP5">§5</a>).</p>
|
||||
<p class="endnote">The function InterNames::to_symbol is used in 15/epv (<a href="15-epv.html#SP4">§4</a>), 21/rl (<a href="21-rl.html#SP11_2">§11.2</a>, <a href="21-rl.html#SP22">§22</a>), 26/iti (<a href="26-iti.html#SP9">§9</a>), 27/eis (<a href="27-eis.html#SP3_11">§3.11</a>, <a href="27-eis.html#SP4">§4</a>), 27/ei (<a href="27-ei.html#SP2">§2</a>, <a href="27-ei.html#SP3">§3</a>, <a href="27-ei.html#SP4">§4</a>, <a href="27-ei.html#SP5">§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">
|
||||
|
|
|
@ -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">§11</a>, <a href="#SP12">§12</a>, <a href="#SP13">§13</a>.</p>
|
||||
|
||||
<p class="endnote">The function Packaging::bubble_at appears nowhere else.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP11"></a><b>§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.
|
||||
|
|
|
@ -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">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::SymbolsTables::symbol_from_id is used in <a href="#SP7">§7</a>, 2/iibf (<a href="2-iibf.html#SP1_5_3">§1.5.3</a>, <a href="2-iibf.html#SP1_6">§1.6</a>), 2/vi (<a href="2-vi.html#SP1">§1</a>), 2/idt (<a href="2-idt.html#SP2">§2</a>, <a href="2-idt.html#SP3">§3</a>), 4/tkc (<a href="4-tkc.html#SP2">§2</a>).</p>
|
||||
<p class="endnote">The function Inter::SymbolsTables::symbol_from_id is used in <a href="#SP7">§7</a>, 2/sym (<a href="2-sym.html#SP4">§4</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">§1.5.3</a>, <a href="2-iibf.html#SP1_6">§1.6</a>), 2/vi (<a href="2-vi.html#SP1">§1</a>), 2/idt (<a href="2-idt.html#SP2">§2</a>, <a href="2-idt.html#SP3">§3</a>), 4/tkc (<a href="4-tkc.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>It's convenient to have some abbreviations for common ways to access the above.
|
||||
</p>
|
||||
|
|
|
@ -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">(&</span><span class="identifier">P</span><span class="plain">)) &&</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">) &&</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">) &&</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">(&</span><span class="identifier">P</span><span class="plain">)) &&</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">) &&</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">) &&</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">>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">§2</a>, 2/iitf (<a href="2-iitf.html#SP1">§1</a>).</p>
|
||||
|
|
|
@ -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">, (&(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">>sequence</span><span class="plain">)), </span><span class="identifier">just_this</span><span class="plain">-</span><span class="element">>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">) && (</span><span class="identifier">F</span><span class="plain"> > 1) && (</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">) && (</span><span class="identifier">L</span><span class="plain"> <= 0) && (</span><span class="identifier">F</span><span class="plain"> > 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">(&</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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -66,3 +66,88 @@ Test: parse schema from:
|
|||
* (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
|
||||
=========
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,6 +490,17 @@ 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(" ");
|
||||
InterSchemas::log_ist(t);
|
||||
if (isn != t->owner) LOG(" !!! ownership incorrect here");
|
||||
LOG("\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
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;
|
||||
|
@ -510,6 +527,7 @@ void InterSchemas::log_just(inter_schema_node *isn, int depth) {
|
|||
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);
|
||||
|
@ -520,12 +538,6 @@ void InterSchemas::log_just(inter_schema_node *isn, int depth) {
|
|||
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");
|
||||
if (isn != t->owner) LOG(" !!! ownership incorrect here");
|
||||
LOG("\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
InterSchemas::log_depth(isn->child_node, depth+1);
|
||||
}
|
||||
|
||||
@h Lint.
|
||||
|
@ -1075,16 +1087,19 @@ 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 (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;
|
||||
@<Break off a token@>;
|
||||
|
@ -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');
|
||||
|
|
|
@ -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,13 +569,17 @@ 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) {
|
||||
int old_level = void_level;
|
||||
|
@ -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 (");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue