|
|
|
@ -64,7 +64,7 @@ MathJax = {
|
|
|
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#4">Chapter 4: Languages</a></li><li><b>InC Support</b></li></ul></div>
|
|
|
|
|
<p class="purpose">To support a modest extension of C called InC.</p>
|
|
|
|
|
|
|
|
|
|
<ul class="toc"><li><a href="4-is.html#SP1">§1. Creation</a></li><li><a href="4-is.html#SP3">§3. Parsing methods</a></li><li><a href="4-is.html#SP3_1">§3.1. Parsing Preform grammar</a></li><li><a href="4-is.html#SP3_1_1_1">§3.1.1.1. Parsing the body of Preform grammar</a></li><li><a href="4-is.html#SP3_2">§3.2. Parsing I-literals</a></li><li><a href="4-is.html#SP4">§4. Tangling methods</a></li><li><a href="4-is.html#SP14">§14. Weaving</a></li><li><a href="4-is.html#SP15">§15. Weaving methods</a></li><li><a href="4-is.html#SP18">§18. Analysis methods</a></li></ul><hr class="tocbar">
|
|
|
|
|
<ul class="toc"><li><a href="4-is.html#SP1">§1. Creation</a></li><li><a href="4-is.html#SP3">§3. Parsing methods</a></li><li><a href="4-is.html#SP3_1">§3.1. Parsing Preform grammar</a></li><li><a href="4-is.html#SP3_1_1_1">§3.1.1.1. Parsing the body of Preform grammar</a></li><li><a href="4-is.html#SP3_2">§3.2. Parsing I-literals</a></li><li><a href="4-is.html#SP4">§4. Tangling methods</a></li><li><a href="4-is.html#SP15">§15. Weaving</a></li><li><a href="4-is.html#SP16">§16. Weaving methods</a></li><li><a href="4-is.html#SP19">§19. Analysis methods</a></li></ul><hr class="tocbar">
|
|
|
|
|
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Creation. </b>As can be seen, InC is a basically C-like language, but in addition to having
|
|
|
|
|
all of those methods, it has a whole lot more of its own.
|
|
|
|
@ -79,16 +79,16 @@ all of those methods, it has a whole lot more of its own.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ADDITIONAL_PREDECLARATIONS_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP6" class="function-link"><span class="function-syntax">InCSupport::additional_predeclarations</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">WILL_TANGLE_EXTRA_LINE_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP8" class="function-link"><span class="function-syntax">InCSupport::will_insert_in_tangle</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">TANGLE_EXTRA_LINE_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP9" class="function-link"><span class="function-syntax">InCSupport::insert_in_tangle</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">TANGLE_LINE_UNUSUALLY_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::tangle_line</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">TANGLE_LINE_UNUSUALLY_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP11" class="function-link"><span class="function-syntax">InCSupport::tangle_line</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">GNABEHS_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP7" class="function-link"><span class="function-syntax">InCSupport::gnabehs</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ADDITIONAL_TANGLING_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP13" class="function-link"><span class="function-syntax">InCSupport::additional_tangling</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ADDITIONAL_TANGLING_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP14" class="function-link"><span class="function-syntax">InCSupport::additional_tangling</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">SKIP_IN_WEAVING_WEA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP15" class="function-link"><span class="function-syntax">InCSupport::skip_in_weaving</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">WEAVE_CODE_LINE_WEA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP16" class="function-link"><span class="function-syntax">InCSupport::weave_code_line</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">NOTIFY_NEW_TAG_WEA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP17" class="function-link"><span class="function-syntax">InCSupport::new_tag_declared</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">SKIP_IN_WEAVING_WEA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP16" class="function-link"><span class="function-syntax">InCSupport::skip_in_weaving</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">WEAVE_CODE_LINE_WEA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP17" class="function-link"><span class="function-syntax">InCSupport::weave_code_line</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">NOTIFY_NEW_TAG_WEA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP18" class="function-link"><span class="function-syntax">InCSupport::new_tag_declared</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ANALYSIS_ANA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP18" class="function-link"><span class="function-syntax">InCSupport::analyse_code</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">SHARE_ELEMENT_ANA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP18" class="function-link"><span class="function-syntax">InCSupport::share_element</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ANALYSIS_ANA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP19" class="function-link"><span class="function-syntax">InCSupport::analyse_code</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">SHARE_ELEMENT_ANA_MTID</span><span class="plain-syntax">, </span><a href="4-is.html#SP19" class="function-link"><span class="function-syntax">InCSupport::share_element</span></a><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>We will apply this special tag wherever Preform grammar is defined:
|
|
|
|
@ -760,6 +760,7 @@ first line, 1 for the second, and so on) by default, with an undefined pointer.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">AL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-></span><span class="element-syntax">next_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">c</span><span class="plain-syntax">++) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">formula</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-></span><span class="element-syntax">text_operand2</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">formula</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP15" class="function-link"><span class="function-syntax">LanguageMethods::insert_line_marker</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-></span><span class="element-syntax">owning_section</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\t\tcase %d: "</span><span class="plain-syntax">, </span><span class="identifier-syntax">c</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP9_1_2_1" class="named-paragraph-link"><span class="named-paragraph">Tangle the formula on the right-hand side of the arrow</span><span class="named-paragraph-number">9.1.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";\n"</span><span class="plain-syntax">);</span>
|
|
|
|
@ -799,10 +800,28 @@ nonterminal being parsed.)
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"{ *(%c*?) *} *(%c*)"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">rewritten</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">rewritten</span><span class="plain-syntax">, </span><span class="string-syntax">"=="</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">rewritten</span><span class="plain-syntax">, </span><span class="string-syntax">"> { %S }"</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0]);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP11" class="function-link"><span class="function-syntax">InCSupport::tangle_line_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">rewritten</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::expand_formula</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">rewritten</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"@<%c*"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">-></span><span class="element-syntax">takes_pointer_result</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"*XP = "</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"*X = "</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::expand_formula</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP9_1_2">§9.1.2</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b></p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::expand_formula</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">InCSupport::expand_formula</span></span>:<br/><a href="4-is.html#SP9_1_2_1">§9.1.2.1</a>, <a href="4-is.html#SP11_2_3">§11.2.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">,</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">full</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">expanded</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"> < </span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">formula</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'W'</span><span class="plain-syntax">) && (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+1) == </span><span class="character-syntax">'R'</span><span class="plain-syntax">) &&</span>
|
|
|
|
@ -815,25 +834,30 @@ nonterminal being parsed.)
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">expanded</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">formula</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP3" class="function-link"><span class="function-syntax">Tangler::tangle_line</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">expanded</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-></span><span class="element-syntax">owning_section</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">full</span><span class="plain-syntax">) </span><a href="3-tt.html#SP3" class="function-link"><span class="function-syntax">Tangler::tangle_line</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">expanded</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-></span><span class="element-syntax">owning_section</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-is.html#SP11" class="function-link"><span class="function-syntax">InCSupport::tangle_line_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">expanded</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">expanded</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP9_1_2">§9.1.2</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Going down from line level to the tangling of little excerpts of C code,
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>Going down from line level to the tangling of little excerpts of C code,
|
|
|
|
|
we also provide for some other special extensions to C.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::tangle_line</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">InCSupport::tangle_line</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::tangle_line</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">InCSupport::tangle_line</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP11" class="function-link"><span class="function-syntax">InCSupport::tangle_line_inner</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">original</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::tangle_line_inner</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">InCSupport::tangle_line_inner</span></span>:<br/><a href="4-is.html#SP9_1_2_1">§9.1.2.1</a>, <a href="4-is.html#SP10">§10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">fcall_pos</span><span class="plain-syntax"> = -1;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax"> < </span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Double-colons are namespace dividers in function names</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_1" class="named-paragraph-link"><span class="named-paragraph">Double-colons are namespace dividers in function names</span><span class="named-paragraph-number">11.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_2" class="named-paragraph-link"><span class="named-paragraph">Long arrow and braces assigns Preform results</span><span class="named-paragraph-number">11.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'<'</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+1) == </span><span class="character-syntax">'<'</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Double-angles sometimes delimit Preform variable names</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_3" class="named-paragraph-link"><span class="named-paragraph">Double-angles sometimes delimit Preform variable names</span><span class="named-paragraph-number">11.3</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP10_3" class="named-paragraph-link"><span class="named-paragraph">Single-angles sometimes delimit Preform nonterminal names</span><span class="named-paragraph-number">10.3</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_4" class="named-paragraph-link"><span class="named-paragraph">Single-angles sometimes delimit Preform nonterminal names</span><span class="named-paragraph-number">11.4</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> == </span><span class="identifier-syntax">fcall_pos</span><span class="plain-syntax">) {</span>
|
|
|
|
@ -844,7 +868,7 @@ we also provide for some other special extensions to C.
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP10_1"></a><b>§10.1. </b>For example, a function name like <span class="extract"><span class="extract-syntax">Text::Parsing::get_next</span></span> must be rewritten
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_1"></a><b>§11.1. </b>For example, a function name like <span class="extract"><span class="extract-syntax">Text::Parsing::get_next</span></span> must be rewritten
|
|
|
|
|
as <span class="extract"><span class="extract-syntax">Text__Parsing__get_next</span></span> since colons aren't valid in C identifiers. The
|
|
|
|
|
following is prone to all kinds of misreadings, of course; it picks up any use
|
|
|
|
|
of <span class="extract"><span class="extract-syntax">::</span></span> between an alphanumberic character and a letter. In particular, code
|
|
|
|
@ -865,7 +889,7 @@ extension features of Inweb aren't intended for general use: only for
|
|
|
|
|
Inform, where no misreadings occur.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Double-colons are namespace dividers in function names</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Double-colons are namespace dividers in function names</span><span class="named-paragraph-number">11.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
@ -875,14 +899,161 @@ Inform, where no misreadings occur.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP10">§10</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP10_2"></a><b>§10.2. </b>Angle brackets around a valid Preform variable name expand into its
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11">§11</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_2"></a><b>§11.2. </b>For example, <span class="extract"><span class="extract-syntax">==> { A, B }</span></span> assigns the expressions A and B as the results
|
|
|
|
|
of parsing a Preform nonterminal.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_PREFORM_RESULT_CLAUSES</span><span class="plain-syntax"> </span><span class="constant-syntax">10</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Long arrow and braces assigns Preform results</span><span class="named-paragraph-number">11.2</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">) == </span><span class="character-syntax">'='</span><span class="plain-syntax">) &&</span>
|
|
|
|
|
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+1) == </span><span class="character-syntax">'='</span><span class="plain-syntax">) &&</span>
|
|
|
|
|
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+2) == </span><span class="character-syntax">'>'</span><span class="plain-syntax">) &&</span>
|
|
|
|
|
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+3) == </span><span class="character-syntax">' '</span><span class="plain-syntax">) &&</span>
|
|
|
|
|
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+4) == </span><span class="character-syntax">'{'</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">clauses</span><span class="plain-syntax">, </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_PREFORM_RESULT_CLAUSES</span><span class="plain-syntax">];</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_2_1" class="named-paragraph-link"><span class="named-paragraph">Find the clauses</span><span class="named-paragraph-number">11.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_2_2" class="named-paragraph-link"><span class="named-paragraph">Recognise one-clause specials</span><span class="named-paragraph-number">11.2.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> < </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP11_2_3" class="named-paragraph-link"><span class="named-paragraph">Write the assignments</span><span class="named-paragraph-number">11.2.3</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">err</span><span class="plain-syntax">) </span><a href="1-pc.html#SP8" class="function-link"><span class="function-syntax">Main::error_in_web</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"malformed '{ , }' formula"</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11">§11</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_2_1"></a><b>§11.2.1. </b>The clauses are a comma-separated list inside the braces, except that the
|
|
|
|
|
commas need to be outside of any parentheses.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Find the clauses</span><span class="named-paragraph-number">11.2.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">();</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bl</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">+5; </span><span class="identifier-syntax">j</span><span class="plain-syntax"> < </span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">); </span><span class="identifier-syntax">j</span><span class="plain-syntax">++) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">','</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">bl</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> >= </span><span class="constant-syntax">MAX_PREFORM_RESULT_CLAUSES</span><span class="plain-syntax">) </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> { </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">clauses</span><span class="plain-syntax">] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">clauses</span><span class="plain-syntax">++; }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="character-syntax">'}'</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">bl</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="identifier-syntax">j</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="character-syntax">'('</span><span class="plain-syntax">: </span><span class="identifier-syntax">bl</span><span class="plain-syntax">++; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="character-syntax">')'</span><span class="plain-syntax">: </span><span class="identifier-syntax">bl</span><span class="plain-syntax">--; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bl</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">clauses</span><span class="plain-syntax">-1], </span><span class="identifier-syntax">c</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bl</span><span class="plain-syntax"> != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">c</span><span class="plain-syntax"><</span><span class="identifier-syntax">clauses</span><span class="plain-syntax">; </span><span class="identifier-syntax">c</span><span class="plain-syntax">++) </span><a href="../foundation-module/4-sm.html#SP24" class="function-link"><span class="function-syntax">Str::trim_white_space</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">]);</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11_2">§11.2</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_2_2"></a><b>§11.2.2. </b>There are a number of special syntaxes with just one clause, and these
|
|
|
|
|
are implemented by rewriting them in two clauses, and sometimes adding some
|
|
|
|
|
extra code to execute after the assignments.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Recognise one-clause specials</span><span class="named-paragraph-number">11.2.2</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"fail"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="string-syntax">"return FAIL_NONTERMINAL;"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="string-syntax">"-"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1], </span><span class="string-syntax">"-"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"fail production"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="string-syntax">"return FALSE;"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="string-syntax">"-"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1], </span><span class="string-syntax">"-"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP21" class="function-link"><span class="function-syntax">Str::prefix_eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"advance "</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="string-syntax">"return FAIL_NONTERMINAL + "</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP26" class="function-link"><span class="function-syntax">Str::substr</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="constant-syntax">8</span><span class="plain-syntax">), </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]));</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="string-syntax">";"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="string-syntax">"0"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1], </span><span class="string-syntax">"NULL"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP21" class="function-link"><span class="function-syntax">Str::prefix_eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"pass "</span><span class="plain-syntax">, </span><span class="constant-syntax">5</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP26" class="function-link"><span class="function-syntax">Str::substr</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="constant-syntax">5</span><span class="plain-syntax">), </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]));</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="string-syntax">"R[%S]"</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1], </span><span class="string-syntax">"RP[%S]"</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">I</span><span class="string-syntax">"lookahead"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1] = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">(); </span><span class="identifier-syntax">clauses</span><span class="plain-syntax"> = </span><span class="constant-syntax">2</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0]);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[0], </span><span class="string-syntax">"0"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[1], </span><span class="string-syntax">"NULL"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="string-syntax">"return preform_lookahead_mode;"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11_2">§11.2</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_2_3"></a><b>§11.2.3. </b>Each clause leads to an assignment. Clauses 0 and 1 set the result values
|
|
|
|
|
for the current nonterminal; any subsequent clauses must specify which
|
|
|
|
|
variable is to be set. A dash means make no assignment.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary">For example, <span class="extract"><span class="extract-syntax">{ R[1], - , <<to>> = R[2] }</span></span> sets <span class="extract"><span class="extract-syntax">*X</span></span> to <span class="extract"><span class="extract-syntax">R[1]</span></span>, does not
|
|
|
|
|
alter <span class="extract"><span class="extract-syntax">*XP</span></span>, and sets <span class="extract"><span class="extract-syntax"><<to>></span></span> to <span class="extract"><span class="extract-syntax">R[2]</span></span>.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Write the assignments</span><span class="named-paragraph-number">11.2.3</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">c</span><span class="plain-syntax"><</span><span class="identifier-syntax">clauses</span><span class="plain-syntax">; </span><span class="identifier-syntax">c</span><span class="plain-syntax">++) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::ne</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">], </span><span class="identifier-syntax">I</span><span class="string-syntax">"-"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">: </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"*X = "</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::expand_formula</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">], </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"*XP = "</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::expand_formula</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">], </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">clause</span><span class="plain-syntax">[</span><span class="identifier-syntax">c</span><span class="plain-syntax">], </span><span class="identifier-syntax">L</span><span class="string-syntax">"<<(%P+)>> = *(%c*)"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">putative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax"> =</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP13" class="function-link"><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S = "</span><span class="plain-syntax">, </span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::expand_formula</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1], </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::ne</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"-"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="4-is.html#SP10" class="function-link"><span class="function-syntax">InCSupport::expand_formula</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="identifier-syntax">extra</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11_2">§11.2</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_3"></a><b>§11.3. </b>Angle brackets around a valid Preform variable name expand into its
|
|
|
|
|
C identifier; for example, <span class="extract"><span class="extract-syntax"><<R>></span></span> becomes <span class="extract"><span class="extract-syntax">most_recent_result</span></span>.
|
|
|
|
|
We take no action if it's not a valid name, so <span class="extract"><span class="extract-syntax"><<fish>></span></span> becomes
|
|
|
|
|
just <span class="extract"><span class="extract-syntax"><<fish>></span></span>.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Double-angles sometimes delimit Preform variable names</span><span class="named-paragraph-number">10.2</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Double-angles sometimes delimit Preform variable names</span><span class="named-paragraph-number">11.3</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
@ -891,7 +1062,7 @@ just <span class="extract"><span class="extract-syntax"><<fish>></sp
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP26" class="function-link"><span class="function-syntax">Str::substr</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">check_this</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">), </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">));</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">check_this</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"<<(%P+)>>%c*"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">putative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax"> = </span><a href="4-is.html#SP12" class="function-link"><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax"> = </span><a href="4-is.html#SP13" class="function-link"><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pv_identifier</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> += </span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">) + </span><span class="constant-syntax">3</span><span class="plain-syntax">;</span>
|
|
|
|
@ -902,8 +1073,8 @@ just <span class="extract"><span class="extract-syntax"><<fish>></sp
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">check_this</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP10">§10</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP10_3"></a><b>§10.3. </b>Similarly for nonterminals; <span class="extract"><span class="extract-syntax"><k-kind></span></span> might become <span class="extract"><span class="extract-syntax">k_kind_NTM</span></span>.
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11">§11</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11_4"></a><b>§11.4. </b>Similarly for nonterminals; <span class="extract"><span class="extract-syntax"><k-kind></span></span> might become <span class="extract"><span class="extract-syntax">k_kind_NTM</span></span>.
|
|
|
|
|
Here, though, there's a complication:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
@ -923,7 +1094,7 @@ of this fairly laxly, but as before: it only needs to work for Inform,
|
|
|
|
|
and Inform doesn't cause any trouble.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Single-angles sometimes delimit Preform nonterminal names</span><span class="named-paragraph-number">10.3</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Single-angles sometimes delimit Preform nonterminal names</span><span class="named-paragraph-number">11.4</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
@ -932,7 +1103,7 @@ and Inform doesn't cause any trouble.
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP26" class="function-link"><span class="function-syntax">Str::substr</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">check_this</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">), </span><a href="../foundation-module/4-sm.html#SP10" class="function-link"><span class="function-syntax">Str::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">));</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">check_this</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(<%p+>)%c*"</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">putative</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax"> = </span><a href="4-is.html#SP11" class="function-link"><span class="function-syntax">InCSupport::nonterminal_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax"> = </span><a href="4-is.html#SP12" class="function-link"><span class="function-syntax">InCSupport::nonterminal_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> += </span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">putative</span><span class="plain-syntax">) - </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">+1) == </span><span class="character-syntax">'('</span><span class="plain-syntax">) {</span>
|
|
|
|
@ -955,15 +1126,15 @@ and Inform doesn't cause any trouble.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">check_this</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP10">§10</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. </b>We needed two little routines to find nonterminals and their variables by
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP11">§11</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>We needed two little routines to find nonterminals and their variables by
|
|
|
|
|
name. They're not very efficient, but experience shows that even on a web
|
|
|
|
|
the size of Inform 7, there's no significant gain from speeding them up
|
|
|
|
|
(with, say, a hash table).
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="function-syntax">InCSupport::nonterminal_by_name</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">InCSupport::nonterminal_by_name</span></span>:<br/><a href="4-is.html#SP10_3">§10.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="function-syntax">InCSupport::nonterminal_by_name</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">InCSupport::nonterminal_by_name</span></span>:<br/><a href="4-is.html#SP11_4">§11.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">-></span><span class="element-syntax">nt_name</span><span class="plain-syntax">))</span>
|
|
|
|
@ -971,14 +1142,14 @@ the size of Inform 7, there's no significant gain from speeding them up
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>The special variables <span class="extract"><span class="extract-syntax"><<R>></span></span> and <span class="extract"><span class="extract-syntax"><<RP>></span></span> hold the results,
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>The special variables <span class="extract"><span class="extract-syntax"><<R>></span></span> and <span class="extract"><span class="extract-syntax"><<RP>></span></span> hold the results,
|
|
|
|
|
integer and pointer, for the most recent successful match. They're defined
|
|
|
|
|
in the Inform 7 web (see the code for parsing text against Preform grammars),
|
|
|
|
|
not by Inweb.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span></span>:<br/><a href="4-is.html#SP10_2">§10.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">InCSupport::nonterminal_variable_identifier</span></span>:<br/><a href="4-is.html#SP11_2_3">§11.2.3</a>, <a href="4-is.html#SP11_3">§11.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP22" class="function-link"><span class="function-syntax">Str::eq_wide_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"r"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"most_recent_result"</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP22" class="function-link"><span class="function-syntax">Str::eq_wide_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"rp"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="string-syntax">"most_recent_result_p"</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">nonterminal_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ntv</span><span class="plain-syntax">;</span>
|
|
|
|
@ -988,7 +1159,7 @@ not by Inweb.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>We saw above that the grammar lines following a non-internal declaration
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b>We saw above that the grammar lines following a non-internal declaration
|
|
|
|
|
were divided into actual grammar, then an arrow, then a formula. The formulae
|
|
|
|
|
were tangled into "composition functions", but the grammar itself was
|
|
|
|
|
simply thrown away. It doesn't appear anywhere in the C code tangled by
|
|
|
|
@ -1001,7 +1172,7 @@ will read in at run-time. This is how that happens:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::additional_tangling</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">InCSupport::additional_tangling</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">tangle_target</span><span class="plain-syntax"> *</span><span class="identifier-syntax">target</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::additional_tangling</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">InCSupport::additional_tangling</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">tangle_target</span><span class="plain-syntax"> *</span><span class="identifier-syntax">target</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax">) > </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="2-tr.html#SP7" class="function-link"><span class="function-syntax">Reader::tangled_folder</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Syntax</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Syntax.preform"</span><span class="plain-syntax">);</span>
|
|
|
|
@ -1018,12 +1189,12 @@ will read in at run-time. This is how that happens:
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/8-bdfw.html#SP6" class="function-link"><span class="function-syntax">Bibliographic::data_exists</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">md</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Preform Language"</span><span class="plain-syntax">))</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"language %S\n"</span><span class="plain-syntax">, </span><a href="../foundation-module/8-bdfw.html#SP6" class="function-link"><span class="function-syntax">Bibliographic::get_datum</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">md</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Preform Language"</span><span class="plain-syntax">));</span>
|
|
|
|
|
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP13_1" class="named-paragraph-link"><span class="named-paragraph">Actually write out the Preform syntax</span><span class="named-paragraph-number">13.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">Actually write out the Preform syntax</span><span class="named-paragraph-number">14.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">STREAM_CLOSE</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP13_1"></a><b>§13.1. </b>See the "English Syntax of Inform" document for a heavily annotated
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP14_1"></a><b>§14.1. </b>See the "English Syntax of Inform" document for a heavily annotated
|
|
|
|
|
form of the result of the following. Note a useful convention: if the
|
|
|
|
|
right-hand side of the arrow in a grammar line uses a paragraph macro which
|
|
|
|
|
mentions a problem message, then we transcribe a Preform comment to that
|
|
|
|
@ -1038,7 +1209,7 @@ file more comprehensible to human eyes.) For example,
|
|
|
|
|
assume.)
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Actually write out the Preform syntax</span><span class="named-paragraph-number">13.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Actually write out the Preform syntax</span><span class="named-paragraph-number">14.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
@ -1063,15 +1234,15 @@ assume.)
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP13">§13</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. Weaving. </b>The following isn't a method, but is called by the weaver directly. It adds
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP14">§14</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. Weaving. </b>The following isn't a method, but is called by the weaver directly. It adds
|
|
|
|
|
additional endnotes to the woven form of a paragraph which includes Preform
|
|
|
|
|
nonterminal definitions; it is meaningful only in the TeX format, and should
|
|
|
|
|
probably be dropped.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::weave_grammar_index</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">InCSupport::weave_grammar_index</span></span>:<br/>TeX Format - <a href="5-tf.html#SP4_32">§4.32</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::weave_grammar_index</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">InCSupport::weave_grammar_index</span></span>:<br/>TeX Format - <a href="5-tf.html#SP4_32">§4.32</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\\raggedright\\tolerance=10000"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pnt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">alphabetical_list_of_nonterminals</span><span class="plain-syntax">; </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">;</span>
|
|
|
|
@ -1082,8 +1253,8 @@ probably be dropped.
|
|
|
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">-></span><span class="element-syntax">as_function</span><span class="plain-syntax">)?</span><span class="string-syntax">" (internal)"</span><span class="plain-syntax">:</span><span class="string-syntax">""</span><span class="plain-syntax">,</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">-></span><span class="element-syntax">where_defined</span><span class="plain-syntax">-></span><span class="element-syntax">owning_section</span><span class="plain-syntax">-></span><span class="element-syntax">md</span><span class="plain-syntax">-></span><span class="element-syntax">sect_range</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">said_something</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP14_2" class="named-paragraph-link"><span class="named-paragraph">List where the nonterminal appears in other Preform declarations</span><span class="named-paragraph-number">14.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">List where the nonterminal is called from Inform code</span><span class="named-paragraph-number">14.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP15_2" class="named-paragraph-link"><span class="named-paragraph">List where the nonterminal appears in other Preform declarations</span><span class="named-paragraph-number">15.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="4-is.html#SP15_1" class="named-paragraph-link"><span class="named-paragraph">List where the nonterminal is called from Inform code</span><span class="named-paragraph-number">15.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">said_something</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\\par\\hangindent=3em{\\it unused}\n\n"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
@ -1092,7 +1263,7 @@ probably be dropped.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\\hrule\\smallbreak\n"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP14_1"></a><b>§14.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">List where the nonterminal is called from Inform code</span><span class="named-paragraph-number">14.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP15_1"></a><b>§15.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">List where the nonterminal is called from Inform code</span><span class="named-paragraph-number">15.1</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
@ -1120,8 +1291,8 @@ probably be dropped.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\n\n"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP14">§14</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP14_2"></a><b>§14.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">List where the nonterminal appears in other Preform declarations</span><span class="named-paragraph-number">14.2</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP15">§15</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP15_2"></a><b>§15.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">List where the nonterminal appears in other Preform declarations</span><span class="named-paragraph-number">15.2</span></span><span class="comment-syntax"> =</span>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
@ -1149,15 +1320,15 @@ probably be dropped.
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\n\n"</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP14">§14</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. Weaving methods. </b>If we're weaving just a document of Preform grammar, then we skip any lines
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-is.html#SP15">§15</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. Weaving methods. </b>If we're weaving just a document of Preform grammar, then we skip any lines
|
|
|
|
|
of C code which appear in <span class="extract"><span class="extract-syntax">internal</span></span> nonterminal definitions:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">skipping_internal</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">preform_production_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
|
|
|
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::skip_in_weaving</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">InCSupport::skip_in_weaving</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">weave_order</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wv</span><span class="plain-syntax">, </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::skip_in_weaving</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">InCSupport::skip_in_weaving</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">weave_order</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wv</span><span class="plain-syntax">, </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Preform_theme</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">wv</span><span class="plain-syntax">-></span><span class="element-syntax">theme_match</span><span class="plain-syntax"> == </span><span class="identifier-syntax">Preform_theme</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"}%c*"</span><span class="plain-syntax">)) {</span>
|
|
|
|
@ -1169,11 +1340,11 @@ of C code which appear in <span class="extract"><span class="extract-syntax">int
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP16"></a><b>§16. </b>And here is the TeX code for displaying Preform grammar:
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. </b>And here is the TeX code for displaying Preform grammar:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::weave_code_line</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">InCSupport::weave_code_line</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">,</span>
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::weave_code_line</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">InCSupport::weave_code_line</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">,</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">weave_order</span><span class="plain-syntax"> *</span><span class="identifier-syntax">wv</span><span class="plain-syntax">, </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">chapter</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">section</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">,</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">matter</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">concluding_comment</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Preform_theme</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">wv</span><span class="plain-syntax">-></span><span class="element-syntax">theme_match</span><span class="plain-syntax"> == </span><span class="identifier-syntax">Preform_theme</span><span class="plain-syntax">))</span>
|
|
|
|
@ -1182,27 +1353,27 @@ of C code which appear in <span class="extract"><span class="extract-syntax">int
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP17"></a><b>§17. </b>In paragraphs where we spot Preform nonterminals being defined, we're
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. </b>In paragraphs where we spot Preform nonterminals being defined, we're
|
|
|
|
|
going to automatically apply the tag <span class="extract"><span class="extract-syntax">^"Preform"</span></span>, but only if it already
|
|
|
|
|
exists. We watch for it here:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::new_tag_declared</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">InCSupport::new_tag_declared</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">theme_tag</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tag</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::new_tag_declared</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">InCSupport::new_tag_declared</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">theme_tag</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tag</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP22" class="function-link"><span class="function-syntax">Str::eq_wide_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">tag</span><span class="plain-syntax">-></span><span class="identifier-syntax">tag_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"Preform"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">Preform_theme</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tag</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP18"></a><b>§18. Analysis methods. </b></p>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP19"></a><b>§19. Analysis methods. </b></p>
|
|
|
|
|
|
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::analyse_code</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">InCSupport::analyse_code</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::analyse_code</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">InCSupport::analyse_code</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">, </span><span class="reserved-syntax">preform_nonterminal</span><span class="plain-syntax">)</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="3-ta.html#SP9" class="function-link"><span class="function-syntax">Analyser::find_hash_entry_for_section</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pnt</span><span class="plain-syntax">-></span><span class="element-syntax">where_defined</span><span class="plain-syntax">-></span><span class="element-syntax">owning_section</span><span class="plain-syntax">,</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pnt</span><span class="plain-syntax">-></span><span class="element-syntax">unangled_name</span><span class="plain-syntax">, </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::share_element</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">InCSupport::share_element</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">elname</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">InCSupport::share_element</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">InCSupport::share_element</span></span>:<br/><a href="4-is.html#SP1">§1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">elname</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP22" class="function-link"><span class="function-syntax">Str::eq_wide_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">elname</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"word_ref1"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP22" class="function-link"><span class="function-syntax">Str::eq_wide_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">elname</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"word_ref2"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP22" class="function-link"><span class="function-syntax">Str::eq_wide_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">elname</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"next"</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
|
|
|