1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/codegen-module/4-gi6.html
2019-09-22 16:43:06 +01:00

868 lines
165 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>4/fi</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '4/gi6' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Generating Inform 6</b></li></ul><p class="purpose">To generate I6 code from intermediate code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Target</a></li><li><a href="#SP2">&#167;2. Segmentation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Target. </b></p>
<pre class="display">
<span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">inform6_target</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::create_target</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain"> = </span><span class="functiontext">CodeGen::Targets::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform6"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">BEGIN_GENERATION_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::begin_generation</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">GENERAL_SEGMENT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::general_segment</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">TL_SEGMENT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::tl_segment</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DEFAULT_SEGMENT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::default_segment</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">BASIC_CONSTANT_SEGMENT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::basic_constant_segment</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">CONSTANT_SEGMENT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::constant_segment</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">PROPERTY_SEGMENT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::property_segment</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">COMPILE_PRIMITIVE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::compile_primitive</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">COMPILE_DICTIONARY_WORD_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::compile_dictionary_word</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">COMPILE_LITERAL_TEXT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::compile_literal_text</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DECLARE_PROPERTY_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::declare_property</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">PREPARE_VARIABLE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::prepare_variable</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DECLARE_VARIABLE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::declare_variable</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DECLARE_LOCAL_VARIABLE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::declare_local_variable</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">BEGIN_CONSTANT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::begin_constant</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">END_CONSTANT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::end_constant</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">OFFER_PRAGMA_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::offer_pragma</span><span class="plain">)</span>
<span class="identifier">inform6_target</span><span class="plain"> = </span><span class="identifier">cgt</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="functiontext">CodeGen::I6::target</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">inform6_target</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::create_target is used in 4/ft (<a href="4-ft.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::I6::target is used in 3/fc (<a href="3-fc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Segmentation. </b>The loss of <code class="display"><span class="extract">life</span></code> is so appalling that I6 will not even compile a story
file which doesn't define the property number <code class="display"><span class="extract">life</span></code> (well, strictly
speaking, it checks the presence of constants suggesting the I6 library
first, but the template layer does define constants like that). We define
it as a null constant to be sure of avoiding any valid property number; I6
being typeless, that enables the veneer to compile again. (The relevant
code is in <code class="display"><span class="extract">CA__Pr</span></code>, defined in the <code class="display"><span class="extract">veneer.c</span></code> section of I6.)
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">debug_flag</span></code> is traditionally called so, but is actually
now a bitmap of flags for tracing actions, calls to object routines, and so on.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">pragmatic_matter_I7CGS</span><span class="definitionkeyword"> from </span><span class="constant">0</span>
<span class="definitionkeyword">enum</span> <span class="constant">compiler_versioning_matter_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">attributes_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">very_early_matter_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_1_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_2_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_3_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_4_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_5_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_6_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_7_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_8_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_9_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">constants_10_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">early_matter_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">text_literals_code_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">summations_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">arrays_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">globals_array_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">main_matter_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">routines_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">code_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">verbs_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">stubs_at_eof_I7CGS</span>
</pre>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::begin_generation</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">pragmatic_matter_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">compiler_versioning_matter_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">attributes_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">very_early_matter_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_1_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_2_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_3_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_4_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_5_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_6_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_7_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_8_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_9_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">constants_10_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">early_matter_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">text_literals_code_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">summations_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">globals_array_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">main_matter_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">routines_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">code_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">verbs_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">stubs_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">compiler_versioning_matter_I7CGS</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant Grammar__Version 2;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Global debug_flag;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Global reason_code = NULL;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant life = NULL;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::general_segment</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_IST</span><span class="plain">: {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain"> =</span>
<span class="identifier">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">DEFN_CONST_IFLD</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">early_matter_I7CGS</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">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"DynamicMemoryAllocation"</span><span class="plain">)) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">very_early_matter_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">LATE_IANN</span><span class="plain">) == 1) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">code_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">BUFFERARRAY_IANN</span><span class="plain">) == 1) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">BYTEARRAY_IANN</span><span class="plain">) == 1) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">STRINGARRAY_IANN</span><span class="plain">) == 1) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">TABLEARRAY_IANN</span><span class="plain">) == 1) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">FORMAT_CONST_IFLD</span><span class="plain">] == </span><span class="identifier">CONSTANT_INDIRECT_LIST</span><span class="plain">) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">VERBARRAY_IANN</span><span class="plain">) == 1) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">verbs_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Constant::is_routine</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">)) </span><span class="identifier">choice</span><span class="plain"> = </span><span class="constant">routines_at_eof_I7CGS</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">choice</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">RESPONSE_IST</span><span class="plain">:</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">early_matter_I7CGS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::default_segment</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::default_segment</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">main_matter_I7CGS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::constant_segment</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">early_matter_I7CGS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::basic_constant_segment</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</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">depth</span><span class="plain"> &gt;= 10) </span><span class="identifier">depth</span><span class="plain"> = 10;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">constants_1_I7CGS</span><span class="plain"> + </span><span class="identifier">depth</span><span class="plain"> - 1;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::property_segment</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">attributes_at_eof_I7CGS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::tl_segment</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">text_literals_code_I7CGS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::offer_pragma</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">content</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">tag</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"target_I6"</span><span class="plain">)) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">pragmatic_matter_I7CGS</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!%% %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">content</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::compile_primitive</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">prim_name</span><span class="plain">, </span><span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">bip</span><span class="plain"> = </span><span class="identifier">Primitives::to_bip</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">prim_name</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">bip</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INVERSION_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"inversion"</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">PLUS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" + "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MINUS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" - "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">UNARYMINUS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(-("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TIMES_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"*"</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DIVIDE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/"</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MODULO_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%%"</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">BITWISEAND_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")&amp;("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">BITWISEOR_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")|("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">BITWISENOT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(~("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(~~("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">AND_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") &amp;&amp; ("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OR_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") || ("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EQ_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" == "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ~= "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" &gt; "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" &gt;= "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" &lt; "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" &lt;= "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OFCLASS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ofclass "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HAS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" has "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HASNT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" hasnt "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IN_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" in "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NOTIN_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" notin "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROVIDES_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" provides "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ALTERNATIVE_BIP</span><span class="plain">: </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" or "</span><span class="plain">); </span><span class="constant">INV_A2</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">PUSH_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@push "</span><span class="plain">); </span><span class="constant">INV_A1</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">PULL_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@pull "</span><span class="plain">); </span><span class="constant">INV_A1</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">PREINCREMENT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"++("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">POSTINCREMENT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")++"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PREDECREMENT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">POSTDECREMENT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")--"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STORE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SETBIT_BIP</span><span class="plain">: </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" | "</span><span class="plain">); </span><span class="constant">INV_A2</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">CLEARBIT_BIP</span><span class="plain">: </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" &amp;~ ("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LOOKUP_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LOOKUPBYTE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"-&gt;("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LOOKUPREF_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;("</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTYADDRESS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".&amp; "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTYLENGTH_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".# "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTYVALUE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">BREAK_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"break"</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">CONTINUE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"continue"</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">RETURN_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for return</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">JUMP_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"jump "</span><span class="plain">); </span><span class="constant">INV_A1</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">QUIT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"quit"</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">RESTORE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"restore "</span><span class="plain">); </span><span class="constant">INV_A1</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">INDIRECT0_BIP</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT0V_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")()"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT1_BIP</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT1V_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT2_BIP</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT2V_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT3_BIP</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT3V_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A4</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT4_BIP</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT4V_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A4</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="constant">INV_A5</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT5_BIP</span><span class="plain">: </span><span class="reserved">case</span><span class="plain"> </span><span class="identifier">INDIRECT5V_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A4</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="constant">INV_A5</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A6</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE0_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"())"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE1_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE2_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A4</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE3_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A4</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A5</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLMESSAGE0_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call())"</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">CALLMESSAGE1_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLMESSAGE2_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLMESSAGE3_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call("</span><span class="plain">);</span>
<span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A4</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SPACES_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"spaces "</span><span class="plain">); </span><span class="constant">INV_A1</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">FONT_BIP</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"if ("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") { font on; } else { font off; }"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STYLEROMAN_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"style roman"</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">STYLEBOLD_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"style bold"</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">STYLEUNDERLINE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"style underline"</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">STYLEREVERSE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"style reverse"</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">MOVE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"move "</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" to "</span><span class="plain">); </span><span class="constant">INV_A2</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">REMOVE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"remove "</span><span class="plain">); </span><span class="constant">INV_A1</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">GIVE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"give "</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">); </span><span class="constant">INV_A2</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">TAKE_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"give "</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ~"</span><span class="plain">); </span><span class="constant">INV_A2</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">ALTERNATIVECASE_BIP</span><span class="plain">: </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">); </span><span class="constant">INV_A2</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">SEQUENTIAL_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TERNARYSEQUENTIAL_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for ternarysequential</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PRINT_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print "</span><span class="plain">); </span><span class="constant">INV_A1_PRINTMODE</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">PRINTRET_BIP</span><span class="plain">: </span><span class="constant">INV_A1_PRINTMODE</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">PRINTCHAR_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (char) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTNAME_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (name) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTOBJ_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (object) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTPROPERTY_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (property) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTNUMBER_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTADDRESS_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (address) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTSTRING_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (string) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTNLNUMBER_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (number) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTDEF_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (the) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTCDEF_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (The) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTINDEF_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (a) "</span><span class="plain">); </span><span class="constant">INV_A1</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">PRINTCINDEF_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"print (A) "</span><span class="plain">); </span><span class="constant">INV_A1</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">BOX_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"box "</span><span class="plain">); </span><span class="constant">INV_A1_BOXMODE</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">IF_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for if</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IFDEBUG_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for ifdebug</span> <span class="cwebmacronumber">2.4</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IFSTRICT_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for ifstrict</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IFELSE_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for ifelse</span> <span class="cwebmacronumber">2.6</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">WHILE_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for while</span> <span class="cwebmacronumber">2.7</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DO_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for do</span> <span class="cwebmacronumber">2.8</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FOR_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for for</span> <span class="cwebmacronumber">2.9</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECTLOOP_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for objectloop</span> <span class="cwebmacronumber">2.10</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECTLOOPX_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for objectloopx</span> <span class="cwebmacronumber">2.11</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LOOP_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for loop</span> <span class="cwebmacronumber">2.12</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SWITCH_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for switch</span> <span class="cwebmacronumber">2.13</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CASE_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for case</span> <span class="cwebmacronumber">2.14</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DEFAULT_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for default</span> <span class="cwebmacronumber">2.15</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">RANDOM_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"random("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">READ_BIP</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"read "</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">); </span><span class="constant">INV_A2</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">"Prim: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prim_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">); </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unimplemented prim"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">suppress_terminal_semicolon</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::begin_generation is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::general_segment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::default_segment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::constant_segment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::basic_constant_segment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::property_segment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::tl_segment is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::offer_pragma is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::compile_primitive is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for return</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rboolean</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">Inter::Tree::first_child</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">V</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">VAL_IST</span><span class="plain">) {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAL_IFLD</span><span class="plain">];</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val2</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAL_IFLD</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val1</span><span class="plain"> == </span><span class="identifier">LITERAL_IVAL</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val2</span><span class="plain"> == 0) </span><span class="identifier">rboolean</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">val2</span><span class="plain"> == 1) </span><span class="identifier">rboolean</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">rboolean</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"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">TRUE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"rtrue"</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">NOT_APPLICABLE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"return "</span><span class="plain">); </span><span class="functiontext">CodeGen::FC::frame</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b>Here we need some gymnastics. We need to produce a value which the
sometimes shaky I6 expression parser will accept, which turns out to be
quite a constraint. If we were compiling to C, we might try this:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">(a, b, c)</span>
</pre>
<p class="inwebparagraph">using the serial comma operator &mdash; that is, where the expression <code class="display"><span class="extract">(a, b)</span></code>
evaluates <code class="display"><span class="extract">a</span></code> then <code class="display"><span class="extract">b</span></code> and returns the value of <code class="display"><span class="extract">b</span></code>, discarding <code class="display"><span class="extract">a</span></code>.
Now I6 does support the comma operator, and this makes a workable scheme,
right up to the point where some of the token values themselves include
invocations of functions, because I6's syntax analyser won't always
allow the serial comma to be mixed in the same expression with the
function argument comma, i.e., I6 is unable properly to handle expressions
like this one:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">(a(b, c), d)</span>
</pre>
<p class="inwebparagraph">where the first comma constructs a list and the second is the operator.
(Many such expressions work fine, but not all.) That being so, the scheme
I actually use is:
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">(c) + 0*((b) + (a))</span>
</pre>
<p class="inwebparagraph">Because I6 evaluates the leaves in an expression tree right-to-left, not
left-to-right, the parameter assignments happen first, then the conditions,
then the result.
</p>
<p class="inwebparagraph"></p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for ternarysequential</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"! This value evaluates third (i.e., last)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="constant">INV_A3</span><span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"+\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"0*(\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"! The following condition evaluates second\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"((\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A2</span><span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">))\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"+\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"! The following assignments evaluate first\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for if</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"if ("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A2</span><span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_4"></a><b>&#167;2.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for ifdebug</span> <span class="cwebmacronumber">2.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"#ifdef DEBUG;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"#endif;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_5"></a><b>&#167;2.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for ifstrict</span> <span class="cwebmacronumber">2.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"#ifdef STRICT_MODE;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"#endif;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_6"></a><b>&#167;2.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for ifelse</span> <span class="cwebmacronumber">2.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"if ("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"} else {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_7"></a><b>&#167;2.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for while</span> <span class="cwebmacronumber">2.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"while ("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_8"></a><b>&#167;2.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for do</span> <span class="cwebmacronumber">2.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"do {"</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"} until (\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_9"></a><b>&#167;2.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for for</span> <span class="cwebmacronumber">2.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"for ("</span><span class="plain">);</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">INIT</span><span class="plain"> = </span><span class="identifier">Inter::Tree::first_child</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">INIT</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">VAL_IST</span><span class="plain">) &amp;&amp; (</span><span class="identifier">INIT</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAL_IFLD</span><span class="plain">] == </span><span class="identifier">LITERAL_IVAL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">INIT</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAL_IFLD</span><span class="plain">] == 1))) </span><span class="constant">INV_A1</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":"</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":"</span><span class="plain">);</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">U</span><span class="plain"> = </span><span class="identifier">Inter::Tree::third_child</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">U</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] != </span><span class="identifier">VAL_IST</span><span class="plain">)</span>
<span class="functiontext">CodeGen::FC::frame</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">U</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A4</span><span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_10"></a><b>&#167;2.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for objectloop</span> <span class="cwebmacronumber">2.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">U</span><span class="plain"> = </span><span class="identifier">Inter::Tree::third_child</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">U</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">INV_IST</span><span class="plain">) &amp;&amp; (</span><span class="identifier">U</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">METHOD_INV_IFLD</span><span class="plain">] == </span><span class="identifier">INVOKED_PRIMITIVE</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">prim</span><span class="plain"> = </span><span class="identifier">Inter::Inv::invokee</span><span class="plain">(</span><span class="identifier">U</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prim</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Primitives::to_bip</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">prim</span><span class="plain">) == </span><span class="identifier">IN_BIP</span><span class="plain">)) </span><span class="identifier">in_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"objectloop "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">in_flag</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ofclass "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" &amp;&amp; "</span><span class="plain">);</span>
<span class="plain">} </span><span class="constant">INV_A3</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">in_flag</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A4</span><span class="plain">;</span>
<span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_11"></a><b>&#167;2.11. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for objectloopx</span> <span class="cwebmacronumber">2.11</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"objectloop ("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ofclass "</span><span class="plain">); </span><span class="constant">INV_A2</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A3</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_12"></a><b>&#167;2.12. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for loop</span> <span class="cwebmacronumber">2.12</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_13"></a><b>&#167;2.13. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for switch</span> <span class="cwebmacronumber">2.13</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"switch ("</span><span class="plain">); </span><span class="constant">INV_A1</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">OUTDENT</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_14"></a><b>&#167;2.14. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for case</span> <span class="cwebmacronumber">2.14</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">":\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A2</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">OUTDENT</span><span class="plain">;</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_15"></a><b>&#167;2.15. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for default</span> <span class="cwebmacronumber">2.15</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"default:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">INDENT</span><span class="plain">; </span><span class="constant">INV_A1</span><span class="plain">; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); </span><span class="identifier">OUTDENT</span><span class="plain">;</span>
<span class="identifier">suppress_terminal_semicolon</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::compile_dictionary_word</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</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">int</span><span class="plain"> </span><span class="identifier">pluralise</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'"</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</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</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'/'</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">) == 1) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{2F}"</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"/"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"^"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'^'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{5E}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'~'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{7E}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'@'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{40}"</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">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain">++ &gt; 32) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pluralise</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"//p"</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::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">) == 1) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"//"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::compile_dictionary_word is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::compile_literal_text</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</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">int</span><span class="plain"> </span><span class="identifier">printing_mode</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">box_mode</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc_char</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</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</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">box_mode</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'@'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{40}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'^'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{5E}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'~'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{7E}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{5C}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</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">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">\</span><span class="plain">"</span><span class="string">"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">\</span><span class="plain">n</span><span class="string">\</span><span class="plain">"</span><span class="string">"</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">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'@'</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">printing_mode</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@@64"</span><span class="plain">); </span><span class="identifier">esc_char</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{40}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'^'</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">printing_mode</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@@94"</span><span class="plain">); </span><span class="identifier">esc_char</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{5E}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'~'</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">printing_mode</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@@126"</span><span class="plain">); </span><span class="identifier">esc_char</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{7E}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{5C}"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</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">WRITE</span><span class="plain">(</span><span class="string">"^"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NEWLINE_IN_STRING</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"^"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">esc_char</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"@{%02x}"</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">esc_char</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::compile_literal_text is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Because in I6 source code some properties aren't declared before use, it follows
that if not used by any object then they won't ever be created. This is a
problem since it means that I6 code can't refer to them, because it would need
to mention an I6 symbol which doesn't exist. To get around this, we create the
property names which don't exist as constant symbols with the harmless value
0; we do this right at the end of the compiled I6 code. (This is a standard I6
trick called "stubbing", these being "stub definitions".)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::declare_property</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">prop_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">used</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain"> = </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">prop_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used</span><span class="plain">) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">attributes_at_eof_I7CGS</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"Property %S;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prop_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">code_at_eof_I7CGS</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"#ifndef %S; Constant %S = 0; #endif;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::declare_property is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::prepare_variable</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">EXPLICIT_VARIABLE_IANN</span><span class="plain">) != 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">) != 1) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="string">"(Global_Vars--&gt;%d)"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">k</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::declare_variable</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">of</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">) == 1) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">main_matter_I7CGS</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Global %S = "</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAR_IFLD</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAR_IFLD</span><span class="plain">], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">EXPLICIT_VARIABLE_IANN</span><span class="plain">) != 1) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">attributes_at_eof_I7CGS</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Array Global_Vars --&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ("</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">globals</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">globals</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAR_IFLD</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAR_IFLD</span><span class="plain">], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") ! --&gt;%d = %S (%S)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">), </span><span class="identifier">var_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">k</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> == </span><span class="identifier">of</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> &lt; 2) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" NULL NULL"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::declare_local_variable</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" %S"</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::begin_constant</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">continues</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant %S"</span><span class="plain">, </span><span class="identifier">const_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">continues</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::end_constant</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</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="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::prepare_variable is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::declare_variable is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::declare_local_variable is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::begin_constant is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::end_constant is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-fi.html">Back to 'Final Inventory'</a></li><li><i>(This section ends Chapter 4: Final Code.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>