mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 08:34:22 +03:00
2871 lines
471 KiB
HTML
2871 lines
471 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>4/anl</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html"><b>compiler</b></a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul>
|
|
<h2>Compiler Webs</h2>
|
|
<ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul>
|
|
<h2>Inbuild Modules</h2>
|
|
<ul>
|
|
<li><a href="../inbuild-module/index.html">inbuild</a></li>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
</ul>
|
|
<h2>Inform7 Modules</h2>
|
|
<ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul>
|
|
<h2>Inter Modules</h2>
|
|
<ul>
|
|
<li><a href="../inter-module/index.html">inter</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of '4/ap' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler</a></li><li><a href="index.html">if</a></li><li><a href="index.html#4">Chapter 4: Actions</a></li><li><b>Action Patterns</b></li></ul><p class="purpose">An action pattern is a description which may match many actions or none. The text "doing something" matches every action, while "throwing something at a door in a dark room" is seldom matched. Here we parse such text into a data structure called an |action_pattern|.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Definitions</a></li><li><a href="#SP27">§27. Action pattern specificity</a></li><li><a href="#SP29">§29. Compiling action tries</a></li><li><a href="#SP31">§31. Compiling action patterns</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>Action patterns are essentially a conjunction of specifications — the
|
|
action must be this, and the noun must be that, and... While
|
|
they allow disjunction in the choice of action, all of that code is a
|
|
matter for the action name list to handle. The AP structure is a list
|
|
of conditions all of which must apply at once.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">One surprising point is that the AP is used not only for action
|
|
patterns, but also in a slightly generalised role, as the condition
|
|
for a rule to be applied. Most rules are indeed predicated on actions
|
|
— "instead of eating the cake" — but some are instead in
|
|
"parametrised" rulebooks, which means they apply to a parameter
|
|
object instead of an action — "reaching inside the cabinet". These
|
|
not-really-action APs are used in no other context, and employ the
|
|
<code class="display"><span class="extract">parameter_spec</span></code> field below, ignoring the rest.
|
|
</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">action_pattern</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">text_of_pattern</span><span class="plain">; </span> <span class="comment">text giving rise to this AP</span>
|
|
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">action</span><span class="plain">; </span> <span class="comment">what the behaviour is</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">test_anl</span><span class="plain">; </span> <span class="comment">actually test the action when compiled</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">applies_to_any_actor</span><span class="plain">; </span> <span class="comment">treat player and other people equally</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">request</span><span class="plain">; </span> <span class="comment">a request from the player for someone to do this?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">actor_spec</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">noun_spec</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">noun_any</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">second_spec</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">second_any</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">presence_spec</span><span class="plain">; </span> <span class="comment">in the presence of...</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">room_spec</span><span class="plain">; </span> <span class="comment">in...</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">room_any</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">when</span><span class="plain">; </span> <span class="comment">when... (any condition here)</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">from_spec</span><span class="plain">; </span> <span class="comment">for the "going" action only</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">to_spec</span><span class="plain">; </span> <span class="comment">ditto</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">by_spec</span><span class="plain">; </span> <span class="comment">ditto</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">through_spec</span><span class="plain">; </span> <span class="comment">ditto</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">pushing_spec</span><span class="plain">; </span> <span class="comment">ditto</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">nowhere_flag</span><span class="plain">; </span> <span class="comment">ditto: a flag for "going nowhere"</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">optional_clauses</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chief_action_owner_id</span><span class="plain">; </span> <span class="comment">stacked variable ID number of main action</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">time_period</span><span class="plain"> </span><span class="identifier">duration</span><span class="plain">; </span> <span class="comment">to hold "for the third time", etc.</span>
|
|
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">parameter_spec</span><span class="plain">; </span> <span class="comment">alternatively, just this</span>
|
|
<span class="reserved">struct</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="comment">of this expected kind</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">valid</span><span class="plain">; </span> <span class="comment">recording success or failure in parsing to an AP</span>
|
|
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">entered_into_NAP_here</span><span class="plain">; </span> <span class="comment">sentence adding it to named behaviour</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">; </span> <span class="comment">for forming APs into linked lists</span>
|
|
<span class="plain">} </span><span class="reserved">action_pattern</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">ap_optional_clause</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">stacked_variable</span><span class="plain"> *</span><span class="identifier">stv_to_match</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">clause_spec</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_region_as_room</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">next</span><span class="plain">;</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">ap_optional_clause</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure action_pattern is accessed in 2/ri, 3/em, 3/scn, 3/tm2, 3/ts, 4/act, 4/anl, 4/nap, 5/tfg, 5/gl and here.</p>
|
|
|
|
<p class="endnote">The structure ap_optional_clause is accessed in 2/ri, 3/em, 3/scn, 3/tm2, 3/ts, 4/act, 4/anl, 4/nap, 5/tfg, 5/gl and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>When we parse action patterns, we record why they fail, in order to make
|
|
it easier to produce helpful error messages. (We can't simply fire off
|
|
errors at the time they occur, because text is often parsed in several
|
|
contexts at once, so just because it fails this one does not mean it is
|
|
wrong.) PAPF stands for "parse action pattern failure".
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MISC_PAPF</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">NOPARTICIPLE_PAPF</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">MIXEDNOUNS_PAPF</span><span class="plain"> 3</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">WHEN_PAPF</span><span class="plain"> 4</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">WHENOKAY_PAPF</span><span class="plain"> 5</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">IMMISCIBLE_PAPF</span><span class="plain"> 6</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pap_failure_reason</span><span class="plain">; </span> <span class="comment">one of the above</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">permit_trying_omission</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span> <span class="comment">allow the keyword 'trying' to be omitted</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">permit_nonconstant_action_parameters</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>NB: Next time this is rewritten - (1) handle in, in the presence of, with
|
|
STV clauses; (2) get this right:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"> The Rocky Promontory by the Waterfall is a room.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"> Instead of going in the Rocky Promontory by the Waterfall:
|
|
say "Where did you want to go?"
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.text_of_pattern</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.test_anl</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.noun_any</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.second_any</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.room_any</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.parameter_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.parameter_kind</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.when</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.from_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.to_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.by_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.through_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.pushing_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.nowhere_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.duration</span><span class="plain"> = </span><span class="identifier">Occurrence::new</span><span class="plain">();</span>
|
|
<span class="identifier">ap</span><span class="element">.optional_clauses</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.chief_action_owner_id</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">ap</span><span class="element">.entered_into_NAP_here</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">ap</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::apoc_new</span><span class="plain">(</span><span class="identifier">stacked_variable</span><span class="plain"> *</span><span class="identifier">stv</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">) {</span>
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">apoc</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">ap_optional_clause</span><span class="plain">);</span>
|
|
<span class="identifier">apoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain"> = </span><span class="identifier">stv</span><span class="plain">;</span>
|
|
<span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain"> = </span><span class="identifier">spec</span><span class="plain">;</span>
|
|
<span class="identifier">apoc</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">apoc</span><span class="plain">-</span><span class="element">>allow_region_as_room</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">apoc</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::ap_add_optional_clause</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">apoc</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">oid</span><span class="plain"> = </span><span class="identifier">StackedVariables::get_owner_id</span><span class="plain">(</span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">off</span><span class="plain"> = </span><span class="identifier">StackedVariables::get_offset</span><span class="plain">(</span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">;</span>
|
|
<span class="identifier">apoc</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="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">oapoc</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">, *</span><span class="identifier">papoc</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">oapoc</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ooff</span><span class="plain"> = </span><span class="identifier">StackedVariables::get_offset</span><span class="plain">(</span><span class="identifier">oapoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">off</span><span class="plain"> < </span><span class="identifier">ooff</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">oapoc</span><span class="plain"> == </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">) {</span>
|
|
<span class="identifier">apoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">;</span>
|
|
<span class="identifier">papoc</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">apoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">papoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">papoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">;</span>
|
|
<span class="identifier">papoc</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">papoc</span><span class="plain"> = </span><span class="identifier">oapoc</span><span class="plain">;</span>
|
|
<span class="identifier">oapoc</span><span class="plain"> = </span><span class="identifier">oapoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">papoc</span><span class="plain">) {</span>
|
|
<span class="identifier">apoc</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">papoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">apoc</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">oid</span><span class="plain"> == 20007 /* </span><span class="identifier">i</span><span class="plain">.</span><span class="identifier">e</span><span class="plain">., </span><span class="identifier">going</span><span class="plain"> */ ) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">off</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> 0: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">; </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>allow_region_as_room</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">; </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>allow_region_as_room</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 3: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 4: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">ap</span><span class="plain">-</span><span class="element">>chief_action_owner_id</span><span class="plain"> = </span><span class="identifier">oid</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::ap_count_optional_clauses</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">apoc</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">apoc</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">; </span><span class="identifier">apoc</span><span class="plain">; </span><span class="identifier">apoc</span><span class="plain"> = </span><span class="identifier">apoc</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">ap</span><span class="plain">-</span><span class="element">>chief_action_owner_id</span><span class="plain"> != 20007) ||</span>
|
|
<span class="plain">(</span><span class="identifier">StackedVariables::get_offset</span><span class="plain">(</span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">) >= 5))</span>
|
|
<span class="identifier">n</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::compare_specificity_of_apoc_list</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap1</span><span class="plain">, </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap2</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rct1</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_count_optional_clauses</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rct2</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_count_optional_clauses</span><span class="plain">(</span><span class="identifier">ap2</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> > </span><span class="identifier">rct2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> < </span><span class="identifier">rct2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>chief_action_owner_id</span><span class="plain"> != </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>chief_action_owner_id</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0;</span>
|
|
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">apoc1</span><span class="plain"> = </span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">, *</span><span class="identifier">apoc2</span><span class="plain"> = </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">apoc1</span><span class="plain">) && (</span><span class="identifier">apoc2</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">off1</span><span class="plain"> = </span><span class="identifier">StackedVariables::get_offset</span><span class="plain">(</span><span class="identifier">apoc1</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">off2</span><span class="plain"> = </span><span class="identifier">StackedVariables::get_offset</span><span class="plain">(</span><span class="identifier">apoc2</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">off1</span><span class="plain"> == </span><span class="identifier">off2</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">apoc1</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">, </span><span class="identifier">apoc2</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="identifier">apoc1</span><span class="plain"> = </span><span class="identifier">apoc1</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="identifier">apoc2</span><span class="plain"> = </span><span class="identifier">apoc2</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">off1</span><span class="plain"> < </span><span class="identifier">off2</span><span class="plain">) </span><span class="identifier">apoc1</span><span class="plain"> = </span><span class="identifier">apoc1</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">off1</span><span class="plain"> > </span><span class="identifier">off2</span><span class="plain">) </span><span class="identifier">apoc2</span><span class="plain"> = </span><span class="identifier">apoc2</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::log</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" [Null]"</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">ap</span><span class="plain">-</span><span class="element">>valid</span><span class="plain"> != </span><span class="identifier">TRUE</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" [Invalid]"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" [Valid]"</span><span class="plain">);</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Action: "</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"unspecified"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::Actions::Lists::log_briefly</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Noun: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Second: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" From: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" To: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" By: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Through: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Pushing: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Room: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Parameter: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Presence: $P"</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Nowhere "</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>when</span><span class="plain">)</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">" When: $P "</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>when</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">)))</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">" Duration: $t "</span><span class="plain">, &(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::ap_store</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">sap</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain">);</span>
|
|
<span class="plain">*</span><span class="identifier">sap</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">sap</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::is_named</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>nap_listed</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">FALSE</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">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::is_valid</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>valid</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::is_request</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::within_action_context</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">)</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::Named::within_action_context</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">; </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">anl</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">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> == </span><span class="identifier">an</span><span class="plain">) && (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == 1)) ||</span>
|
|
<span class="plain">((</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> != </span><span class="identifier">an</span><span class="plain">) && (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == -1)))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::list</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</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">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::required_action</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</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">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>parity</span><span class="plain"> == 1) && (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>negate_pattern</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">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::object_based</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::is_unspecific</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::required_action</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">an</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_min_parameters</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> > 0) && (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> > 1) && (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> > 0) && (</span><span class="functiontext">PL::Actions::Patterns::ap_clause_is_unspecific</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain"> > 1) && (</span><span class="functiontext">PL::Actions::Patterns::ap_clause_is_unspecific</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::Patterns::ap_clause_is_unspecific</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::ap_clause_is_unspecific</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</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">FALSE</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">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::is_overspecific</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>when</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>presence_spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>optional_clauses</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::suppress_action_testing</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>test_anl</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="endnote">The function PL::Actions::Patterns::new is used in <a href="#SP7">§7</a>, <a href="#SP22_1">§22.1</a>, <a href="#SP23">§23</a>, <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::apoc_new is used in <a href="#SP26_3">§26.3</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_add_optional_clause is used in <a href="#SP26_3">§26.3</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_count_optional_clauses appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::compare_specificity_of_apoc_list is used in <a href="#SP27">§27</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::log is used in 1/im (<a href="1-im.html#SP4">§4</a>, <a href="1-im.html#SP4_4">§4.4</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_store is used in <a href="#SP22_1">§22.1</a>, <a href="#SP23">§23</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::is_named is used in <a href="#SP27">§27</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::is_valid is used in <a href="#SP23">§23</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::is_request appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::within_action_context is used in 4/nap (<a href="4-nap.html#SP2">§2</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::list is used in 4/anl (<a href="4-anl.html#SP9">§9</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::required_action appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::object_based appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::is_unspecific appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_clause_is_unspecific appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::is_overspecific appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::suppress_action_testing appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>We are allowed to give names to certain kinds of behaviour by "categorising"
|
|
an action.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::categorise_as</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</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">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Categorising the action:\</span><span class="plain">n</span><span class="string">$A...as %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">ap</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">article</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NamedAPIsArticle</span><span class="plain">),</span>
|
|
<span class="string">"there's only an article here"</span><span class="plain">,</span>
|
|
<span class="string">"not a name, so I'm not sure what this action is supposed to be."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_NamedAPWithActor</span><span class="plain">),</span>
|
|
<span class="string">"behaviour characterised by named action patterns can only specify the action"</span><span class="plain">,</span>
|
|
<span class="string">"not the actor: as a result, it cannot include requests to other people to "</span>
|
|
<span class="string">"do things."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="functiontext">PL::Actions::Patterns::Named::add</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::nullify_nonspecific_references</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</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">spec</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">UNKNOWN_NT</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">spec</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::check_going</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">keyword</span><span class="plain">,</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">ka</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kb</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Specifications::is_description_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">oref</span><span class="plain"> = </span><span class="identifier">Specifications::object_exactly_described_if_any</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">oref</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">ka</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">oref</span><span class="plain">, </span><span class="identifier">ka</span><span class="plain">)) ||</span>
|
|
<span class="plain">((</span><span class="identifier">kb</span><span class="plain">) && (</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">oref</span><span class="plain">, </span><span class="identifier">kb</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="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_object</span><span class="plain">(2, </span><span class="identifier">oref</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_text</span><span class="plain">(3, </span><span class="identifier">keyword</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_kind</span><span class="plain">(4, </span><span class="identifier">ka</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_kind</span><span class="plain">(5, </span><span class="identifier">Instances::to_kind</span><span class="plain">(</span><span class="identifier">oref</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kb</span><span class="plain">) </span><span class="identifier">Problems::quote_kind</span><span class="plain">(6, </span><span class="identifier">kb</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GoingWrongKind</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kb</span><span class="plain">)</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, %2 seems to be intended as something the "</span>
|
|
<span class="string">"player might be going %3, but this has the wrong kind: %5 "</span>
|
|
<span class="string">"rather than %4 or %6."</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, %2 seems to be intended as something the player "</span>
|
|
<span class="string">"might be going %3, but this has the wrong kind: %5 rather than %4."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</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">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::quote_text</span><span class="plain">(3, </span><span class="identifier">keyword</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_GoingWithoutObject</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In the sentence %1, '%2' seems to be intended as something the player "</span>
|
|
<span class="string">"might be going %3, but it doesn't make sense in that context."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</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="endnote">The function PL::Actions::Patterns::categorise_as appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::nullify_nonspecific_references is used in <a href="#SP26_1">§26.1</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::check_going is used in 3/tm (<a href="3-tm.html#SP33">§33</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>First a much easier, parametric form of parsing, used for the APs which
|
|
form the usage conditions for rules in object-based rulebooks.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::parse_parametric</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">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::new</span><span class="plain">();</span>
|
|
<span class="identifier">ap</span><span class="element">.parameter_spec</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::parse_action_parameter</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">ap</span><span class="element">.parameter_kind</span><span class="plain"> = </span><span class="identifier">K</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">Dash::validate_parameter</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.parameter_spec</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::parse_parametric appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>A useful utility: parsing a parameter in an action pattern.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::parse_action_parameter</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::parse_verified_action_parameter</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">spec</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::parse_action_parameter</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">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">UNKNOWN_NT</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadOptionalAPClause</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"In %1, I tried to read a description of an action - a complicated "</span>
|
|
<span class="string">"one involving optional clauses; but '%2' wasn't something I "</span>
|
|
<span class="string">"recognised."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">spec</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::parse_action_parameter is used in <a href="#SP7">§7</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::parse_verified_action_parameter is used in <a href="#SP26_3">§26.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b>The main action pattern parser is called only by the following shell
|
|
routine, which exists in order to change some parsing rules.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Match "doing it" as a repetition of the previous successfully
|
|
matched action pattern.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_ap_parsing</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">last_successful_wording</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING_INIT</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">prevailing_ap_tense</span><span class="plain"> = </span><span class="identifier">IS_TENSE</span><span class="plain">;</span>
|
|
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>In fact these codes aren't used any more:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">ACTOR_REQUESTED</span><span class="plain"> 0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ACTOR_NAMED</span><span class="plain"> 1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain"> 2</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain"> 3</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">ACTOR_IMPLICITLY_PLAYER</span><span class="plain"> 4</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>Action patterns are textual descriptions which act as predicates on actions,
|
|
that is, they are descriptions which are true of some actions and false of
|
|
others. For example,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>taking something in a dark room</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">won't be true of taking the ball in the Beach, or of dropping the torch in the
|
|
Cellars. Although precisely described actions are valid as APs:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>taking the beach ball</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">(which is true for this one action and false for all others), APs can be both
|
|
more general — as above — and even more specific:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>taking the beach ball in the presence of a lifeguard</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">...which might not be true even if the current action is "taking the beach
|
|
ball".
|
|
</p>
|
|
|
|
<p class="inwebparagraph">APs can be very flexible and have the most complicated syntax in Inform. It's
|
|
not practical to make the Preform grammar as explicit as one might like, but
|
|
we'll do our best. The top level establishes who the actor will be, and whether
|
|
it is an actual action or merely a request to perform the action. There are
|
|
two versions of this: the first is for contexts where the AP might occur as
|
|
a noun (e.g., in a sentence like "Taking a jewel is felonious behaviour.").
|
|
These are always present tense, and can't be negated.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">> ::=</span>
|
|
<span class="identifier">asking</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_NAMED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">actor</span><span class="plain">> ==> </span><span class="constant">ACTOR_IMPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b>The second version is for contexts where the AP occurs as a condition: e.g.,
|
|
in a sentence like "if we have taken a jewel". Since these can occur in
|
|
both tenses and can be negated ("if we are not taking a jewel"), there are
|
|
four combinations:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">we</span><span class="plain">-</span><span class="identifier">are</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">> ::=</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">asking</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">asking</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_NAMED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">are</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">actor</span><span class="plain">> ==> </span><span class="constant">ACTOR_IMPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">negated</span><span class="plain">> ::=</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">asking</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">not</span><span class="plain"> </span><span class="identifier">asking</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_NAMED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">not</span><span class="plain"> </span><span class="identifier">trying</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">are</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">not</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">actor</span><span class="plain">> ==> </span><span class="constant">ACTOR_IMPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">> ::=</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> </span><span class="identifier">asked</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">has</span><span class="plain"> </span><span class="identifier">tried</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_NAMED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">has</span><span class="plain"> </span><span class="identifier">tried</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">has</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> </span><span class="identifier">tried</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">-</span><span class="identifier">negated</span><span class="plain">> ::=</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">asked</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">try</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_REQUESTED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> </span><span class="identifier">has</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">tried</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_NAMED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">has</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">tried</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">an</span><span class="plain"> </span><span class="identifier">actor</span><span class="plain"> </span><span class="identifier">has</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_UNIVERSAL</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>applies_to_any_actor</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> </span><span class="identifier">tried</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="identifier">we</span><span class="plain"> </span><span class="identifier">have</span><span class="plain"> </span><span class="identifier">not</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> ==> </span><span class="constant">ACTOR_EXPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>There is one more tweak at this top level. Inform allows an ambiguous but
|
|
shorter and more natural syntax in which the actor's name simply appears at
|
|
the front of the AP:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Raffles taking a jewel</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Here there are no textual markers like "trying" to separate the actor's
|
|
name ("Raffles") from the action itself ("taking a jewel"), and all
|
|
we can do is search out possibilities. If it's possible to match the action
|
|
without an initial actor name, that takes priority, to ensure that this
|
|
actorless possibility can always be written.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">actor</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> | ==> </span><span class="constant">ACTOR_IMPLICITLY_PLAYER</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain"><</span><span class="identifier">actor</span><span class="plain">-</span><span class="identifier">description</span><span class="plain">> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> ==> </span><span class="constant">ACTOR_NAMED</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b>And this voracious token matches the actor's name as an initial excerpt,
|
|
which is much faster than exhaustive searching. It tries to break just before
|
|
any "-ing" word (i.e., participle) which is not inside parentheses; but only
|
|
if the resulting name matches <action-parameter> as a constant,
|
|
variable, or description; and there is no match if the text is the name of an
|
|
instance but the "-ing" word could also be read as part of that same name.
|
|
For example, if we read the text
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>angry waiting man taking the fish</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where "angry waiting man" is the name of an individual person, then we don't
|
|
break this after "angry" (with the action "waiting") even though "angry"
|
|
would match as an abbreviated form of the name of "angry waiting man".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">actor</span><span class="plain">-</span><span class="identifier">description</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> ? {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">permit_trying_omission</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">i</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">i</span><span class="plain"> > </span><span class="identifier">Wordings::first_wn</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">Lexer::word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">OPENBRACKET_V</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">CLOSEBRACKET_V</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> == 0) && (<</span><span class="identifier">probable</span><span class="plain">-</span><span class="identifier">participle</span><span class="plain">>(</span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">)))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">>(</span><span class="identifier">Wordings::up_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1))) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">try_stem</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">old_state</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::suppress</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">>(</span><span class="identifier">Wordings::up_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1))) </span><span class="identifier">try_stem</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="functiontext">PL::Actions::Patterns::resume</span><span class="plain">(</span><span class="identifier">old_state</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">Wordings::up_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1))</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Vocabulary::test_flags</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">ACTION_PARTICIPLE_MC</span><span class="plain">)) </span><span class="identifier">k</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain">>0) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Rvalues::to_object_instance</span><span class="plain">(</span><span class="identifier">try_stem</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Instances::full_name_includes</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">))) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Lvalues::get_storage_form</span><span class="plain">(</span><span class="identifier">try_stem</span><span class="plain">) == </span><span class="identifier">LOCAL_VARIABLE_NT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Lvalues::get_storage_form</span><span class="plain">(</span><span class="identifier">try_stem</span><span class="plain">) == </span><span class="identifier">NONLOCAL_VARIABLE_NT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">try_stem</span><span class="plain">, </span><span class="identifier">CONSTANT_NT</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Specifications::is_description</span><span class="plain">(</span><span class="identifier">try_stem</span><span class="plain">))) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">try_stem</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">-1;</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"> 0;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::suppress</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">old_state</span><span class="plain"> = </span><span class="identifier">suppress_ap_parsing</span><span class="plain">;</span>
|
|
<span class="identifier">suppress_ap_parsing</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">old_state</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::resume</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">old_state</span><span class="plain">) {</span>
|
|
<span class="identifier">suppress_ap_parsing</span><span class="plain"> = </span><span class="identifier">old_state</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::suppress is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::resume is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. </b>That completes the top level, and we can forget about actors. All of those
|
|
productions come down now to just two nonterminals, one for the present tense,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>taking or dropping a container</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">and one for the past,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>taken or dropped a container</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">These are written as internals so that they can set a flag to change the
|
|
current tense as appropriate, but they don't otherwise do much:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) They trim away an indication of duration using <historical-reference>, so
|
|
that, e.g., "taking the box for the third time" has "for the third time"
|
|
trimmed away;
|
|
</li></ul>
|
|
<ul class="items"><li>(b) They match <action-pronominal> as the most recently parsed action pattern;
|
|
</li></ul>
|
|
<ul class="items"><li>(c) But otherwise they hand over to <ap-common-core> to do the work.
|
|
</li></ul>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suppress_ap_parsing</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="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_parse_inner</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">IS_TENSE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">) { *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; }</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pattern</span><span class="plain">-</span><span class="identifier">past</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_parse_inner</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">HASBEEN_TENSE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">) { *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">; }</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>"Doing it" is not the happiest of syntaxes. The idea is for this to be
|
|
a sort of pronoun for actions, allowing for anaphora, but to parse such things
|
|
naturally in all cases is wishful thinking. It enables us to write, e.g.:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Instead of Peter taking the box for the second time, try Jane doing it.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where "doing it" will refer to "taking the box". But I wonder if the
|
|
possibility for confusion is too great; perhaps we should just cut this idea.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronominal</span><span class="plain">> ::=</span>
|
|
<span class="identifier">doing</span><span class="plain"> </span><span class="identifier">it</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="functiontext">PL::Actions::Patterns::ap_parse_inner</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tense</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">OPENBRACE_V</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">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"PAP on illegal word range"</span><span class="plain">);</span>
|
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">Vocabulary::disjunction_of_flags</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">tense</span><span class="plain"> == </span><span class="identifier">IS_TENSE</span><span class="plain">) && ((</span><span class="identifier">d</span><span class="plain"> & (</span><span class="identifier">ACTION_PARTICIPLE_MC</span><span class="plain">+</span><span class="identifier">NAMED_AP_MC</span><span class="plain">)) == 0))) {</span>
|
|
<span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="constant">NOPARTICIPLE_PAPF</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="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Parse action pattern (tense %d): %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">tense</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">duration_set</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">time_period</span><span class="plain"> </span><span class="identifier">duration</span><span class="plain"> = </span><span class="identifier">Occurrence::parse</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">Occurrence::is_valid</span><span class="plain">(&</span><span class="identifier">duration</span><span class="plain">)) {</span>
|
|
<span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Wordings::up_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&</span><span class="identifier">duration</span><span class="plain">));</span>
|
|
<span class="identifier">duration_set</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">s</span><span class="plain"> = </span><span class="identifier">prevailing_ap_tense</span><span class="plain">;</span>
|
|
<span class="identifier">prevailing_ap_tense</span><span class="plain"> = </span><span class="identifier">tense</span><span class="plain">;</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="constant">MISC_PAPF</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">pronominal</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">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">last_successful_wording</span><span class="plain">)) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Doing it refers to %W\</span><span class="plain">n</span><span class="string">"</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">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">>(</span><span class="identifier">last_successful_wording</span><span class="plain">))</span>
|
|
<span class="identifier">ap</span><span class="plain"> = <<</span><span class="identifier">rp</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">if</span><span class="plain"> (<</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">ap</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="identifier">last_successful_wording</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Last successful W set to: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
|
|
<span class="identifier">last_successful_wording</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prevailing_ap_tense</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">duration_set</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="plain">)) </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain"> = </span><span class="identifier">duration</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"PAP result (pfr %d): $A\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">pap_failure_reason</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_parse_inner is used in <a href="#SP16">§16</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b>Anyway, we are now down to level 3: all action patterns have been whittled
|
|
down to a single use of <ap-common-core>. Our next step is to recognise
|
|
a condition attached with "when":
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> </span><span class="identifier">when</span><span class="plain">/</span><span class="reserved">while</span><span class="plain"> <</span><span class="identifier">condition</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">ap</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>when</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2]; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pap_failure_reason</span><span class="plain"> == </span><span class="constant">MISC_PAPF</span><span class="plain">) </span><span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="constant">WHENOKAY_PAPF</span><span class="plain">;</span>
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain">...</span><span class="element"> when</span><span class="plain">/</span><span class="reserved">while</span><span class="plain"> <</span><span class="identifier">condition</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">ap</span><span class="plain">> | ==> 0; </span><span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="constant">WHENOKAY_PAPF</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="comment">used only to diagnose problems</span>
|
|
<span class="plain">...</span><span class="element"> when</span><span class="plain">/</span><span class="reserved">while</span><span class="plain"> ... ==> 0; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pap_failure_reason</span><span class="plain"> != </span><span class="constant">WHENOKAY_PAPF</span><span class="plain">) </span><span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="constant">WHEN_PAPF</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="comment">used only to diagnose problems</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. </b><condition-in-ap> is really just <spec-condition> in disguise — i.e.,
|
|
it matches a standard Inform condition — but it's implemented as an internal
|
|
to enable Inform to set up a stack frame if there isn't one already, and so on.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">condition</span><span class="plain">-</span><span class="identifier">in</span><span class="plain">-</span><span class="identifier">ap</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="identifier">ph_stack_frame</span><span class="plain"> *</span><span class="identifier">phsf</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Frames::current_stack_frame</span><span class="plain">() == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">phsf</span><span class="plain"> = </span><span class="identifier">Frames::new_nonphrasal</span><span class="plain">();</span>
|
|
<span class="identifier">StackedVariables::append_owner_list</span><span class="plain">(</span>
|
|
<span class="identifier">Frames::get_stvol</span><span class="plain">(),</span>
|
|
<span class="identifier">all_nonempty_stacked_action_vars</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"A when clause <%W> is suspected.\</span><span class="plain">n</span><span class="string">"</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">wts</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">s</span><span class="plain"> = </span><span class="identifier">pap_failure_reason</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pto</span><span class="plain"> = </span><span class="identifier">permit_trying_omission</span><span class="plain">;</span>
|
|
<span class="identifier">permit_trying_omission</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">s</span><span class="plain">-</span><span class="identifier">condition</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">wts</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="identifier">s</span><span class="plain">;</span>
|
|
<span class="identifier">permit_trying_omission</span><span class="plain"> = </span><span class="identifier">pto</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">phsf</span><span class="plain">) </span><span class="identifier">Frames::remove_nonphrase_stack_frame</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">wts</span><span class="plain">) && (</span><span class="identifier">Dash::validate_conditional_clause</span><span class="plain">(</span><span class="identifier">wts</span><span class="plain">))) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"When clause validated: $P.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">wts</span><span class="plain">);</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">wts</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="SP21"></a><b>§21. </b>Level 4 now. The optional "in the presence of":
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> </span><span class="identifier">in</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> </span><span class="identifier">presence</span><span class="plain"> </span><span class="identifier">of</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> | ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]; </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain"> = *</span><span class="identifier">XP</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[2];</span>
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b>Level 5 now. The initial "in" clause, e.g., "in the Pantry", requires
|
|
special handling to prevent it from clashing with other interpretations of
|
|
"in" elsewhere in the grammar. It's perhaps unexpected that "in the Pantry"
|
|
is valid as an AP, but this enables many natural-looking rules to be written
|
|
("Report rule in the Pantry: ...", say).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> ::=</span>
|
|
<span class="identifier">in</span><span class="plain"> <</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> | ==> </span><<span class="cwebmacro">Make an actionless action pattern, specifying room only</span> <span class="cwebmacronumber">22.1</span>>
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> ==> 0; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_1"></a><b>§22.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Make an actionless action pattern, specifying room only</span> <span class="cwebmacronumber">22.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Dash::validate_parameter</span><span class="plain">(</span><span class="identifier">RP</span><span class="plain">[1], </span><span class="identifier">K_object</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">FALSE</span><span class="plain">; </span> <span class="comment">the "room" isn't even an object</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::new</span><span class="plain">();</span>
|
|
<span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.text_of_pattern</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_store</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>And that's as far down as we go: to level 6. Most of the complexity is gone
|
|
now, but what's left can't very efficiently be written in Preform. Essentially
|
|
we apply <action-list> to the text and then parse the operands using
|
|
<action-operand>, though it's a bit more involved because we also recognise
|
|
optional suffixes special to individual actions, like the "from the cage" in
|
|
"exiting from the cage", and we fail the result if it produces
|
|
inconsistencies between alternative actions (e.g., "taking or waiting the
|
|
box" makes no sense since only one is transitive).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">ap</span><span class="plain">-</span><span class="identifier">common</span><span class="plain">-</span><span class="identifier">core</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">-</span><span class="identifier">inner</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::mismatched_brackets</span><span class="plain">(</span><span class="identifier">W</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="reserved">if</span><span class="plain"> (</span><span class="identifier">scanning_anl_only_mode</span><span class="plain">) {</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::parse</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">prevailing_ap_tense</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::new</span><span class="plain">(); </span><span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.text_of_pattern</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.action</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">;</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_store</span><span class="plain">(</span><span class="identifier">ap</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">else</span><span class="plain"> {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Parsing action pattern: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">LOG_INDENT</span><span class="plain">;</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::parse_action_pattern_dash</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">LOG_OUTDENT</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::Patterns::is_valid</span><span class="plain">(&</span><span class="identifier">ap</span><span class="plain">)) {</span>
|
|
<span class="plain">*</span><span class="identifier">XP</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_store</span><span class="plain">(</span><span class="identifier">ap</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="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="SP24"></a><b>§24. </b>The "operands" of an action pattern are the nouns to which it applies: for
|
|
example, in "Kevin taking or dropping something", the operand is "something".
|
|
We treat words like "something" specially to avoid them being read as
|
|
"some thing" and thus forcing the kind of the operand to be "thing".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> ::=</span>
|
|
<span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> | ==> </span><span class="identifier">FALSE</span>
|
|
<span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> </span><span class="reserved">else</span><span class="plain"> | ==> </span><span class="identifier">FALSE</span>
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">going</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">irregular</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> ::=</span>
|
|
<span class="identifier">nowhere</span><span class="plain"> | ==> </span><span class="identifier">FALSE</span>
|
|
<span class="identifier">somewhere</span><span class="plain"> ==> </span><span class="identifier">TRUE</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">understanding</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">irregular</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">> ::=</span>
|
|
<span class="identifier">something</span><span class="plain">/</span><span class="identifier">anything</span><span class="plain"> | ==> </span><span class="identifier">TRUE</span>
|
|
<span class="identifier">it</span><span class="plain"> ==> </span><span class="identifier">FALSE</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. </b>Finally, then, <action-parameter>. Almost anything syntactically matches
|
|
here — a constant, a description, a table entry, a variable, and so on.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">parameter</span><span class="plain">> ::=</span>
|
|
<span class="plain">^<</span><span class="reserved">if</span><span class="plain">-</span><span class="identifier">nonconstant</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">local</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">> | ==> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span>
|
|
<span class="plain">^<</span><span class="reserved">if</span><span class="plain">-</span><span class="identifier">nonconstant</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">> <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">global</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">> | ==> </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FAIL_NONTERMINAL</span>
|
|
<span class="plain"><</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">local</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">> | ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">global</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">> | ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
<span class="plain"><</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">type</span><span class="plain">-</span><span class="identifier">expression</span><span class="plain">-</span><span class="identifier">or</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">> ==> </span><span class="identifier">TRUE</span><span class="plain">; *</span><span class="identifier">XP</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1]</span>
|
|
|
|
<span class="plain"><</span><span class="reserved">if</span><span class="plain">-</span><span class="identifier">nonconstant</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">context</span><span class="plain">> </span><span class="identifier">internal</span><span class="plain"> 0 {</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">permit_nonconstant_action_parameters</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26"></a><b>§26. </b>We can't put it off any longer. Here goes.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::parse_action_pattern_dash</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">failure_this_call</span><span class="plain"> = </span><span class="identifier">pap_failure_reason</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">k</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</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">tense</span><span class="plain"> = </span><span class="identifier">prevailing_ap_tense</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::new</span><span class="plain">(); </span><span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.text_of_pattern</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">PAR - (f) Parse Special Going Clauses</span> <span class="cwebmacronumber">26.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">PAR - (i) Parse Initial Action Name List</span> <span class="cwebmacronumber">26.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">PAR - (j) Parse Parameters</span> <span class="cwebmacronumber">26.5</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">PAR - (k) Verify Mixed Action</span> <span class="cwebmacronumber">26.6</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">With one small proviso, a valid action pattern has been parsed</span> <span class="cwebmacronumber">26.1</span>><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">Failed</span><span class="plain">: ;</span>
|
|
<<span class="cwebmacro">No valid action pattern has been parsed</span> <span class="cwebmacronumber">26.2</span>><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::parse_action_pattern_dash is used in <a href="#SP23">§23</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_1"></a><b>§26.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">With one small proviso, a valid action pattern has been parsed</span> <span class="cwebmacronumber">26.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">pap_failure_reason</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">ap</span><span class="element">.text_of_pattern</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.action</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">anl</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">ap</span><span class="element">.action</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::nullify_nonspecific_references</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain">);</span>
|
|
<span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::nullify_nonspecific_references</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain">);</span>
|
|
<span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::nullify_nonspecific_references</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain">);</span>
|
|
<span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::nullify_nonspecific_references</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ch</span><span class="plain"> = </span><span class="identifier">Plugins::Call::check_going</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.from_spec</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.to_spec</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.by_spec</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.through_spec</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.pushing_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ch</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">ap</span><span class="element">.valid</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">ap</span><span class="element">.valid</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Failed</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Matched action pattern: $A\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, &</span><span class="identifier">ap</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_2"></a><b>§26.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">No valid action pattern has been parsed</span> <span class="cwebmacronumber">26.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">pap_failure_reason</span><span class="plain"> = </span><span class="identifier">failure_this_call</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.optional_clauses</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.from_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.to_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.by_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.through_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.pushing_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.nowhere_flag</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Parse action failed: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_3"></a><b>§26.3. </b>Special clauses are allowed after "going..."; trim them
|
|
away as they are recorded.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">PAR - (f) Parse Special Going Clauses</span> <span class="cwebmacronumber">26.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">preliminary_anl</span><span class="plain"> =</span>
|
|
<span class="functiontext">PL::Actions::Lists::parse</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">);</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">chief_an</span><span class="plain"> =</span>
|
|
<span class="functiontext">PL::Actions::Lists::get_single_action</span><span class="plain">(</span><span class="identifier">preliminary_anl</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chief_an</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">x</span><span class="plain">;</span>
|
|
<span class="identifier">chief_an</span><span class="plain"> = </span><span class="functiontext">PL::Actions::longest_null</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">, &</span><span class="identifier">x</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chief_an</span><span class="plain">) {</span>
|
|
<span class="identifier">stacked_variable</span><span class="plain"> *</span><span class="identifier">last_stv_specified</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">i</span><span class="plain"> = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) + 1; </span><span class="identifier">j</span><span class="plain"> = -1;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Trying special clauses at <%W>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)));</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain"> < </span><span class="identifier">Wordings::last_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">stacked_variable</span><span class="plain"> *</span><span class="identifier">stv</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Word::unexpectedly_upper_case</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<span class="identifier">stv</span><span class="plain"> = </span><span class="functiontext">PL::Actions::parse_match_clause</span><span class="plain">(</span><span class="identifier">chief_an</span><span class="plain">, </span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">Wordings::last_wn</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">stv</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">,</span>
|
|
<span class="string">"Special clauses found on <%W>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Wordings::from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_stv_specified</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">-1;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::ap_add_optional_clause</span><span class="plain">(&</span><span class="identifier">ap</span><span class="plain">,</span>
|
|
<span class="functiontext">PL::Actions::Patterns::apoc_new</span><span class="plain">(</span><span class="identifier">last_stv_specified</span><span class="plain">, </span><span class="functiontext">PL::Actions::Patterns::parse_verified_action_parameter</span><span class="plain">(</span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1))));</span>
|
|
<span class="identifier">k</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">+1;</span>
|
|
<span class="identifier">last_stv_specified</span><span class="plain"> = </span><span class="identifier">stv</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">i</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_stv_specified</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="functiontext">PL::Actions::Patterns::ap_add_optional_clause</span><span class="plain">(&</span><span class="identifier">ap</span><span class="plain">,</span>
|
|
<span class="functiontext">PL::Actions::Patterns::apoc_new</span><span class="plain">(</span><span class="identifier">last_stv_specified</span><span class="plain">, </span><span class="functiontext">PL::Actions::Patterns::parse_verified_action_parameter</span><span class="plain">(</span><span class="identifier">Wordings::new</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">Wordings::last_wn</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">j</span><span class="plain"> >= 0) </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Wordings::up_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_4"></a><b>§26.4. </b>Extract the information as to which actions are intended:
|
|
e.g., from "taking or dropping something", that it will be
|
|
taking or dropping.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">PAR - (i) Parse Initial Action Name List</span> <span class="cwebmacronumber">26.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">anl</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::parse</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">tense</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">anl</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Failed</span><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"ANL from PAR(i):\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5"></a><b>§26.5. </b>Now to fill in the gaps. At this point we have the action name
|
|
list as a linked list of all possible lexical matches, but want to
|
|
whittle it down to remove those which do not semantically make
|
|
sense. For instance, "taking inventory" has two possible lexical
|
|
matches: "taking inventory" with 0 parameters, or "taking" with
|
|
1 parameter "inventory", and we cannot judge without parsing
|
|
the expression "inventory". The list passes muster if at least
|
|
one match succeeds at the first word position represented in the
|
|
list, which is to say the last one lexically, since the list is
|
|
reverse-ordered. (This is so that "taking or dropping something"
|
|
requires only "dropping" to have its objects specified; "taking",
|
|
of course, does not.) We delete all entries in the list at this
|
|
crucial word position except for the one matched.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_AP_POSITIONS</span><span class="plain"> 100</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">UNTHINKABLE_POSITION</span><span class="plain"> -1</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">PAR - (j) Parse Parameters</span> <span class="cwebmacronumber">26.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_positions</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">position_at</span><span class="plain">[</span><span class="constant">MAX_AP_POSITIONS</span><span class="plain">], </span><span class="identifier">position_min_parc</span><span class="plain">[</span><span class="constant">MAX_AP_POSITIONS</span><span class="plain">];</span>
|
|
<<span class="cwebmacro">Find the positions of individual action names, and their minimum parameter counts</span> <span class="cwebmacronumber">26.5.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Report to the debugging log on the action decomposition</span> <span class="cwebmacronumber">26.5.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Find how many different positions have each possible minimum count</span> <span class="cwebmacronumber">26.5.3</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">first_position</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">first_valid</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">trial_ap</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Entry (%d):\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">, </span><span class="identifier">entry</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Fill out the noun, second, room and nowhere fields of the AP as if this action were right</span> <span class="cwebmacronumber">26.5.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Check the validity of this speculative AP</span> <span class="cwebmacronumber">26.5.5</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">trial_ap</span><span class="element">.valid</span><span class="plain">) && (</span><span class="identifier">first_valid</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> == </span><span class="identifier">first_position</span><span class="plain">)) {</span>
|
|
<span class="identifier">first_valid</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain"> = </span><span class="identifier">trial_ap</span><span class="element">.noun_spec</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain"> = </span><span class="identifier">trial_ap</span><span class="element">.second_spec</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain"> = </span><span class="identifier">trial_ap</span><span class="element">.room_spec</span><span class="plain">; </span><span class="identifier">ap</span><span class="element">.nowhere_flag</span><span class="plain"> = </span><span class="identifier">trial_ap</span><span class="element">.nowhere_flag</span><span class="plain">;</span>
|
|
<span class="identifier">ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trial_ap</span><span class="element">.valid</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_valid</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Failed</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Adjudicate between topic and other actions</span> <span class="cwebmacronumber">26.5.6</span>><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"List before action winnowing:\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Delete those action names which are to be deleted</span> <span class="cwebmacronumber">26.5.7</span>><span class="plain">;</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"List after action winnowing:\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_1"></a><b>§26.5.1. </b>For example, "taking inventory or waiting" produces two positions, words
|
|
0 and 3, and minimum parameter count 0 in each case. ("Taking inventory"
|
|
can be read as "taking (inventory)", par-count 1, or "taking inventory",
|
|
par-count 0, so the minimum is 0.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Find the positions of individual action names, and their minimum parameter counts</span> <span class="cwebmacronumber">26.5.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">entry</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = -1;</span>
|
|
<<span class="cwebmacro">Find the position word of this particular action name</span> <span class="cwebmacronumber">26.5.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">position_min_parc</span><span class="plain">[</span><span class="identifier">pos</span><span class="plain">] == </span><span class="constant">UNTHINKABLE_POSITION</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> < </span><span class="identifier">position_min_parc</span><span class="plain">[</span><span class="identifier">pos</span><span class="plain">]))</span>
|
|
<span class="identifier">position_min_parc</span><span class="plain">[</span><span class="identifier">pos</span><span class="plain">] = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_1_1"></a><b>§26.5.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Find the position word of this particular action name</span> <span class="cwebmacronumber">26.5.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">no_positions</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> == </span><span class="identifier">position_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">])</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain"> == -1) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_positions</span><span class="plain"> == </span><span class="constant">MAX_AP_POSITIONS</span><span class="plain">) </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Failed</span><span class="plain">;</span>
|
|
<span class="identifier">position_at</span><span class="plain">[</span><span class="identifier">no_positions</span><span class="plain">] = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">;</span>
|
|
<span class="identifier">position_min_parc</span><span class="plain">[</span><span class="identifier">no_positions</span><span class="plain">] = </span><span class="constant">UNTHINKABLE_POSITION</span><span class="plain">;</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">no_positions</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5_1">§26.5.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_2"></a><b>§26.5.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Report to the debugging log on the action decomposition</span> <span class="cwebmacronumber">26.5.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"List after action decomposition:\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">no_positions</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">min</span><span class="plain"> = </span><span class="identifier">position_min_parc</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"ANL position %d (word %d): min parc %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
|
|
<span class="identifier">i</span><span class="plain">, </span><span class="identifier">position_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">min</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_3"></a><b>§26.5.3. </b>The following test is done to reject patterns like "taking ball or dropping
|
|
bat", which have a positive minimum parameter count in more than one position;
|
|
which means there couldn't be an action pattern which shared the same noun
|
|
description.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Find how many different positions have each possible minimum count</span> <span class="cwebmacronumber">26.5.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">positions_with_min_parc</span><span class="plain">[3];</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><3; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">positions_with_min_parc</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">no_positions</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">min</span><span class="plain"> = </span><span class="identifier">position_min_parc</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">min</span><span class="plain"> >= 0) && (</span><span class="identifier">min</span><span class="plain"> < 3)) </span><span class="identifier">positions_with_min_parc</span><span class="plain">[</span><span class="identifier">min</span><span class="plain">]++;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">positions_with_min_parc</span><span class="plain">[1] > 1) ||</span>
|
|
<span class="plain">(</span><span class="identifier">positions_with_min_parc</span><span class="plain">[2] > 1)) {</span>
|
|
<span class="identifier">failure_this_call</span><span class="plain"> = </span><span class="constant">MIXEDNOUNS_PAPF</span><span class="plain">; </span><span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Failed</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_4"></a><b>§26.5.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Fill out the noun, second, room and nowhere fields of the AP as if this action were right</span> <span class="cwebmacronumber">26.5.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">trial_ap</span><span class="element">.noun_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">trial_ap</span><span class="element">.second_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">trial_ap</span><span class="element">.room_spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">trial_ap</span><span class="element">.nowhere_flag</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">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> >= 1) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[0])) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> == </span><span class="identifier">going_action</span><span class="plain">) && (<</span><span class="identifier">going</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">irregular</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">>(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[0]))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">r</span><span class="plain">>> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">trial_ap</span><span class="element">.nowhere_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">trial_ap</span><span class="element">.nowhere_flag</span><span class="plain"> = 2;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::put_action_object_into_ap</span><span class="plain">(&</span><span class="identifier">trial_ap</span><span class="plain">, 1, </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[0]);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> >= 2) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[1])) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">K_understanding</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">), </span><span class="identifier">K_understanding</span><span class="plain">))</span>
|
|
<span class="plain">&& (<</span><span class="identifier">understanding</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">irregular</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">>(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[1]))) {</span>
|
|
<span class="identifier">trial_ap</span><span class="element">.second_spec</span><span class="plain"> = </span><span class="identifier">Rvalues::from_grammar_verb</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">); </span> <span class="comment">Why no GV here?</span>
|
|
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">trial_ap</span><span class="element">.second_spec</span><span class="plain">, </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[1]);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">PL::Actions::Patterns::put_action_object_into_ap</span><span class="plain">(&</span><span class="identifier">trial_ap</span><span class="plain">, 2, </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parameter</span><span class="plain">[1]);</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">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain">))</span>
|
|
<span class="functiontext">PL::Actions::Patterns::put_action_object_into_ap</span><span class="plain">(&</span><span class="identifier">trial_ap</span><span class="plain">, 3, </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>in_clause</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_5"></a><b>§26.5.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Check the validity of this speculative AP</span> <span class="cwebmacronumber">26.5.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">check_n</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">check_s</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">check_n</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="identifier">check_s</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">trial_ap</span><span class="element">.valid</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">trial_ap</span><span class="element">.noun_any</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Dash::validate_parameter</span><span class="plain">(</span><span class="identifier">trial_ap</span><span class="element">.noun_spec</span><span class="plain">, </span><span class="identifier">check_n</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">trial_ap</span><span class="element">.valid</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">trial_ap</span><span class="element">.second_any</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Dash::validate_parameter</span><span class="plain">(</span><span class="identifier">trial_ap</span><span class="element">.second_spec</span><span class="plain">, </span><span class="identifier">check_s</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">trial_ap</span><span class="element">.valid</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">trial_ap</span><span class="element">.room_any</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Dash::validate_parameter</span><span class="plain">(</span><span class="identifier">trial_ap</span><span class="element">.room_spec</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">trial_ap</span><span class="element">.valid</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_6"></a><b>§26.5.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Adjudicate between topic and other actions</span> <span class="cwebmacronumber">26.5.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">[2];</span>
|
|
<span class="identifier">K</span><span class="plain">[0] = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">K</span><span class="plain">[1] = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">entry</span><span class="plain">, *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">, </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</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">entry</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">prev</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> != </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">entry</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">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> != </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K</span><span class="plain">[0] == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) >= 1))</span>
|
|
<span class="identifier">K</span><span class="plain">[0] = </span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K</span><span class="plain">[1] == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) >= 2))</span>
|
|
<span class="identifier">K</span><span class="plain">[1] = </span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"Necessary kinds: $u, $u\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">[0], </span><span class="identifier">K</span><span class="plain">[1]);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">, </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</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">entry</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">)) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">poor_choice</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">K</span><span class="plain">[0]) && (</span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) >= 1)) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">[0]) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">poor_choice</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K</span><span class="plain">[1]) && (</span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) >= 2)) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">[1]) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">poor_choice</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">poor_choice</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">prev</span><span class="plain">) && (</span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> == </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="plain">||</span>
|
|
<span class="plain">((</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) && (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain"> == </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)))</span>
|
|
<span class="identifier">entry</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</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="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_5_7"></a><b>§26.5.7. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Delete those action names which are to be deleted</span> <span class="cwebmacronumber">26.5.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">entry</span><span class="plain">, *</span><span class="identifier">prev</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">pos</span><span class="plain"> = -1, </span><span class="identifier">negation_state</span><span class="plain"> = (</span><span class="identifier">anl</span><span class="plain">)?(</span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</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">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</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">entry</span><span class="plain">-</span><span class="element">>delete_this_link</span><span class="plain">) || (</span><span class="identifier">pos</span><span class="plain"> == </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">prev</span><span class="plain">-</span><span class="element">>next</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">;</span>
|
|
<span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>word_position</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">anl</span><span class="plain">) </span><span class="identifier">anl</span><span class="plain">-</span><span class="element">>negate_pattern</span><span class="plain"> = </span><span class="identifier">negation_state</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26_5">§26.5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP26_6"></a><b>§26.6. </b>Not all actions can cohabit. We require that as far as the user has
|
|
specified the parameters, the actions in the list must all agree (i) to be
|
|
allowed to have such a parameter, and (ii) to be allowed to have a
|
|
parameter of the same type. Thus "waiting or taking something" fails
|
|
(waiting takes 0 parameters, but we specified one), and so would "painting
|
|
or taking something" if painting had to be followed by a colour, say. Note
|
|
that the "doing anything" action is always allowed a parameter (this is
|
|
the case when the first action name in the list is <code class="display"><span class="extract">NULL</span></code>).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">PAR - (k) Verify Mixed Action</span> <span class="cwebmacronumber">26.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">immiscible</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">no_oow</span><span class="plain"> = 0, </span><span class="identifier">no_iw</span><span class="plain"> = 0, </span><span class="identifier">no_of_pars</span><span class="plain"> = 0;</span>
|
|
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kinds_observed_in_list</span><span class="plain">[2];</span>
|
|
<span class="identifier">kinds_observed_in_list</span><span class="plain">[0] = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">kinds_observed_in_list</span><span class="plain">[1] = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</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">entry</span><span class="plain">-</span><span class="element">>nap_listed</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_of_pars</span><span class="plain"> > 0) </span><span class="identifier">immiscible</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">no_of_pars</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">this</span><span class="plain"> = </span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::is_out_of_world</span><span class="plain">(</span><span class="identifier">this</span><span class="plain">)) </span><span class="identifier">no_oow</span><span class="plain">++; </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">no_iw</span><span class="plain">++;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> >= 1) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="identifier">this</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">kinds_observed_in_list</span><span class="plain">[0];</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">) && (</span><span class="identifier">K</span><span class="plain">) && (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">immiscible</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">kinds_observed_in_list</span><span class="plain">[0] = </span><span class="identifier">K</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>parc</span><span class="plain"> >= 2) {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">this</span><span class="plain">);</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">kinds_observed_in_list</span><span class="plain">[1];</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">) && (</span><span class="identifier">K</span><span class="plain">) && (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">immiscible</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">kinds_observed_in_list</span><span class="plain">[1] = </span><span class="identifier">K</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">no_oow</span><span class="plain"> > 0) && (</span><span class="identifier">no_iw</span><span class="plain"> > 0)) </span><span class="identifier">immiscible</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">anl</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain">; </span><span class="identifier">entry</span><span class="plain"> = </span><span class="identifier">entry</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">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_of_pars</span><span class="plain"> > </span><span class="functiontext">PL::Actions::get_max_parameters</span><span class="plain">(</span><span class="identifier">entry</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">))</span>
|
|
<span class="identifier">immiscible</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">immiscible</span><span class="plain">) {</span>
|
|
<span class="identifier">failure_this_call</span><span class="plain"> = </span><span class="constant">IMMISCIBLE_PAPF</span><span class="plain">;</span>
|
|
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">Failed</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP26">§26</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP27"></a><b>§27. Action pattern specificity. </b>The following is one of NI's standardised comparison routines, which
|
|
takes a pair of objects A, B and returns 1 if A makes a more specific
|
|
description than B, 0 if they seem equally specific, or -1 if B makes a
|
|
more specific description than A. This is transitive, and intended to be
|
|
used in sorting algorithms.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::ap_count_rooms</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::ap_count_going</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain"> += 2;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::count_aspects</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain">))</span>
|
|
<span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain">))</span>
|
|
<span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">))</span>
|
|
<span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">))) || (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>when</span><span class="plain">))</span>
|
|
<span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">++;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::compare_specificity</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap1</span><span class="plain">, </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap2</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">suspend_usual_from_and_room</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">rct1</span><span class="plain">, </span><span class="identifier">rct2</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 0;</span>
|
|
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">SPECIFICITIES</span><span class="plain">,</span>
|
|
<span class="string">"Comparing specificity of action patterns:\</span><span class="plain">n</span><span class="string">(1) $A(2) $A\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">ap1</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>valid</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>valid</span><span class="plain"> != </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>valid</span><span class="plain"> != </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>valid</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.1 - Object To Which Rule Applies"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.2.1 - Action/Where/Going In Exotic Ways"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rct1</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_count_going</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">); </span><span class="identifier">rct2</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_count_going</span><span class="plain">(</span><span class="identifier">ap2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> > </span><span class="identifier">rct2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> < </span><span class="identifier">rct2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>pushing_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>by_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>through_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.2.2 - Action/Where/Room Where Action Takes Place"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rct1</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_count_rooms</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">); </span><span class="identifier">rct2</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::ap_count_rooms</span><span class="plain">(</span><span class="identifier">ap2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> > </span><span class="identifier">rct2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rct1</span><span class="plain"> < </span><span class="identifier">rct2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">) && (</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="identifier">suspend_usual_from_and_room</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="plain">&& (</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">) && (</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="identifier">suspend_usual_from_and_room</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suspend_usual_from_and_room</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>from_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suspend_usual_from_and_room</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>to_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.2.3 - Action/Where/In The Presence Of"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.2.4 - Action/Where/Other Optional Clauses"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Patterns::compare_specificity_of_apoc_list</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.3.1 - Action/What/Second Thing Acted On"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.3.2 - Action/What/Thing Acted On"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>nowhere_flag</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.3.3 - Action/What/Actor Performing Action"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Specifications::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.4.1 - Action/How/What Happens"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::compare_specificity</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>action</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>action</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.5.1 - Action/When/Duration"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Occurrence::compare_specificity</span><span class="plain">(&(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">), &(</span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.5.2 - Action/When/Circumstances"</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">Conditions::compare_specificity_of_CONDITIONs</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">-</span><span class="element">>when</span><span class="plain">, </span><span class="identifier">ap2</span><span class="plain">-</span><span class="element">>when</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> != 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">c_s_stage_law</span><span class="plain"> = </span><span class="string">"III.6.1 - Action/Name/Is This Named"</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">PL::Actions::Patterns::is_named</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">)) && (</span><span class="functiontext">PL::Actions::Patterns::is_named</span><span class="plain">(</span><span class="identifier">ap2</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">PL::Actions::Patterns::is_named</span><span class="plain">(</span><span class="identifier">ap1</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="functiontext">PL::Actions::Patterns::is_named</span><span class="plain">(</span><span class="identifier">ap2</span><span class="plain">)))</span>
|
|
<span class="reserved">return</span><span class="plain"> -1;</span>
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_count_rooms appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::ap_count_going appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::count_aspects appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::compare_specificity appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP28"></a><b>§28. </b>And an anticlimactic little routine for putting objects
|
|
into action patterns in the noun or second noun position.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::put_action_object_into_ap</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</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">spec</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">any_flag</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">action</span><span class="plain">-</span><span class="identifier">operand</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">r</span><span class="plain">>>) </span><span class="identifier">spec</span><span class="plain"> = <<</span><span class="identifier">rp</span><span class="plain">>>;</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">any_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">K_thing</span><span class="plain">); }</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">Specifications::new_UNKNOWN</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">K_understanding</span><span class="plain">) && (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">)))</span>
|
|
<span class="identifier">ParseTree::set_kind_of_value</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">);</span>
|
|
<span class="identifier">ParseTree::set_text</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">, </span><span class="string">"PAOIA (position %d) %W = $P\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain"> = </span><span class="identifier">spec</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_any</span><span class="plain"> = </span><span class="identifier">any_flag</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain"> = </span><span class="identifier">spec</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_any</span><span class="plain"> = </span><span class="identifier">any_flag</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 3: </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain"> = </span><span class="identifier">spec</span><span class="plain">; </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_any</span><span class="plain"> = </span><span class="identifier">any_flag</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::put_action_object_into_ap is used in <a href="#SP26_5_4">§26.5.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP29"></a><b>§29. Compiling action tries. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::emit_try</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">store_instead</span><span class="plain">) {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec0</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">; </span> <span class="comment">the noun</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec1</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">; </span> <span class="comment">the second noun</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec2</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">; </span> <span class="comment">the actor</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K_understanding</span><span class="plain">) && (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">)) &&</span>
|
|
<span class="plain">(<</span><span class="identifier">nominative</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">spec0</span><span class="plain"> = </span><span class="identifier">Rvalues::from_wording</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K_understanding</span><span class="plain">) && (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">spec1</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">)) &&</span>
|
|
<span class="plain">(<</span><span class="identifier">nominative</span><span class="plain">-</span><span class="identifier">pronoun</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec1</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">))</span>
|
|
<span class="identifier">spec1</span><span class="plain"> = </span><span class="identifier">Rvalues::from_wording</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec1</span><span class="plain">));</span>
|
|
|
|
<span class="reserved">action_name_list</span><span class="plain"> *</span><span class="identifier">anl</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">;</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::get_singleton_action</span><span class="plain">(</span><span class="identifier">anl</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXPRESSIONS</span><span class="plain">, </span><span class="string">"Compiling from action name list:\</span><span class="plain">n</span><span class="string">$L\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anl</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">flag_bits</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">), </span><span class="identifier">K_text</span><span class="plain">)) </span><span class="identifier">flag_bits</span><span class="plain"> += 16;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec1</span><span class="plain">), </span><span class="identifier">K_text</span><span class="plain">)) </span><span class="identifier">flag_bits</span><span class="plain"> += 32;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">flag_bits</span><span class="plain"> > 0) </span><span class="identifier">Kinds::RunTime::ensure_basic_heap_present</span><span class="plain">();</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain">) </span><span class="identifier">flag_bits</span><span class="plain"> += 1;</span>
|
|
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TRYACTION_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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="identifier">inter_t</span><span class="plain">) </span><span class="identifier">flag_bits</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec2</span><span class="plain">) </span><span class="functiontext">PL::Actions::Patterns::emit_try_action_parameter</span><span class="plain">(</span><span class="identifier">spec2</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PLAYER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_action_name</span><span class="plain">, </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec0</span><span class="plain">) </span><span class="functiontext">PL::Actions::Patterns::emit_try_action_parameter</span><span class="plain">(</span><span class="identifier">spec0</span><span class="plain">, </span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec1</span><span class="plain">) </span><span class="functiontext">PL::Actions::Patterns::emit_try_action_parameter</span><span class="plain">(</span><span class="identifier">spec1</span><span class="plain">, </span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">));</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">store_instead</span><span class="plain">) {</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">STORED_ACTION_TY_CURRENT_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Frames::emit_allocation</span><span class="plain">(</span><span class="identifier">K_stored_action</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::emit_try is used in 4/act (<a href="4-act.html#SP10">§10</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP30"></a><b>§30. </b>Which requires the following. As ever, there have to be hacks to ensure that
|
|
text as an action parameter is correctly read as parsing grammar rather than
|
|
text when the action expects that.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::emit_try_action_parameter</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">required_kind</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K_understanding</span><span class="plain">) && (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">required_kind</span><span class="plain">, </span><span class="identifier">K_understanding</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="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="identifier">Kinds::Compare::compatible</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">))) {</span>
|
|
<span class="identifier">required_kind</span><span class="plain"> = </span><span class="identifier">NULL</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">Dash::check_value</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">required_kind</span><span class="plain">)) {</span>
|
|
<span class="identifier">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
|
|
<span class="identifier">COMPILATION_MODE_EXIT</span><span class="plain">(</span><span class="identifier">DEREFERENCE_POINTERS_CMODE</span><span class="plain">);</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">END_COMPILATION_MODE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::emit_try_action_parameter is used in <a href="#SP29">§29</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP31"></a><b>§31. Compiling action patterns. </b>In the following routines, we compile a single clause in what may be a
|
|
complex condition which determines whether a rule should fire. The flag
|
|
<code class="display"><span class="extract">f</span></code> indicates whether any condition has already been printed, and is
|
|
updated as the return value of the routine. (Thus, it's permissible for
|
|
the routines to compile nothing and return <code class="display"><span class="extract">f</span></code> unchanged.) The simple
|
|
case first:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::CAP_insert_clause</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">i6_condition</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">f</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" && "</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(%s)"</span><span class="plain">, </span><span class="identifier">i6_condition</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::CAP_insert_clause appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP32"></a><b>§32. </b>The more complex clauses mostly act on a single I6 global variable.
|
|
In almost all cases, this falls through to the standard method for
|
|
testing a condition: we force it to propositional form, substituting the
|
|
global in for the value of free variable 0. However, rule clauses are
|
|
allowed a few syntaxes not permitted to ordinary conditions, and these
|
|
are handled as exceptional cases first:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) A table reference such as "a Queen listed in the Table of Monarchs"
|
|
expands.
|
|
</li></ul>
|
|
<ul class="items"><li>(b) Writing "from R", where R is a region, tests if the room being gone
|
|
from is in R, not if it is equal to R. Similarly for other room-related
|
|
clauses such as "through" and "in".
|
|
</li></ul>
|
|
<ul class="items"><li>(c) Given a piece of run-time parser grammar, we compile a test against
|
|
the standard I6 topic variables: there are two of these, so this is the
|
|
exceptional case where the clause doesn't act on a single I6 global,
|
|
and in this case we therefore ignore <code class="display"><span class="extract">I6_global_name</span></code>.
|
|
</li></ul>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">,</span>
|
|
<span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">I6_global_variable</span><span class="plain">,</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">verify_as_kind</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">adapt_region</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</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">f</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">I6_var_TS</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I6_global_variable</span><span class="plain">)</span>
|
|
<span class="identifier">I6_var_TS</span><span class="plain"> = </span><span class="identifier">Lvalues::new_actual_NONLOCAL_VARIABLE</span><span class="plain">(</span><span class="identifier">I6_global_variable</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_parameter</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">I6_global_variable</span><span class="plain"> == </span><span class="identifier">parameter_object_VAR</span><span class="plain">) </span><span class="identifier">is_parameter</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause_inner</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">,</span>
|
|
<span class="identifier">VH</span><span class="plain">, </span><span class="identifier">I6_var_TS</span><span class="plain">, </span><span class="identifier">is_parameter</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">verify_as_kind</span><span class="plain">, </span><span class="identifier">adapt_region</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause_inner</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain">,</span>
|
|
<span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">I6_var_TS</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_parameter</span><span class="plain">,</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">verify_as_kind</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">adapt_region</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">force_proposition</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">spec</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">f</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"[MPE on $P: $P]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">I6_var_TS</span><span class="plain">, </span><span class="identifier">spec</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="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</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">K</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="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_APClauseIndefinite</span><span class="plain">),</span>
|
|
<span class="string">"that action seems to involve a value which is unclear about "</span>
|
|
<span class="string">"its kind"</span><span class="plain">,</span>
|
|
<span class="string">"and that's not allowed. For example, you're not allowed to just "</span>
|
|
<span class="string">"say 'Instead of taking a value: ...' because the taking action "</span>
|
|
<span class="string">"applies to objects; the vaguest you're allowed to be is 'Instead "</span>
|
|
<span class="string">"of taking an object: ...'."</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">wording</span><span class="plain"> </span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">Descriptions::get_calling</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">)) {</span>
|
|
<span class="identifier">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> =</span>
|
|
<span class="identifier">LocalVariables::ensure_called_local</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">,</span>
|
|
<span class="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">));</span>
|
|
<span class="identifier">LocalVariables::add_calling_to_condition</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">lvar_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::declare_this</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 8);</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">lvar_s</span><span class="plain">);</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">I6_var_TS</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">force_proposition</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">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">UNKNOWN_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == 0) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"MPE found unknown SP"</span><span class="plain">);</span>
|
|
<span class="identifier">force_proposition</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</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">ParseTreeUsage::is_lvalue</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
|
|
<span class="identifier">force_proposition</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">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">TABLE_ENTRY_NT</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::no_children</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">) != 2) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"MPE with bad no of args"</span><span class="plain">);</span>
|
|
<span class="identifier">LocalVariables::add_table_lookup</span><span class="plain">();</span>
|
|
|
|
<span class="identifier">local_variable</span><span class="plain"> *</span><span class="identifier">ct_0_lv</span><span class="plain"> = </span><span class="identifier">LocalVariables::by_name</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"ct_0"</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ct_0_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::declare_this</span><span class="plain">(</span><span class="identifier">ct_0_lv</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 8);</span>
|
|
<span class="identifier">local_variable</span><span class="plain"> *</span><span class="identifier">ct_1_lv</span><span class="plain"> = </span><span class="identifier">LocalVariables::by_name</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"ct_1"</span><span class="plain">);</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ct_1_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::declare_this</span><span class="plain">(</span><span class="identifier">ct_1_lv</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 8);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">ct_1_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">EXISTSTABLEROWCORR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">ct_0_s</span><span class="plain">);</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">-</span><span class="element">>next</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">-></span><span class="identifier">down</span><span class="plain">);</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">I6_var_TS</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">force_proposition</span><span class="plain"> = </span><span class="identifier">FALSE</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">if</span><span class="plain"> ((</span><span class="identifier">Specifications::is_kind_like</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">), </span><span class="identifier">K_object</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">force_proposition</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</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">ParseTreeUsage::is_rvalue</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K_understanding</span><span class="plain">) && (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((<</span><span class="identifier">understanding</span><span class="plain">-</span><span class="identifier">action</span><span class="plain">-</span><span class="identifier">irregular</span><span class="plain">-</span><span class="identifier">operand</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))) &&</span>
|
|
<span class="plain">(<<</span><span class="identifier">r</span><span class="plain">>> == </span><span class="identifier">TRUE</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">INDIRECT2_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">CONSULT_FROM_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">CONSULT_WORDS_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">GPR_FAIL_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">force_proposition</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">is_parameter</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Rvalues::is_object</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))) {</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Specifications::object_exactly_described_if_any</span><span class="plain">(</span><span class="identifier">spec</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="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">K_region</span><span class="plain">))) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_PARSING</span><span class="plain">,</span>
|
|
<span class="string">"$P on $u : $T\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">verify_as_kind</span><span class="plain">, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">adapt_region</span><span class="plain">) {</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TESTREGIONALCONTAINMENT_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">I6_var_TS</span><span class="plain">);</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">force_proposition</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</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">if</span><span class="plain"> (</span><span class="identifier">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">is_parameter</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">Descriptions::to_instance</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="identifier">adapt_region</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">Instances::of_kind</span><span class="plain">(</span><span class="identifier">Descriptions::to_instance</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">), </span><span class="identifier">K_region</span><span class="plain">)))) {</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TESTREGIONALCONTAINMENT_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">I6_var_TS</span><span class="plain">);</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">force_proposition</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">Descriptions::to_proposition</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTreeUsage::is_lvalue</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">))</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"Storage has $D\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">force_proposition</span><span class="plain">) && (</span><span class="identifier">prop</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">Calculus::Propositions::from_spec</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"[MPE forced proposition: $D]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prop</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">"MPE unable to force proposition"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">verify_as_kind</span><span class="plain">) {</span>
|
|
<span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">Calculus::Propositions::concatenate</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">,</span>
|
|
<span class="identifier">Calculus::Atoms::KIND_new</span><span class="plain">(</span>
|
|
<span class="identifier">verify_as_kind</span><span class="plain">, </span><span class="identifier">Calculus::Terms::new_variable</span><span class="plain">(0)));</span>
|
|
<span class="identifier">Calculus::Deferrals::prop_verify_descriptive</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">,</span>
|
|
<span class="string">"an action or activity to apply to things matching a given "</span>
|
|
<span class="string">"description"</span><span class="plain">, </span><span class="identifier">spec</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">prop</span><span class="plain">) {</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"[MPE faces proposition: $D]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
|
|
<span class="identifier">Calculus::Propositions::Checker::type_check</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="identifier">Calculus::Propositions::Checker::tc_no_problem_reporting</span><span class="plain">());</span>
|
|
<span class="identifier">Calculus::Deferrals::emit_test_of_proposition</span><span class="plain">(</span><span class="identifier">I6_var_TS</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::compile_pattern_match_clause is used in <a href="#SP34_1_1_1">§34.1.1.1</a>.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::compile_pattern_match_clause_inner is used in 4/los (<a href="4-los.html#SP2_1">§2.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP33"></a><b>§33. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::as_stored_action</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="identifier">Hierarchy::package_in_enclosure</span><span class="plain">(</span><span class="identifier">BLOCK_CONSTANTS_HAP</span><span class="plain">);</span>
|
|
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">BLOCK_CONSTANT_HL</span><span class="plain">, </span><span class="identifier">PR</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="identifier">Emit::named_late_array_begin</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">Kinds::RunTime::emit_block_value_header</span><span class="plain">(</span><span class="identifier">K_stored_action</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 6);</span>
|
|
<span class="reserved">action_name</span><span class="plain"> *</span><span class="identifier">an</span><span class="plain"> = </span><span class="functiontext">PL::Actions::Lists::get_singleton_action</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::array_action_entry</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">request_bits</span><span class="plain"> = </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>request</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K_understanding</span><span class="plain">) && (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">))) {</span>
|
|
<span class="identifier">request_bits</span><span class="plain"> = </span><span class="identifier">request_bits</span><span class="plain"> | 16;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">BC</span><span class="plain">);</span>
|
|
<span class="identifier">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain"> = </span><span class="identifier">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-></span><span class="identifier">lt_sba_iname</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">BC</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">Specifications::Compiler::emit</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">K_understanding</span><span class="plain">) && (</span><span class="identifier">Rvalues::is_CONSTANT_of_kind</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">))) {</span>
|
|
<span class="identifier">request_bits</span><span class="plain"> = </span><span class="identifier">request_bits</span><span class="plain"> | 32;</span>
|
|
<span class="identifier">literal_text</span><span class="plain"> *</span><span class="identifier">lt</span><span class="plain"> = </span><span class="identifier">Strings::TextLiterals::compile_literal</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">lt</span><span class="plain">-></span><span class="identifier">lt_sba_iname</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">Specifications::Compiler::emit</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">Specifications::Compiler::emit</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span>
|
|
<span class="identifier">Emit::array_iname_entry</span><span class="plain">(</span><span class="identifier">Instances::iname</span><span class="plain">(</span><span class="identifier">I_yourself</span><span class="plain">));</span>
|
|
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">((</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">request_bits</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::array_numeric_entry</span><span class="plain">(0);</span>
|
|
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">) </span><span class="identifier">Emit::holster</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::emit_pattern_match</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">naming_mode</span><span class="plain">) {</span>
|
|
<span class="identifier">value_holster</span><span class="plain"> </span><span class="identifier">VH</span><span class="plain"> = </span><span class="identifier">Holsters::new</span><span class="plain">(</span><span class="identifier">INTER_VAL_VHMODE</span><span class="plain">);</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match</span><span class="plain">(&</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">, </span><span class="identifier">naming_mode</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::as_stored_action is used in 4/act (<a href="4-act.html#SP10">§10</a>).</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::emit_pattern_match is used in 4/nap (<a href="4-nap.html#SP2">§2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34"></a><b>§34. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ACTOR_IS_PLAYER_CPMC</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ACTOR_ISNT_PLAYER_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REQUESTER_EXISTS_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REQUESTER_DOESNT_EXIST_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ACTOR_MATCHES_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ACTION_MATCHES_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NOUN_EXISTS_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NOUN_IS_INP1_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SECOND_EXISTS_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SECOND_IS_INP1_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NOUN_MATCHES_AS_OBJECT_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NOUN_MATCHES_AS_VALUE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SECOND_MATCHES_AS_OBJECT_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SECOND_MATCHES_AS_VALUE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">PLAYER_LOCATION_MATCHES_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ACTOR_IN_RIGHT_PLACE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ACTOR_LOCATION_MATCHES_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">PARAMETER_MATCHES_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">OPTIONAL_CLAUSE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NOWHERE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SOMEWHERE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">NOT_NOWHERE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">PRESENCE_OF_MATCHES_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">PRESENCE_OF_IN_SCOPE_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">LOOP_OVER_SCOPE_WITH_CALLING_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">LOOP_OVER_SCOPE_WITHOUT_CALLING_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SET_SELF_TO_ACTOR_CPMC</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">WHEN_CONDITION_HOLDS_CPMC</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_CPM_CLAUSES</span><span class="plain"> 256</span>
|
|
<span class="definitionkeyword">define</span> <span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cpm_count</span><span class="plain"> >= </span><span class="constant">MAX_CPM_CLAUSES</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"action pattern grossly overcomplex"</span><span class="plain">);</span>
|
|
<span class="identifier">needed</span><span class="plain">[</span><span class="identifier">cpm_count</span><span class="plain">] = </span><span class="identifier">C</span><span class="plain">;</span>
|
|
<span class="identifier">needed_apoc</span><span class="plain">[</span><span class="identifier">cpm_count</span><span class="plain">] = </span><span class="identifier">A</span><span class="plain">;</span>
|
|
<span class="identifier">cpm_count</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::compile_pattern_match</span><span class="plain">(</span><span class="identifier">value_holster</span><span class="plain"> *</span><span class="identifier">VH</span><span class="plain">, </span><span class="reserved">action_pattern</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">naming_mode</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cpm_count</span><span class="plain"> = 0, </span><span class="identifier">needed</span><span class="plain">[</span><span class="constant">MAX_CPM_CLAUSES</span><span class="plain">];</span>
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">needed_apoc</span><span class="plain">[</span><span class="constant">MAX_CPM_CLAUSES</span><span class="plain">];</span>
|
|
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">ACTION_PATTERN_COMPILATION</span><span class="plain">, </span><span class="string">"Compiling action pattern:\</span><span class="plain">n</span><span class="string"> $A"</span><span class="plain">, &</span><span class="identifier">ap</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="element">.duration</span><span class="plain">))) {</span>
|
|
<span class="identifier">Chronology::compile_past_action_pattern</span><span class="plain">(</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.duration</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_of_noun</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">kind_of_second</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">naming_mode</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">ap</span><span class="element">.applies_to_any_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">impose</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">ap</span><span class="element">.actor_spec</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">impose</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">var</span><span class="plain"> = </span><span class="identifier">Lvalues::get_nonlocal_variable_if_any</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">var</span><span class="plain">) && (</span><span class="identifier">var</span><span class="plain"> == </span><span class="identifier">player_VAR</span><span class="plain">)) </span><span class="identifier">impose</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Rvalues::to_object_instance</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.actor_spec</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="identifier">I</span><span class="plain"> == </span><span class="identifier">I_yourself</span><span class="plain">)) </span><span class="identifier">impose</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">impose</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">ACTOR_ISNT_PLAYER_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.request</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">REQUESTER_EXISTS_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">REQUESTER_DOESNT_EXIST_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">ACTOR_MATCHES_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">ACTOR_IS_PLAYER_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.request</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">REQUESTER_EXISTS_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">REQUESTER_DOESNT_EXIST_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">ap</span><span class="element">.action</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="element">.test_anl</span><span class="plain">)) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">ACTION_MATCHES_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain">)) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">NOUN_EXISTS_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">NOUN_IS_INP1_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain">)) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">SECOND_EXISTS_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">SECOND_IS_INP1_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">)) {</span>
|
|
<span class="identifier">kind_of_noun</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_noun</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kind_of_noun</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">kind_of_noun</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">kind_of_noun</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">NOUN_MATCHES_AS_OBJECT_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">NOUN_MATCHES_AS_VALUE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">ap</span><span class="element">.action</span><span class="plain">) && (</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">)) {</span>
|
|
<span class="identifier">kind_of_second</span><span class="plain"> = </span><span class="functiontext">PL::Actions::get_data_type_of_second_noun</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kind_of_second</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">kind_of_second</span><span class="plain"> = </span><span class="identifier">K_object</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::le</span><span class="plain">(</span><span class="identifier">kind_of_second</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">SECOND_MATCHES_AS_OBJECT_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">SECOND_MATCHES_AS_VALUE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">ap</span><span class="element">.room_spec</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="element">.applies_to_any_actor</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) && (</span><span class="identifier">naming_mode</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">PLAYER_LOCATION_MATCHES_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">ACTOR_IN_RIGHT_PLACE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">ACTOR_LOCATION_MATCHES_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">ap</span><span class="element">.parameter_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">PARAMETER_MATCHES_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">apoc</span><span class="plain"> = </span><span class="identifier">ap</span><span class="element">.optional_clauses</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">apoc</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">OPTIONAL_CLAUSE_CPMC</span><span class="plain">, </span><span class="identifier">apoc</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">apoc</span><span class="plain"> = </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>next</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.nowhere_flag</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="element">.nowhere_flag</span><span class="plain"> == 1) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">NOWHERE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">SOMEWHERE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">if</span><span class="plain"> ((</span><span class="identifier">ap</span><span class="element">.to_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">ap</span><span class="element">.from_spec</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)||(</span><span class="identifier">ap</span><span class="element">.by_spec</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)||</span>
|
|
<span class="plain">(</span><span class="identifier">ap</span><span class="element">.through_spec</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">)||(</span><span class="identifier">ap</span><span class="element">.pushing_spec</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">))) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">NOT_NOWHERE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">ap</span><span class="element">.presence_spec</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">to_be_present</span><span class="plain"> =</span>
|
|
<span class="identifier">Specifications::object_exactly_described_if_any</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to_be_present</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">PRESENCE_OF_MATCHES_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">PRESENCE_OF_IN_SCOPE_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PC</span><span class="plain"> = </span><span class="identifier">Descriptions::get_calling</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">PC</span><span class="plain">)) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">LOOP_OVER_SCOPE_WITH_CALLING_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">LOOP_OVER_SCOPE_WITHOUT_CALLING_CPMC</span><span class="plain">, </span><span class="identifier">NULL</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">ap</span><span class="element">.when</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">SET_SELF_TO_ACTOR_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_NEEDED</span><span class="plain">(</span><span class="constant">WHEN_CONDITION_HOLDS_CPMC</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<<span class="cwebmacro">Compile the condition from these instructions</span> <span class="cwebmacronumber">34.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::compile_pattern_match is used in <a href="#SP33">§33</a>, 4/act (<a href="4-act.html#SP10">§10</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_1"></a><b>§34.1. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="identifier">CPMC_RANGE</span><span class="plain">(</span><span class="identifier">ix</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">) {</span>
|
|
<span class="identifier">ranges_from</span><span class="plain">[</span><span class="identifier">ix</span><span class="plain">] = </span><span class="identifier">F</span><span class="plain">; </span><span class="identifier">ranges_to</span><span class="plain">[</span><span class="identifier">ix</span><span class="plain">] = </span><span class="identifier">T</span><span class="plain">; </span><span class="identifier">ranges_count</span><span class="plain">[</span><span class="identifier">ix</span><span class="plain">] = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">cpm_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">needed</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] >= </span><span class="identifier">F</span><span class="plain">) && (</span><span class="identifier">needed</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] <= </span><span class="identifier">T</span><span class="plain">))</span>
|
|
<span class="identifier">ranges_count</span><span class="plain">[</span><span class="identifier">ix</span><span class="plain">]++;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Compile the condition from these instructions</span> <span class="cwebmacronumber">34.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ranges_from</span><span class="plain">[4], </span><span class="identifier">ranges_to</span><span class="plain">[4], </span><span class="identifier">ranges_count</span><span class="plain">[4];</span>
|
|
<span class="identifier">CPMC_RANGE</span><span class="plain">(0, </span><span class="constant">ACTOR_IS_PLAYER_CPMC</span><span class="plain">, </span><span class="constant">ACTOR_MATCHES_CPMC</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_RANGE</span><span class="plain">(1, </span><span class="constant">ACTION_MATCHES_CPMC</span><span class="plain">, </span><span class="constant">ACTION_MATCHES_CPMC</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_RANGE</span><span class="plain">(2, </span><span class="constant">NOUN_EXISTS_CPMC</span><span class="plain">, </span><span class="constant">LOOP_OVER_SCOPE_WITHOUT_CALLING_CPMC</span><span class="plain">);</span>
|
|
<span class="identifier">CPMC_RANGE</span><span class="plain">(3, </span><span class="constant">SET_SELF_TO_ACTOR_CPMC</span><span class="plain">, </span><span class="constant">WHEN_CONDITION_HOLDS_CPMC</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</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">range_to_compile</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">LocalVariables::begin_condition_emit</span><span class="plain">();</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::Lists::negated</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[0] > 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 0;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">NOT_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ranges_count</span><span class="plain">[1] == 0) && (</span><span class="identifier">ranges_count</span><span class="plain">[2] == 0))</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 0);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ranges_count</span><span class="plain">[1] > 0) && (</span><span class="identifier">ranges_count</span><span class="plain">[2] > 0)) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[1] > 0) {</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 1;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[2] > 0) {</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 2;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ranges_count</span><span class="plain">[1] > 0) && (</span><span class="identifier">ranges_count</span><span class="plain">[2] > 0)) </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) {</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 3;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[0] > 0) </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">downs</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[1] > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[0]+</span><span class="identifier">ranges_count</span><span class="plain">[2]+</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 1;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[0] > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[2]+</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 0;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[2] > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 2;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ranges_count</span><span class="plain">[3] > 0) {</span>
|
|
<span class="identifier">range_to_compile</span><span class="plain"> = 3;</span>
|
|
<<span class="cwebmacro">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">downs</span><span class="plain"> > 0) { </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">--; }</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ranges_count</span><span class="plain">[0] + </span><span class="identifier">ranges_count</span><span class="plain">[1] + </span><span class="identifier">ranges_count</span><span class="plain">[2] + </span><span class="identifier">ranges_count</span><span class="plain">[3] == 0) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">PL::Actions::Lists::negated</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.action</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LocalVariables::end_condition_emit</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34">§34</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_1_1"></a><b>§34.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Emit CPM range</span> <span class="cwebmacronumber">34.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="string">"Range %d from %d to %d"</span><span class="plain">, </span><span class="identifier">range_to_compile</span><span class="plain">, </span><span class="identifier">ranges_from</span><span class="plain">[</span><span class="identifier">range_to_compile</span><span class="plain">], </span><span class="identifier">ranges_to</span><span class="plain">[</span><span class="identifier">range_to_compile</span><span class="plain">]);</span>
|
|
<span class="identifier">Emit::code_comment</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">downs</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">done</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">cpm_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cpmc</span><span class="plain"> = </span><span class="identifier">needed</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">cpmc</span><span class="plain"> >= </span><span class="identifier">ranges_from</span><span class="plain">[</span><span class="identifier">range_to_compile</span><span class="plain">]) && (</span><span class="identifier">cpmc</span><span class="plain"> <= </span><span class="identifier">ranges_to</span><span class="plain">[</span><span class="identifier">range_to_compile</span><span class="plain">])) {</span>
|
|
<span class="identifier">done</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">done</span><span class="plain"> < </span><span class="identifier">ranges_count</span><span class="plain">[</span><span class="identifier">range_to_compile</span><span class="plain">]) {</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">AND_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">ap_optional_clause</span><span class="plain"> *</span><span class="identifier">apoc</span><span class="plain"> = </span><span class="identifier">needed_apoc</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
|
|
<<span class="cwebmacro">Emit CPM condition piece</span> <span class="cwebmacronumber">34.1.1.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">downs</span><span class="plain"> > 0) { </span><span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">()); </span><span class="identifier">downs</span><span class="plain">--; }</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34_1">§34.1</a> (8 times).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP34_1_1_1"></a><b>§34.1.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Emit CPM condition piece</span> <span class="cwebmacronumber">34.1.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="string">"So %d"</span><span class="plain">, </span><span class="identifier">cpmc</span><span class="plain">);</span>
|
|
<span class="identifier">Emit::code_comment</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">cpmc</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ACTOR_IS_PLAYER_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">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="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PLAYER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">ACTOR_ISNT_PLAYER_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PLAYER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">REQUESTER_EXISTS_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACT_REQUESTER_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">REQUESTER_DOESNT_EXIST_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">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="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACT_REQUESTER_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">ACTOR_MATCHES_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">I6_actor_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.actor_spec</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">FALSE</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">ACTION_MATCHES_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Lists::emit</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.action</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">NOUN_EXISTS_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">NOUN_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">NOUN_IS_INP1_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">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="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">NOUN_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">INP1_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">SECOND_EXISTS_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">SECOND_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">SECOND_IS_INP1_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">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="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">SECOND_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">INP2_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">NOUN_MATCHES_AS_OBJECT_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">I6_noun_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain">,</span>
|
|
<span class="identifier">kind_of_noun</span><span class="plain">, </span><span class="identifier">FALSE</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">NOUN_MATCHES_AS_VALUE_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">,</span>
|
|
<span class="identifier">NonlocalVariables::temporary_from_iname</span><span class="plain">(</span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PARSED_NUMBER_HL</span><span class="plain">), </span><span class="identifier">kind_of_noun</span><span class="plain">),</span>
|
|
<span class="identifier">ap</span><span class="element">.noun_spec</span><span class="plain">, </span><span class="identifier">kind_of_noun</span><span class="plain">, </span><span class="identifier">FALSE</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">SECOND_MATCHES_AS_OBJECT_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">I6_second_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain">,</span>
|
|
<span class="identifier">kind_of_second</span><span class="plain">, </span><span class="identifier">FALSE</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">SECOND_MATCHES_AS_VALUE_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">,</span>
|
|
<span class="identifier">NonlocalVariables::temporary_from_iname</span><span class="plain">(</span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PARSED_NUMBER_HL</span><span class="plain">), </span><span class="identifier">kind_of_second</span><span class="plain">),</span>
|
|
<span class="identifier">ap</span><span class="element">.second_spec</span><span class="plain">, </span><span class="identifier">kind_of_second</span><span class="plain">, </span><span class="identifier">FALSE</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">PLAYER_LOCATION_MATCHES_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">real_location_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ACTOR_IN_RIGHT_PLACE_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_LOCATION_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOCATIONOF_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">ACTOR_LOCATION_MATCHES_CPMC</span><span class="plain">:</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">,</span>
|
|
<span class="identifier">VH</span><span class="plain">, </span><span class="identifier">actor_location_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.room_spec</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PARAMETER_MATCHES_CPMC</span><span class="plain">: {</span>
|
|
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">saved_kind</span><span class="plain"> = </span><span class="identifier">NonlocalVariables::kind</span><span class="plain">(</span><span class="identifier">parameter_object_VAR</span><span class="plain">);</span>
|
|
<span class="identifier">NonlocalVariables::set_kind</span><span class="plain">(</span><span class="identifier">parameter_object_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.parameter_kind</span><span class="plain">);</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">,</span>
|
|
<span class="identifier">parameter_object_VAR</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.parameter_spec</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.parameter_kind</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">NonlocalVariables::set_kind</span><span class="plain">(</span><span class="identifier">parameter_object_VAR</span><span class="plain">, </span><span class="identifier">saved_kind</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="constant">OPTIONAL_CLAUSE_CPMC</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="identifier">StackedVariables::get_kind</span><span class="plain">(</span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">);</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">,</span>
|
|
<span class="identifier">NonlocalVariables::temporary_from_nve</span><span class="plain">(</span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>stv_to_match</span><span class="plain">-></span><span class="identifier">underlying_var</span><span class="plain">-></span><span class="identifier">rvalue_nve</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">),</span>
|
|
<span class="identifier">apoc</span><span class="plain">-</span><span class="element">>clause_spec</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">apoc</span><span class="plain">-</span><span class="element">>allow_region_as_room</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="constant">NOWHERE_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">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="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">MSTACK_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">MSTVON_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 20007);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">SOMEWHERE_CPMC</span><span class="plain">: {</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">somewhere</span><span class="plain"> = </span><span class="identifier">Specifications::from_kind</span><span class="plain">(</span><span class="identifier">K_room</span><span class="plain">);</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">f</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">,</span>
|
|
<span class="identifier">NonlocalVariables::temporary_from_nve</span><span class="plain">(</span><span class="identifier">NonlocalVariables::nve_from_mstack</span><span class="plain">(20007, 1, </span><span class="identifier">TRUE</span><span class="plain">),</span>
|
|
<span class="identifier">K_object</span><span class="plain">),</span>
|
|
<span class="identifier">somewhere</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">FALSE</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="constant">NOT_NOWHERE_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">NE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">LOOKUP_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">MSTACK_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">MSTVON_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 20007);</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">PRESENCE_OF_MATCHES_CPMC</span><span class="plain">: {</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">to_be_present</span><span class="plain"> =</span>
|
|
<span class="identifier">Specifications::object_exactly_described_if_any</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="functiontext">PL::Actions::Patterns::compile_pattern_match_clause</span><span class="plain">(</span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">VH</span><span class="plain">,</span>
|
|
<span class="identifier">NonlocalVariables::temporary_from_iname</span><span class="plain">(</span><span class="identifier">Instances::iname</span><span class="plain">(</span><span class="identifier">to_be_present</span><span class="plain">), </span><span class="identifier">K_object</span><span class="plain">),</span>
|
|
<span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">FALSE</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="constant">PRESENCE_OF_IN_SCOPE_CPMC</span><span class="plain">: {</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">to_be_present</span><span class="plain"> =</span>
|
|
<span class="identifier">Specifications::object_exactly_described_if_any</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TESTSCOPE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Instances::iname</span><span class="plain">(</span><span class="identifier">to_be_present</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">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="constant">LOOP_OVER_SCOPE_WITH_CALLING_CPMC</span><span class="plain">: {</span>
|
|
<span class="reserved">loop_over_scope</span><span class="plain"> *</span><span class="identifier">los</span><span class="plain"> = </span><span class="functiontext">PL::Actions::ScopeLoops::new</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PC</span><span class="plain"> = </span><span class="identifier">Descriptions::get_calling</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="identifier">local_variable</span><span class="plain"> *</span><span class="identifier">lvar</span><span class="plain"> = </span><span class="identifier">LocalVariables::ensure_called_local</span><span class="plain">(</span><span class="identifier">PC</span><span class="plain">,</span>
|
|
<span class="identifier">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">));</span>
|
|
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">lvar_s</span><span class="plain"> = </span><span class="identifier">LocalVariables::declare_this</span><span class="plain">(</span><span class="identifier">lvar</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 8);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOS_RV_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOOPOVERSCOPE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">los</span><span class="plain">-</span><span class="element">>los_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_symbol</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">lvar_s</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOS_RV_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">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="constant">LOOP_OVER_SCOPE_WITHOUT_CALLING_CPMC</span><span class="plain">: {</span>
|
|
<span class="reserved">loop_over_scope</span><span class="plain"> *</span><span class="identifier">los</span><span class="plain"> = </span><span class="functiontext">PL::Actions::ScopeLoops::new</span><span class="plain">(</span><span class="identifier">ap</span><span class="element">.presence_spec</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOS_RV_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOOPOVERSCOPE_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">los</span><span class="plain">-</span><span class="element">>los_iname</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">LOS_RV_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">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="constant">SET_SELF_TO_ACTOR_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">SEQUENTIAL_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">STORE_BIP</span><span class="plain">);</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::ref_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">SELF_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">ACTOR_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_truth_state</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</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">WHEN_CONDITION_HOLDS_CPMC</span><span class="plain">:</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">ap</span><span class="element">.when</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP34_1_1">§34.1.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35"></a><b>§35. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::refers_to_past</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Occurrence::is_valid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">))) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::convert_to_present_tense</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="identifier">Occurrence::make_invalid</span><span class="plain">(&(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>duration</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::pta_acceptable</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">) {</span>
|
|
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Specifications::is_description</span><span class="plain">(</span><span class="identifier">spec</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">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Specifications::object_exactly_described_if_any</span><span class="plain">(</span><span class="identifier">spec</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="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::makes_callings</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Descriptions::makes_callings</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Descriptions::makes_callings</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Descriptions::makes_callings</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Descriptions::makes_callings</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Descriptions::makes_callings</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Descriptions::makes_callings</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::emit_past_tense</span><span class="plain">(</span><span class="reserved">action_pattern</span><span class="plain"> *</span><span class="identifier">ap</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bad_form</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">TESTACTIONBITMAP_HL</span><span class="plain">));</span>
|
|
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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">, 0);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="identifier">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="identifier">inter_t</span><span class="plain">) -1);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>next</span><span class="plain">) </span><span class="identifier">bad_form</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="functiontext">PL::Actions::can_be_compiled_in_past_tense</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
|
|
<span class="identifier">bad_form</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="functiontext">PL::Actions::double_sharp</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>action</span><span class="plain">-</span><span class="element">>action_listed</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">());</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">PL::Actions::Patterns::pta_acceptable</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>noun_spec</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">bad_form</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="functiontext">PL::Actions::Patterns::pta_acceptable</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>second_spec</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">bad_form</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="functiontext">PL::Actions::Patterns::pta_acceptable</span><span class="plain">(</span><span class="identifier">ap</span><span class="plain">-</span><span class="element">>actor_spec</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">bad_form</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">ap</span><span class="plain">-</span><span class="element">>room_spec</span><span class="plain">) </span><span class="identifier">bad_form</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">ap</span><span class="plain">-</span><span class="element">>parameter_spec</span><span class="plain">) </span><span class="identifier">bad_form</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">ap</span><span class="plain">-</span><span class="element">>presence_spec</span><span class="plain">) </span><span class="identifier">bad_form</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">ap</span><span class="plain">-</span><span class="element">>when</span><span class="plain">) </span><span class="identifier">bad_form</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">ap</span><span class="plain">-</span><span class="element">>optional_clauses</span><span class="plain">) </span><span class="identifier">bad_form</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">bad_form</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Issue too complex PT problem</span> <span class="cwebmacronumber">35.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::refers_to_past appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::convert_to_present_tense appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::pta_acceptable appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::makes_callings appears nowhere else.</p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::emit_past_tense appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP35_1"></a><b>§35.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Issue too complex PT problem</span> <span class="cwebmacronumber">35.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_PTAPTooComplex</span><span class="plain">),</span>
|
|
<span class="string">"that is too complex a past tense action"</span><span class="plain">,</span>
|
|
<span class="string">"at least for this version of Inform to handle: we may improve "</span>
|
|
<span class="string">"matters in later releases. The restriction is that the "</span>
|
|
<span class="string">"actions used in the past tense may take at most one "</span>
|
|
<span class="string">"object, and that this must be a physical thing (not a "</span>
|
|
<span class="string">"value, in other words). And no details of where or what "</span>
|
|
<span class="string">"else was then happening can be specified."</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP35">§35</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP36"></a><b>§36. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Actions::Patterns::is_an_action_variable</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">) {</span>
|
|
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">nlv</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spec</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">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lvalues::get_storage_form</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">) != </span><span class="identifier">NONLOCAL_VARIABLE_NT</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="identifier">nlv</span><span class="plain"> = </span><span class="identifier">ParseTree::get_constant_nonlocal_variable</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain"> == </span><span class="identifier">I6_noun_VAR</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain"> == </span><span class="identifier">I6_second_VAR</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nlv</span><span class="plain"> == </span><span class="identifier">I6_actor_VAR</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function PL::Actions::Patterns::is_an_action_variable appears nowhere else.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="4-anl.html">Back to 'Action Name Lists'</a></li><li><a href="4-los.html">Continue with 'Looping Over Scope'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|