mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 16:44:21 +03:00
730 lines
95 KiB
HTML
730 lines
95 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>21/rl2</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 tools</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 '21/fao' 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">core</a></li><li><a href="index.html#21">Chapter 21: Rules and Rulebooks</a></li><li><b>Focus and Outcome</b></li></ul><p class="purpose">To look after the value or action on which a rulebook acts, and the possible outcomes it produces.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Definitions</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>When a rulebook is being worked through at run-time, a special value or
|
|
situation normally gives it a focus — something to work on. Rulebooks
|
|
can have two types:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(A) Action rulebooks, like "Instead of", which take a pattern match on
|
|
the current action as their focus: for instance, the rule "Instead of
|
|
eating something portable..." is in the "Instead of eating" rulebook but
|
|
uses "something portable" as focus.
|
|
</li></ul>
|
|
<ul class="items"><li>(P) Parametrised rulebooks, like "reaching inside", take (a pattern match
|
|
on) a single parameter as their focus. For instance, "A rule for reaching
|
|
inside the flask..." has the flask as focus.
|
|
</li></ul>
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">ACTION_FOCUS</span><span class="plain"> </span><span class="constant">0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">PARAMETER_FOCUS</span><span class="plain"> </span><span class="constant">1</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">focus</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rulebook_focus</span><span class="plain">; </span><span class="comment">always <code class="display"><span class="extract">ACTION_FOCUS</span></code> or <code class="display"><span class="extract">PARAMETER_FOCUS</span></code></span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_of_parameter</span><span class="plain">; </span><span class="comment">if created as <code class="display"><span class="extract">NO_FOCUS</span></code>, this is <code class="display"><span class="extract">NULL</span></code></span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rules_always_test_actor</span><span class="plain">; </span><span class="comment">for action-tied check, carry out, report</span>
|
|
<span class="plain">} </span><span class="reserved">focus</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure focus is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Each rulebook reaches one of three possible outcomes: success, failure and
|
|
neither (meaning that it proceeded through to the end without any positive
|
|
or negative news arising). If a rule does apply to the current
|
|
circumstances (i.e., if the parameter is matched successfully) then it can
|
|
explicitly choose to produce any of the three outcomes: if it makes no
|
|
decision, the result is that stored in the rulebook's
|
|
<code class="display"><span class="extract">default_rule_outcome</span></code> field. This is how
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Instead of going north, say "The snow is too deep."</p>
|
|
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>Before going north, say "Well, I'll try..."</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">behave differently: the instead rule halts the action, because the instead
|
|
rulebook has a default outcome of <code class="display"><span class="extract">FAILURE_OUTCOME</span></code>; the before rule allows
|
|
it to proceed, because the default is <code class="display"><span class="extract">NO_OUTCOME</span></code>.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">UNRECOGNISED_OUTCOME</span><span class="plain"> -1 </span><span class="comment">used in parsing only</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">NO_OUTCOME</span><span class="plain"> </span><span class="constant">0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">SUCCESS_OUTCOME</span><span class="plain"> </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">FAILURE_OUTCOME</span><span class="plain"> </span><span class="constant">2</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">outcomes</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_outcome_declared</span><span class="plain">; </span><span class="comment">flag: whether author has declared this</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_rule_outcome</span><span class="plain">; </span><span class="comment">success, failure or none: see above</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">default_named_outcome</span><span class="plain">; </span><span class="comment">alternative to the above</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">named_outcomes</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">value_outcome_kind</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">outcomes</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure outcomes is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>However, a rulebook is allowed to give special problem-specific names to
|
|
its outcomes.
|
|
</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">named_rulebook_outcome</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">; </span><span class="comment">Name in source text</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">nro_iname</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">named_rulebook_outcome</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">outcome_name</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kind_of_outcome</span><span class="plain">; </span><span class="comment">one of the three values above</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">rulebook_outcome</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure named_rulebook_outcome is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ef, 9/ma, 9/pk, 11/sm, 14/rv, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 25/cii, 26/uo, 26/ts and here.</p>
|
|
|
|
<p class="endnote">The structure rulebook_outcome is accessed in 3/pd, 5/lp, 5/ut, 5/un, 5/ins, 6/rlt, 6/nv, 7/ns, 7/oaf, 7/rs, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/teav, 10/cap, 11/ap, 11/pr, 11/bas, 11/tc, 11/sm, 12/dtd, 12/cdp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 16/is, 16/in, 19/tb, 19/rsft, 19/tod, 20/eq, 21/rl, 21/rl2, 21/rps, 21/sv, 21/ac, 22/ph, 22/tp, 22/tp2, 23/ad, 24/lv, 24/sf, 25/in, 25/pi, 25/cii, 25/cp, 26/uo, 26/tti, 26/pc, 26/ts, 27/cm and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::initialise_outcomes</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</span><span class="plain">) {</span>
|
|
<span class="identifier">outs</span><span class="plain">-></span><span class="element">value_outcome_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
|
|
<span class="identifier">outs</span><span class="plain">-></span><span class="element">default_outcome_declared</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">outs</span><span class="plain">-></span><span class="element">default_rule_outcome</span><span class="plain"> = </span><span class="identifier">def</span><span class="plain">;</span>
|
|
<span class="identifier">outs</span><span class="plain">-></span><span class="element">default_named_outcome</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::set_default_outcome</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</span><span class="plain">) {</span>
|
|
<span class="identifier">outs</span><span class="plain">-></span><span class="element">default_rule_outcome</span><span class="plain"> = </span><span class="identifier">def</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::get_outcome_kind</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">outs</span><span class="plain">-></span><span class="element">value_outcome_kind</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::initialise_outcomes is used in 21/rl2 (<a href="21-rl2.html#SP10">§10</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::set_default_outcome is used in 21/rl2 (<a href="21-rl2.html#SP10">§10</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::get_outcome_kind is used in 21/rl2 (<a href="21-rl2.html#SP10">§10</a>, <a href="21-rl2.html#SP22">§22</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>There are only three nameless outcomes: a rulebook can end in success, in
|
|
failure, or with no outcome. Any of these can be the default outcome, that is,
|
|
can be what rulebook does if it none of its rules cause an outcome.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">default</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> | ==> </span><<span class="cwebmacro">Make this the rulebook's new default</span> <span class="cwebmacronumber">6.1</span>>
|
|
<span class="plain">... ==> </span><<span class="cwebmacro">Issue PM_BadDefaultOutcome problem</span> <span class="cwebmacronumber">6.2</span>>
|
|
|
|
<span class="plain"><</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> ::=</span>
|
|
<span class="identifier">success</span><span class="plain"> | ==> </span><span class="constant">SUCCESS_OUTCOME</span>
|
|
<span class="identifier">failure</span><span class="plain"> | ==> </span><span class="constant">FAILURE_OUTCOME</span>
|
|
<span class="identifier">no</span><span class="plain"> </span><span class="identifier">outcome</span><span class="plain"> ==> </span><span class="constant">NO_OUTCOME</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Make this the rulebook's new default</span> <span class="cwebmacronumber">6.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_outcome_declared</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefaultOutcomeTwice</span><span class="plain">),</span>
|
|
<span class="string">"the default outcome for this rulebook has already been declared"</span><span class="plain">,</span>
|
|
<span class="string">"and this is something which can only be done once."</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_outcome_declared</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_rule_outcome</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1];</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_2"></a><b>§6.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_BadDefaultOutcome problem</span> <span class="cwebmacronumber">6.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadDefaultOutcome</span><span class="plain">),</span>
|
|
<span class="string">"the default outcome given for the rulebook isn't what I expected"</span><span class="plain">,</span>
|
|
<span class="string">"which would be one of 'default success', 'default failure' or "</span>
|
|
<span class="string">"'default no outcome'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>Rulebooks can alternatively supply any number of named outcomes, though
|
|
each of these still has one of the three results noted above; which will be
|
|
"success" unless it's explicitly given.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The following parses a declaration of named outcomes. For example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>there is sufficient light (failure) and there is insufficient light (success)</p>
|
|
|
|
</blockquote>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ::=</span>
|
|
<span class="plain">... | ==> </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">preform_lookahead_mode</span><span class="plain">; </span><span class="comment">match only when looking ahead</span>
|
|
<span class="plain"><</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">> <</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> | ==> </span><span class="constant">0</span>
|
|
<span class="plain"><</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">> ==> </span><span class="constant">0</span>
|
|
|
|
<span class="plain"><</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">tail</span><span class="plain">> ::=</span>
|
|
<span class="plain">, </span><span class="identifier">_and</span><span class="plain">/</span><span class="identifier">or</span><span class="plain"> <</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> | ==> </span><span class="constant">0</span>
|
|
<span class="identifier">_</span><span class="plain">,/</span><span class="identifier">and</span><span class="plain">/</span><span class="identifier">or</span><span class="plain"> <</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">> ==> </span><span class="constant">0</span>
|
|
|
|
<span class="plain"><</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">-</span><span class="identifier">setting</span><span class="plain">-</span><span class="identifier">entry</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">form</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> ==> </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">preform_lookahead_mode</span><span class="plain">) </span><<span class="cwebmacro">Adopt this new named rule outcome</span> <span class="cwebmacronumber">8.2</span>>
|
|
|
|
<span class="plain"><</span><span class="identifier">form</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( <</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> - </span><span class="identifier">the</span><span class="plain"> </span><span class="reserved">default</span><span class="plain"> ) | ==> </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span>
|
|
<span class="plain">... ( <</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> - </span><span class="reserved">default</span><span class="plain"> ) | ==> </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span>
|
|
<span class="plain">... ( <</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> ) | ==> </span><span class="identifier">R</span><span class="plain">[1]; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span>
|
|
<span class="plain">... ( ... ) | ==> </span><<span class="cwebmacro">Issue PM_BadOutcomeClarification problem</span> <span class="cwebmacronumber">8.1</span>>
|
|
<span class="plain">... ==> </span><span class="constant">SUCCESS_OUTCOME</span><span class="plain">; </span><span class="identifier">default_rbno_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">notable</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">outcomes</span><span class="plain">> ::=</span>
|
|
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">very</span><span class="plain"> </span><span class="identifier">likely</span><span class="plain"> |</span>
|
|
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">likely</span><span class="plain"> |</span>
|
|
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">possible</span><span class="plain"> |</span>
|
|
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">unlikely</span><span class="plain"> |</span>
|
|
<span class="identifier">it</span><span class="plain"> </span><span class="identifier">is</span><span class="plain"> </span><span class="identifier">very</span><span class="plain"> </span><span class="identifier">unlikely</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_1"></a><b>§8.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue PM_BadOutcomeClarification problem</span> <span class="cwebmacronumber">8.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">UNRECOGNISED_OUTCOME</span><span class="plain">;</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadOutcomeClarification</span><span class="plain">),</span>
|
|
<span class="string">"the bracketed clarification isn't what I expected"</span><span class="plain">,</span>
|
|
<span class="string">"which would be one of '(success)', '(failure)' or '(no outcome)'."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8_2"></a><b>§8.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Adopt this new named rule outcome</span> <span class="cwebmacronumber">8.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">form</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rule</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">def</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">default_rbno_flag</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_named_outcome</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefaultNamedOutcomeTwice</span><span class="plain">),</span>
|
|
<span class="string">"at most one of the named outcomes from a rulebook "</span>
|
|
<span class="string">"can be the default"</span><span class="plain">,</span>
|
|
<span class="string">"and here we seem to have two."</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="identifier">def</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_outcome_declared</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefaultOutcomeAlready</span><span class="plain">),</span>
|
|
<span class="string">"the default outcome for this rulebook has already "</span>
|
|
<span class="string">"been declared"</span><span class="plain">,</span>
|
|
<span class="string">"and this is something which can only be done once."</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="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_outcome_declared</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">koo</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1];</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">koo</span><span class="plain"> != </span><span class="constant">UNRECOGNISED_OUTCOME</span><span class="plain">) {</span>
|
|
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain"> = </span><span class="functiontext">Rulebooks::Outcomes::rbno_by_name</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">);</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">, *</span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dup</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="identifier">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-></span><span class="element">next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">) </span><span class="identifier">dup</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">last</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dup</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DuplicateOutcome</span><span class="plain">),</span>
|
|
<span class="string">"this duplicates a previous assignment of the same outcome"</span><span class="plain">,</span>
|
|
<span class="string">"and to the same rulebook."</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">nro</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">nro</span><span class="plain">-></span><span class="element">next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">nro</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain"> = </span><span class="identifier">rbno</span><span class="plain">;</span>
|
|
<span class="identifier">nro</span><span class="plain">-></span><span class="element">kind_of_outcome</span><span class="plain"> = </span><span class="identifier">koo</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">def</span><span class="plain">) </span><span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">default_named_outcome</span><span class="plain"> = </span><span class="identifier">nro</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last</span><span class="plain">) </span><span class="identifier">last</span><span class="plain">-></span><span class="element">next</span><span class="plain"> = </span><span class="identifier">nro</span><span class="plain">; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">outcomes_being_parsed</span><span class="plain">-></span><span class="element">named_outcomes</span><span class="plain"> = </span><span class="identifier">nro</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP8">§8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>This family of constants (named rulebook outcomes) is special because it
|
|
can be used in a void context as a sort of return-from-rule phrase.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">named</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="identifier">outcome</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">ExParser::parse_excerpt</span><span class="plain">(</span><span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">K_rulebook_outcome</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">Rvalues::to_named_rulebook_outcome</span><span class="plain">(</span><span class="identifier">p</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::rbno_by_name</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="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">ExParser::parse_excerpt</span><span class="plain">(</span><span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">K_rulebook_outcome</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Rvalues::to_named_rulebook_outcome</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Hierarchy::local_package</span><span class="plain">(</span><span class="constant">OUTCOMES_HAP</span><span class="plain">);</span>
|
|
<span class="functiontext">Hierarchy::markup_wording</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="constant">OUTCOME_NAME_HMD</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">rbno</span><span class="plain">-></span><span class="element">name</span><span class="plain"> = </span><span class="identifier">Nouns::new_proper_noun</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">NEUTER_GENDER</span><span class="plain">,</span>
|
|
<span class="identifier">REGISTER_SINGULAR_NTOPT</span><span class="plain"> + </span><span class="identifier">PARSE_EXACTLY_NTOPT</span><span class="plain">,</span>
|
|
<span class="identifier">MISCELLANEOUS_MC</span><span class="plain">, </span><span class="functiontext">Rvalues::from_named_rulebook_outcome</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">));</span>
|
|
<span class="identifier">rbno</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="constant">OUTCOME_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">notable</span><span class="plain">-</span><span class="reserved">rulebook</span><span class="plain">-</span><span class="reserved">outcomes</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = -1;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>>) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO4_INAME_HL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO3_INAME_HL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO2_INAME_HL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO1_INAME_HL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">4</span><span class="plain">: </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">RBNO0_INAME_HL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="functiontext">Emit::named_iname_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rbno</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::compile_default_outcome</span><span class="plain">(</span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rtrue</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbo</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-></span><span class="element">default_named_outcome</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rbo</span><span class="plain">) {</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">rbo</span><span class="plain">-></span><span class="element">kind_of_outcome</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKSUCCEEDS_HL</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbo</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">rtrue</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKFAILS_HL</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbo</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">rtrue</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">outs</span><span class="plain">-></span><span class="element">default_rule_outcome</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKSUCCEEDS_HL</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">rtrue</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKFAILS_HL</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">rtrue</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rtrue</span><span class="plain">) </span><span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::rbo_from_context</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">) {</span>
|
|
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="identifier">phrase_being_compiled</span><span class="plain">;</span>
|
|
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
|
|
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain"> = </span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-></span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-></span><span class="element">next</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_contains_ph</span><span class="plain">(</span><span class="functiontext">Rulebooks::first_booking</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">), </span><span class="identifier">ph</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</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">rulebook</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::allow_outcome</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Phrases::Context::outcome_restrictions_waived</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">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain"> = </span><span class="identifier">phrase_being_compiled</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
|
|
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain"> = </span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Rules::Bookings::list_contains_ph</span><span class="plain">(</span><span class="functiontext">Rulebooks::first_booking</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">), </span><span class="identifier">ph</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">okay</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-></span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-></span><span class="element">next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">)</span>
|
|
<span class="identifier">okay</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">okay</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">rb</span><span class="plain">;</span>
|
|
<span class="plain">}</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">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::compile_outcome</span><span class="plain">(</span><span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">) {</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbo</span><span class="plain"> = </span><span class="functiontext">Rulebooks::Outcomes::rbo_from_context</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rbo</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="reserved">rulebook</span><span class="plain"> *</span><span class="identifier">rb</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">, </span><span class="reserved">rulebook</span><span class="plain">) {</span>
|
|
<span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain"> = </span><span class="functiontext">Rulebooks::get_outcomes</span><span class="plain">(</span><span class="identifier">rb</span><span class="plain">);</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-></span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-></span><span class="element">next</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain"> == </span><span class="identifier">rbno</span><span class="plain">) {</span>
|
|
<span class="identifier">rbo</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rbo</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"rbno with no rb context"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">rbo</span><span class="plain">-></span><span class="element">kind_of_outcome</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKSUCCEEDS_HL</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</span><span class="plain"> {</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">RULEBOOKFAILS_HL</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="functiontext">Kinds::RunTime::emit_weak_id_as_val</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rtrue</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NO_OUTCOME:</span>
|
|
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span>
|
|
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad RBO outcome kind"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::index_outcomes</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">outcomes</span><span class="plain"> *</span><span class="identifier">outs</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_outcome</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suppress_outcome</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="reserved">rulebook_outcome</span><span class="plain"> *</span><span class="identifier">ro</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">outs</span><span class="plain">-></span><span class="element">named_outcomes</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain">; </span><span class="identifier">ro</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-></span><span class="element">next</span><span class="plain">) {</span>
|
|
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain"> = </span><span class="identifier">ro</span><span class="plain">-></span><span class="element">outcome_name</span><span class="plain">;</span>
|
|
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="string">"hanging"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<i>outcome</i>&nbsp;&nbsp;"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outs</span><span class="plain">-></span><span class="identifier">default_named_outcome</span><span class="plain"> == </span><span class="identifier">ro</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<b>"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Nouns::nominative</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">name</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outs</span><span class="plain">-></span><span class="identifier">default_named_outcome</span><span class="plain"> == </span><span class="identifier">ro</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</b> (default)"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" - <i>"</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">ro</span><span class="plain">-></span><span class="identifier">kind_of_outcome</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"a success"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"a failure"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NO_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"no outcome"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</i>"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">outs</span><span class="plain">-></span><span class="identifier">default_named_outcome</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">outs</span><span class="plain">-></span><span class="element">default_rule_outcome</span><span class="plain"> != </span><span class="constant">NO_OUTCOME</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">suppress_outcome</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">HTMLFiles::open_para</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="string">"hanging"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<i>default outcome is</i> "</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">outs</span><span class="plain">-></span><span class="element">default_rule_outcome</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUCCESS_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"success"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAILURE_OUTCOME:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"failure"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::RulebookOutcomePrintingRule</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">, </span><span class="reserved">named_rulebook_outcome</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">RV</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">RV</span><span class="plain">, </span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">Nouns::nominative</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">name</span><span class="plain">));</span>
|
|
<span class="functiontext">Emit::named_string_constant</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">nro_iname</span><span class="plain">, </span><span class="identifier">RV</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">RV</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">printing_rule_name</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_iname</span><span class="plain">(</span><span class="identifier">K_rulebook_outcome</span><span class="plain">);</span>
|
|
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">printing_rule_name</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rbnov_s</span><span class="plain"> = </span><span class="functiontext">LocalVariables::add_named_call_as_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"rbno"</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">IFELSE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">EQ_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbnov_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"(no outcome)"</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINTSTRING_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_symbol</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">rbnov_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
|
|
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::get_default_value</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">named_rulebook_outcome</span><span class="plain"> *</span><span class="identifier">rbno</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">rbno</span><span class="plain">, </span><span class="reserved">named_rulebook_outcome</span><span class="plain">)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rbno</span><span class="plain">-></span><span class="element">nro_iname</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::rbno_by_name is used in <a href="#SP8_2">§8.2</a>.</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::compile_default_outcome is used in 22/prcd (<a href="22-prcd.html#SP10_1">§10.1</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::rbo_from_context appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::allow_outcome is used in 25/cp (<a href="25-cp.html#SP5_3_3">§5.3.3</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::compile_outcome is used in 25/cp (<a href="25-cp.html#SP5_3_3">§5.3.3</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::index_outcomes is used in 21/rl2 (<a href="21-rl2.html#SP15">§15</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::RulebookOutcomePrintingRule is used in 1/htc (<a href="1-htc.html#SP2_7">§2.7</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::get_default_value is used in 13/rsfk (<a href="13-rsfk.html#SP5">§5</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::initialise_focus</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">parameter_kind</span><span class="plain">) {</span>
|
|
<span class="identifier">foc</span><span class="plain">-></span><span class="element">rules_always_test_actor</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parametrisation</span><span class="plain"> = </span><span class="constant">PARAMETER_FOCUS</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">parameter_kind</span><span class="plain">, </span><span class="identifier">K_action_name</span><span class="plain">)) </span><span class="identifier">parametrisation</span><span class="plain"> = </span><span class="constant">ACTION_FOCUS</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Behaviour::definite</span><span class="plain">(</span><span class="identifier">parameter_kind</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_RulebookIndefinite</span><span class="plain">),</span>
|
|
<span class="string">"this is a rulebook for values of a kind which isn't definite"</span><span class="plain">,</span>
|
|
<span class="string">"and doesn't tell me enough about what sort of value the rulebook "</span>
|
|
<span class="string">"should work on. For example, 'The mystery rules are a number based "</span>
|
|
<span class="string">"rulebook' is fine because 'number' is definite, but 'The mystery "</span>
|
|
<span class="string">"rules are a value based rulebook' is too vague."</span><span class="plain">);</span>
|
|
<span class="identifier">parameter_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">foc</span><span class="plain">-></span><span class="element">kind_of_parameter</span><span class="plain"> = </span><span class="identifier">parameter_kind</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">foc</span><span class="plain">-></span><span class="element">rulebook_focus</span><span class="plain"> = </span><span class="identifier">parametrisation</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::initialise_focus is used in 21/rl2 (<a href="21-rl2.html#SP10">§10</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::modify_rule_to_suit_focus</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">, </span><span class="reserved">rule</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">foc</span><span class="plain">-></span><span class="element">rules_always_test_actor</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">,</span>
|
|
<span class="string">"Setting always test actor for destination rulebook\n"</span><span class="plain">);</span>
|
|
<span class="functiontext">Rules::set_always_test_actor</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">foc</span><span class="plain">-></span><span class="element">rulebook_focus</span><span class="plain"> == </span><span class="constant">PARAMETER_FOCUS</span><span class="plain">){</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">RULE_ATTACHMENTS</span><span class="plain">,</span>
|
|
<span class="string">"Setting never test actor for destination rulebook\n"</span><span class="plain">);</span>
|
|
<span class="functiontext">Rules::set_never_test_actor</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::get_focus</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">foc</span><span class="plain">-></span><span class="element">rulebook_focus</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="functiontext">Rulebooks::Outcomes::get_focus_parameter_kind</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">) {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">foc</span><span class="plain">-></span><span class="element">kind_of_parameter</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Rulebooks::Outcomes::set_focus_ata</span><span class="plain">(</span><span class="reserved">focus</span><span class="plain"> *</span><span class="identifier">foc</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">ata</span><span class="plain">) {</span>
|
|
<span class="identifier">foc</span><span class="plain">-></span><span class="element">rules_always_test_actor</span><span class="plain"> = </span><span class="identifier">ata</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::modify_rule_to_suit_focus is used in 21/rl2 (<a href="21-rl2.html#SP19">§19</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::get_focus is used in 21/rl2 (<a href="21-rl2.html#SP12">§12</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::get_focus_parameter_kind is used in 21/rl2 (<a href="21-rl2.html#SP12">§12</a>).</p>
|
|
|
|
<p class="endnote">The function Rulebooks::Outcomes::set_focus_ata is used in 21/rl2 (<a href="21-rl2.html#SP10">§10</a>).</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="21-rl2.html">Back to 'Rulebooks'</a></li><li><a href="21-rps.html">Continue with 'Rule Placement Sentences'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|