1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/inbuild-module/6-cs.html
2020-03-22 10:50:19 +00:00

352 lines
38 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>6/inc</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler</b></a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '6/cs' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#6">Chapter 6: Handling Inform Source Text</a></li><li><b>Control Structures</b></li></ul><p class="purpose">To specify the syntax of control structures such as repeat, if and otherwise.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Certain phrases are "structural": otherwise, if, repeat, while and so
on. These have different expectations in terms of the layout of surrounding
phrases in rule or phrase definitions, and the following structure defines
the relevant behaviour. (The contents are static.)
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">control_structure_phrase</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">subordinate_to</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">indent_subblocks</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">body_empty_except_for_subordinates</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">used_at_stage</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_a_loop</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">requires_new_syntax</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_run_on</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">keyword</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">control_structure_phrase</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure control_structure_phrase is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The following set is built in to the Inform language; Basic Inform and such
extensions cannot extend it.
</p>
<pre class="display">
<span class="reserved">control_structure_phrase</span>
<span class="plain">*</span><span class="identifier">switch_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">if_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">repeat_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">while_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">otherwise_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">abbreviated_otherwise_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">otherwise_if_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">default_case_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">case_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">say_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">now_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">,</span>
<span class="plain">*</span><span class="identifier">instead_CSP</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The following functions attempt to contain information about the
basic structural phrases in one place, so that if future loop constructs
are added, they can fairly simply be put here.
</p>
<pre class="display">
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="functiontext">ControlStructures::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain">);</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;indent_subblocks</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;body_empty_except_for_subordinates</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;used_at_stage</span><span class="plain"> = -1;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;requires_new_syntax</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;allow_run_on</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"&lt;none&gt;"</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;is_a_loop</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">csp</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ControlStructures::create_standard</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">switch_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">switch_CSP</span><span class="plain">-</span><span class="element">&gt;body_empty_except_for_subordinates</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">switch_CSP</span><span class="plain">-</span><span class="element">&gt;indent_subblocks</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">switch_CSP</span><span class="plain">-</span><span class="element">&gt;requires_new_syntax</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">switch_CSP</span><span class="plain">-</span><span class="element">&gt;keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"if"</span><span class="plain">;</span>
<span class="identifier">if_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">if_CSP</span><span class="plain">-</span><span class="element">&gt;keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"if"</span><span class="plain">;</span>
<span class="identifier">repeat_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">repeat_CSP</span><span class="plain">-</span><span class="element">&gt;keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"repeat"</span><span class="plain">;</span>
<span class="identifier">repeat_CSP</span><span class="plain">-</span><span class="element">&gt;is_a_loop</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">while_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">while_CSP</span><span class="plain">-</span><span class="element">&gt;keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"while"</span><span class="plain">;</span>
<span class="identifier">while_CSP</span><span class="plain">-</span><span class="element">&gt;is_a_loop</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">otherwise_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">otherwise_CSP</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> = </span><span class="identifier">if_CSP</span><span class="plain">;</span>
<span class="identifier">otherwise_CSP</span><span class="plain">-</span><span class="element">&gt;used_at_stage</span><span class="plain"> = 1;</span>
<span class="identifier">abbreviated_otherwise_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">abbreviated_otherwise_CSP</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> = </span><span class="identifier">if_CSP</span><span class="plain">;</span>
<span class="identifier">abbreviated_otherwise_CSP</span><span class="plain">-</span><span class="element">&gt;used_at_stage</span><span class="plain"> = 1;</span>
<span class="identifier">otherwise_if_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">otherwise_if_CSP</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> = </span><span class="identifier">if_CSP</span><span class="plain">;</span>
<span class="identifier">otherwise_if_CSP</span><span class="plain">-</span><span class="element">&gt;used_at_stage</span><span class="plain"> = 0;</span>
<span class="identifier">case_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">case_CSP</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> = </span><span class="identifier">switch_CSP</span><span class="plain">;</span>
<span class="identifier">case_CSP</span><span class="plain">-</span><span class="element">&gt;used_at_stage</span><span class="plain"> = 1;</span>
<span class="identifier">case_CSP</span><span class="plain">-</span><span class="element">&gt;requires_new_syntax</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">case_CSP</span><span class="plain">-</span><span class="element">&gt;allow_run_on</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">default_case_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">default_case_CSP</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> = </span><span class="identifier">switch_CSP</span><span class="plain">;</span>
<span class="identifier">default_case_CSP</span><span class="plain">-</span><span class="element">&gt;used_at_stage</span><span class="plain"> = 2;</span>
<span class="identifier">default_case_CSP</span><span class="plain">-</span><span class="element">&gt;requires_new_syntax</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">default_case_CSP</span><span class="plain">-</span><span class="element">&gt;allow_run_on</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">say_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">now_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="identifier">instead_CSP</span><span class="plain"> = </span><span class="functiontext">ControlStructures::new</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ControlStructures::log</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">if_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"IF"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">repeat_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"RPT"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">while_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"WHI"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">switch_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"SWI"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">otherwise_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"O"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">abbreviated_otherwise_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AO"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">otherwise_if_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"OIF"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">case_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"CAS"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">default_case_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"DEF"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">say_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"SAY"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">now_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NOW"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">instead_CSP</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"INS"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"---"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::comma_possible</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">if_CSP</span><span class="plain">) || (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">switch_CSP</span><span class="plain">) || (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">otherwise_if_CSP</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::is_a_loop</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;is_a_loop</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::opens_block</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">csp</span><span class="plain">) &amp;&amp; (</span><span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;subordinate_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">csp</span><span class="plain"> != </span><span class="identifier">say_CSP</span><span class="plain">) &amp;&amp; (</span><span class="identifier">csp</span><span class="plain"> != </span><span class="identifier">now_CSP</span><span class="plain">) &amp;&amp; (</span><span class="identifier">csp</span><span class="plain"> != </span><span class="identifier">instead_CSP</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::permits_break</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">repeat_CSP</span><span class="plain">) || (</span><span class="identifier">csp</span><span class="plain"> == </span><span class="identifier">while_CSP</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">ControlStructures::incipit</span><span class="plain">(</span><span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="identifier">csp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">csp</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">csp</span><span class="plain">-</span><span class="element">&gt;keyword</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="string">"&lt;none&gt;"</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="functiontext">ControlStructures::detect</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">control</span><span class="plain">-</span><span class="identifier">structure</span><span class="plain">-</span><span class="identifier">phrase</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt; == </span><span class="identifier">abbreviated_otherwise_CSP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::abbreviated_otherwise</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">control</span><span class="plain">-</span><span class="identifier">structure</span><span class="plain">-</span><span class="identifier">phrase</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt; == </span><span class="identifier">abbreviated_otherwise_CSP</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="functiontext">ControlStructures::detect_end</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">end</span><span class="plain">-</span><span class="identifier">control</span><span class="plain">-</span><span class="identifier">structure</span><span class="plain">-</span><span class="identifier">phrase</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function ControlStructures::new appears nowhere else.</p>
<p class="endnote">The function ControlStructures::create_standard is used in 1/im (<a href="1-im.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function ControlStructures::log appears nowhere else.</p>
<p class="endnote">The function ControlStructures::comma_possible appears nowhere else.</p>
<p class="endnote">The function ControlStructures::is_a_loop appears nowhere else.</p>
<p class="endnote">The function ControlStructures::opens_block appears nowhere else.</p>
<p class="endnote">The function ControlStructures::permits_break appears nowhere else.</p>
<p class="endnote">The function ControlStructures::incipit appears nowhere else.</p>
<p class="endnote">The function ControlStructures::detect appears nowhere else.</p>
<p class="endnote">The function ControlStructures::abbreviated_otherwise appears nowhere else.</p>
<p class="endnote">The function ControlStructures::detect_end appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Control structures such as "if" act as a sort of super-punctuation inside
rule and phrase definitions, and in particular they affect the actual
punctuation of the sentences there (consider the rules about colons versus
semicolons). So, though it's still early in Inform's run, we need to seek
them out.
</p>
<p class="inwebparagraph">Here we parse the text of a command phrase which, if any, of the control
structures it might be. Note that &lt;s-command&gt; has a grammar partially
overlapping with this, and they need to match.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NO_SIGF</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">SAY_SIGF</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">NOW_SIGF</span><span class="plain"> 2</span>
</pre>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">control</span><span class="plain">-</span><span class="identifier">structure</span><span class="plain">-</span><span class="identifier">phrase</span><span class="plain">&gt; ::=</span>
<span class="reserved">if</span><span class="plain"> ... </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">begin</span><span class="plain"> | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">switch_CSP</span>
<span class="reserved">if</span><span class="plain"> ... </span><span class="identifier">is</span><span class="plain"> | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">switch_CSP</span>
<span class="reserved">if</span><span class="plain">/</span><span class="identifier">unless</span><span class="plain"> ... | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">if_CSP</span>
<span class="identifier">repeat</span><span class="plain"> ... | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">repeat_CSP</span>
<span class="reserved">while</span><span class="plain"> ... | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">while_CSP</span>
<span class="reserved">else</span><span class="plain">/</span><span class="identifier">otherwise</span><span class="plain"> | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">otherwise_CSP</span>
<span class="reserved">else</span><span class="plain">/</span><span class="identifier">otherwise</span><span class="plain"> </span><span class="reserved">if</span><span class="plain">/</span><span class="identifier">unless</span><span class="plain"> ... | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">otherwise_if_CSP</span>
<span class="reserved">else</span><span class="plain">/</span><span class="identifier">otherwise</span><span class="plain"> ... | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">abbreviated_otherwise_CSP</span>
<span class="plain">-- </span><span class="identifier">otherwise</span><span class="plain"> | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">default_case_CSP</span>
<span class="plain">-- ... ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">case_CSP</span>
<span class="plain">&lt;</span><span class="identifier">end</span><span class="plain">-</span><span class="identifier">control</span><span class="plain">-</span><span class="identifier">structure</span><span class="plain">-</span><span class="identifier">phrase</span><span class="plain">&gt; ::=</span>
<span class="identifier">end</span><span class="plain"> </span><span class="reserved">if</span><span class="plain">/</span><span class="identifier">unless</span><span class="plain"> | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">if_CSP</span>
<span class="identifier">end</span><span class="plain"> </span><span class="reserved">while</span><span class="plain"> | ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">while_CSP</span>
<span class="identifier">end</span><span class="plain"> </span><span class="identifier">repeat</span><span class="plain"> ==&gt; 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">repeat_CSP</span>
<span class="plain">&lt;</span><span class="identifier">other</span><span class="plain">-</span><span class="identifier">significant</span><span class="plain">-</span><span class="identifier">phrase</span><span class="plain">&gt; ::=</span>
<span class="identifier">say</span><span class="plain"> ... | ==&gt; </span><span class="constant">SAY_SIGF</span>
<span class="identifier">now</span><span class="plain"> ... ==&gt; </span><span class="constant">NOW_SIGF</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>This is used to see if an "if" is being used with the comma notation:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">phrase</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">comma</span><span class="plain">-</span><span class="identifier">notation</span><span class="plain">&gt; ::=</span>
<span class="plain">...... , ......</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>This is used to see if an "if" is being used with the comma notation:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">instead</span><span class="plain">-</span><span class="identifier">keyword</span><span class="plain">&gt; ::=</span>
<span class="identifier">instead</span><span class="plain"> ... |</span>
<span class="plain">... </span><span class="identifier">instead</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Finally, this is used to see if a control structure opens a block:
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">phrase</span><span class="plain">-</span><span class="identifier">beginning</span><span class="plain">-</span><span class="identifier">block</span><span class="plain">&gt; ::=</span>
<span class="plain">... </span><span class="identifier">begin</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="6-inc.html">Back to 'Inclusions'</a></li><li><a href="6-vmg.html">Continue with 'Virtual Machine Grammar'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>