1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/supervisor-module/6-cs.html

323 lines
41 KiB
HTML
Raw Normal View History

2020-03-11 02:21:09 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-14 19:56:54 +03:00
<title>Control Structures</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-03-11 02:21:09 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-14 19:56:54 +03:00
2020-03-11 02:21:09 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
2020-04-14 19:56:54 +03:00
<h1><a href="../index.html">
<img src="../docs-src/Figures/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Compiler Webs</h2><ul>
2020-03-19 02:11:25 +02:00
<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>
2020-04-14 19:56:54 +03:00
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="index.html"><span class="selectedlink">supervisor</span></a></li>
</ul><h2>Inform7 Modules</h2><ul>
2020-03-19 02:11:25 +02:00
<li><a href="../core-module/index.html">core</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>
2020-04-14 19:56:54 +03:00
<li><a href="../problems-module/index.html">problems</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../index-module/index.html">index</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
2020-04-14 19:56:54 +03:00
</ul><h2>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
2020-04-14 19:56:54 +03:00
</ul>
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2020-04-14 19:56:54 +03:00
<!--Weave of 'Control Structures' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inbuild Modules</a></li><li><a href="index.html">supervisor</a></li><li><a href="index.html#6">Chapter 6: 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>
2020-03-11 02:21:09 +02:00
<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">
2020-04-14 19:56:54 +03:00
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="functiontext">ControlStructures::new<button class="popup" onclick="togglePopup('usagePopup344')">...<span class="popuptext" id="usagePopup344">Usage of <b>ControlStructures::new</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-07 03:06:09 +03:00
<span class="identifier">csp</span><span class="plain">-&gt;</span><span class="element">subordinate_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-&gt;</span><span class="element">indent_subblocks</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">csp</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">used_at_stage</span><span class="plain"> = -1;</span>
<span class="identifier">csp</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">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">-&gt;</span><span class="element">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">-&gt;</span><span class="element">is_a_loop</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">csp</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ControlStructures::create_standard<button class="popup" onclick="togglePopup('usagePopup345')">...<span class="popuptext" id="usagePopup345">Usage of <b>ControlStructures::create_standard</b>:<br>Inbuild Control - <a href="1-ic.html#SP3">&#167;3</a></span></button></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"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">switch_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">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">-&gt;</span><span class="element">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">-&gt;</span><span class="element">keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"if"</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">if_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">if_CSP</span><span class="plain">-&gt;</span><span class="element">keyword</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"if"</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">repeat_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">repeat_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">is_a_loop</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">while_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">while_CSP</span><span class="plain">-&gt;</span><span class="identifier">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">-&gt;</span><span class="identifier">is_a_loop</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">otherwise_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">otherwise_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">used_at_stage</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">abbreviated_otherwise_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">abbreviated_otherwise_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">used_at_stage</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">otherwise_if_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">otherwise_if_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">used_at_stage</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">case_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">case_CSP</span><span class="plain">-&gt;</span><span class="identifier">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">-&gt;</span><span class="identifier">used_at_stage</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">case_CSP</span><span class="plain">-&gt;</span><span class="identifier">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">-&gt;</span><span class="identifier">allow_run_on</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">default_case_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">default_case_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">used_at_stage</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
<span class="identifier">default_case_CSP</span><span class="plain">-&gt;</span><span class="element">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">-&gt;</span><span class="element">allow_run_on</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">say_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">now_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">instead_CSP</span><span class="plain"> = </span><span class="functiontext"><a href="6-cs.html#SP3">ControlStructures::new</a></span><span class="plain">();</span>
2020-03-11 02:21:09 +02:00
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ControlStructures::log<button class="popup" onclick="togglePopup('usagePopup346')">...<span class="popuptext" id="usagePopup346">Usage of <b>ControlStructures::log</b>:<br>none</span></button></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>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::comma_possible<button class="popup" onclick="togglePopup('usagePopup347')">...<span class="popuptext" id="usagePopup347">Usage of <b>ControlStructures::comma_possible</b>:<br>none</span></button></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>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::is_a_loop<button class="popup" onclick="togglePopup('usagePopup348')">...<span class="popuptext" id="usagePopup348">Usage of <b>ControlStructures::is_a_loop</b>:<br>none</span></button></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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</span><span class="element">is_a_loop</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::opens_block<button class="popup" onclick="togglePopup('usagePopup349')">...<span class="popuptext" id="usagePopup349">Usage of <b>ControlStructures::opens_block</b>:<br>none</span></button></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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</span><span class="element">subordinate_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp;</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::permits_break<button class="popup" onclick="togglePopup('usagePopup350')">...<span class="popuptext" id="usagePopup350">Usage of <b>ControlStructures::permits_break</b>:<br>none</span></button></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>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">ControlStructures::incipit<button class="popup" onclick="togglePopup('usagePopup351')">...<span class="popuptext" id="usagePopup351">Usage of <b>ControlStructures::incipit</b>:<br>none</span></button></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>
2020-04-07 03:06:09 +03:00
<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">-&gt;</span><span class="element">keyword</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="functiontext">ControlStructures::detect<button class="popup" onclick="togglePopup('usagePopup352')">...<span class="popuptext" id="usagePopup352">Usage of <b>ControlStructures::detect</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ControlStructures::abbreviated_otherwise<button class="popup" onclick="togglePopup('usagePopup353')">...<span class="popuptext" id="usagePopup353">Usage of <b>ControlStructures::abbreviated_otherwise</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-14 19:56:54 +03:00
<span class="reserved">control_structure_phrase</span><span class="plain"> *</span><span class="functiontext">ControlStructures::detect_end<button class="popup" onclick="togglePopup('usagePopup354')">...<span class="popuptext" id="usagePopup354">Usage of <b>ControlStructures::detect_end</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<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="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">
2020-04-07 03:06:09 +03:00
<span class="definitionkeyword">define</span> <span class="constant">NO_SIGF</span><span class="plain"> </span><span class="constant">0</span>
<span class="definitionkeyword">define</span> <span class="constant">SAY_SIGF</span><span class="plain"> </span><span class="constant">1</span>
<span class="definitionkeyword">define</span> <span class="constant">NOW_SIGF</span><span class="plain"> </span><span class="constant">2</span>
2020-03-11 02:21:09 +02:00
</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>
2020-04-07 03:06:09 +03:00
<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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">default_case_CSP</span>
<span class="plain">-- ... ==&gt; </span><span class="constant">0</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">case_CSP</span>
2020-03-11 02:21:09 +02:00
<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>
2020-04-07 03:06:09 +03:00
<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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</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; </span><span class="constant">0</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">repeat_CSP</span>
2020-03-11 02:21:09 +02:00
<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-->
2020-04-14 19:56:54 +03:00
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-03-19 02:11:25 +02:00
</main>
2020-03-11 02:21:09 +02:00
</body>
</html>