1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/5-gv.html
2021-02-05 00:15:21 +00:00

1042 lines
228 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Grammar Verbs</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<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="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</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="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="index.html"><span class="selectedlink">if</span></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="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul><h2>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Grammar Verbs' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">if</a></li><li><a href="index.html#5">Chapter 5: Command Grammar</a></li><li><b>Grammar Verbs</b></li></ul></div>
<p class="purpose">A grammar verb is not literally a verb, as the name is a hangover from the way I6 defines grammar. It might be said to be a necklace onto which we thread the sea-shells of grammar lines. Each grammar verb has its own purpose: to match various possibilities (one for each grammar line) against text aimed at a particular result. For instance, all run time commands beginning with TAKE are parsed with a single grammar verb. If we create a new grammar token, "[polite remark]", for use in other grammar, then that too will have its own "grammar verb". If we define the word "eleventy-one" as meaning the number 111, it will be added to a grammar verb attached to the kind "number" which parses eccentric names for number values. And so on. Probably a better name for this structure would be simply "grammar", but that might be confusing in other ways, and anyway the ship has sailed.</p>
<ul class="toc"><li><a href="5-gv.html#SP5">&#167;5. Command words</a></li><li><a href="5-gv.html#SP12">&#167;12. Named grammar tokens</a></li><li><a href="5-gv.html#SP15">&#167;15. Consultation grammars</a></li><li><a href="5-gv.html#SP16">&#167;16. Subject parsing grammars</a></li><li><a href="5-gv.html#SP17">&#167;17. Data type parsing grammars</a></li><li><a href="5-gv.html#SP18">&#167;18. Property name parsing grammars</a></li><li><a href="5-gv.html#SP19">&#167;19. The list of grammar lines</a></li><li><a href="5-gv.html#SP22">&#167;22. Grammar Preparation</a></li><li><a href="5-gv.html#SP23">&#167;23. Phase I: Slash Grammar</a></li><li><a href="5-gv.html#SP24">&#167;24. Phase II: Determining Grammar</a></li><li><a href="5-gv.html#SP25">&#167;25. Phases III and IV: Sort and Compile Grammar</a></li><li><a href="5-gv.html#SP30">&#167;30. Kinds as GVs</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>There are five different sorts of grammar verb, then, and only the first
of these is associated with a genuine typed-by-the-player command verb:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="comment-syntax"> an imperative verbal command at run-time</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">GV_IS_TOKEN</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax"> </span><span class="comment-syntax"> a square-bracketed token in other grammar</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">GV_IS_OBJECT</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span><span class="plain-syntax"> </span><span class="comment-syntax"> a noun phrase at run time: a name for an object</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">GV_IS_VALUE</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax"> </span><span class="comment-syntax"> a noun phrase at run time: a name for a value</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">GV_IS_CONSULT</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax"> </span><span class="comment-syntax"> a pattern to match in part of a command (such as "consult")</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">GV_IS_PROPERTY_NAME</span><span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax"> </span><span class="comment-syntax"> a noun phrase at run time: a name for an either/or pval</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The following maxima are imposed by the I6 compiler:
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_ALIASED_COMMANDS</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_LINES_PER_COMMAND</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv_is</span><span class="plain-syntax">; </span><span class="comment-syntax"> one of the five values above</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">grammar_type</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv_type</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">grammar_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_line</span><span class="plain-syntax">; </span><span class="comment-syntax"> linked list in creation order</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">grammar_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sorted_first_line</span><span class="plain-syntax">; </span><span class="comment-syntax"> and in logical applicability order</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">command</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">GV_IS_COMMAND</span></span><span class="comment-syntax">: word number at which command found</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_ALIASED_COMMANDS</span><span class="plain-syntax">]; </span><span class="comment-syntax"> ...and other commands synonymous</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_aliased_commands</span><span class="plain-syntax">; </span><span class="comment-syntax"> ...and how many of them there are</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">GV_IS_TOKEN</span></span><span class="comment-syntax">: name of this token</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv_line_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj_understood</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">GV_IS_OBJECT</span></span><span class="comment-syntax">: what this provides names for</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_understood</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">GV_IS_VALUE</span></span><span class="comment-syntax">: for which type it names an instance of</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv_parse_name_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn_understood</span><span class="plain-syntax">; </span><span class="comment-syntax"> </span><span class="extract"><span class="extract-syntax">GV_IS_PROPERTY_NAME</span></span><span class="comment-syntax">: which prn this names</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv_prn_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> the relevant GPR is called this</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where_gv_created</span><span class="plain-syntax">; </span><span class="comment-syntax"> for problem message reports</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv_consult_iname</span><span class="plain-syntax">; </span><span class="comment-syntax"> for the consult parsing routine if needed</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv_I6_identifier</span><span class="plain-syntax">; </span><span class="comment-syntax"> when a token is delegated to an I6 routine</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">slashed</span><span class="plain-syntax">; </span><span class="comment-syntax"> slashing has been done</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">determined</span><span class="plain-syntax">; </span><span class="comment-syntax"> determination has been done</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure grammar_verb is accessed in 1/im, 2/bd, 3/tnt, 3/sm, 3/tp, 3/bck, 3/rgn, 3/tm, 3/em, 3/sc, 3/scn, 4/act, 4/anl, 4/nap, 5/gp, 5/gpr and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>A few imperative verbs are reserved for Inform testing, such as SHOWME.
We record those as instances of the following:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">reserved_command_verb</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">reserved_text</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">reserved_command_verb</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure reserved_command_verb is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>We begin as usual with a constructor and some debug log tracing.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::gv_new</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></span>:<br/><a href="5-gv.html#SP6">&#167;6</a>, <a href="5-gv.html#SP12">&#167;12</a>, <a href="5-gv.html#SP15">&#167;15</a>, <a href="5-gv.html#SP16">&#167;16</a>, <a href="5-gv.html#SP17">&#167;17</a>, <a href="5-gv.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv_is</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_type</span><span class="plain-syntax"> = </span><a href="5-gt.html#SP2" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Types::new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv_is</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sorted_first_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">subj_understood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_understood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_parse_name_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">prn_understood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_consult_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_prn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_line_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_I6_identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">slashed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determined</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::log</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::log</span></span>:<br/>IF Module - <a href="1-im.html#SP3">&#167;3</a>, <a href="1-im.html#SP3_3">&#167;3.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;GV%d:"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_COMMAND:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">)) </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"command=no-verb verb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"command=%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_TOKEN:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"token=%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_OBJECT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"object"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_VALUE:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"value=%u"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_understood</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_CONSULT:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"consult"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_PROPERTY_NAME:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"property-name"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&lt;unknown&gt;"</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"&gt;"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Command words. </b>Some GVs are used to represent the command grammar for imperative verbs
used by the player at run-time. Such a GV handles multiple commands, which
are considered equivalent at run-time: the first of these is the official
command word, and the rest are "aliases". For instance, the Standard Rules
create a GV for the command PULL with one alias, DRAG. (This somewhat
asymmetric approach is used because it matches the way I6 <span class="extract"><span class="extract-syntax">Verb</span></span> declarations
are laid out.)
</p>
<p class="commentary">A complication is that one GV is permitted to be a special case: the
so-called "no verb verb", whose main command word is empty and which
can have no aliases. This is used to parse verbless commands at run-time:
for instance, the I7 designer can specify that a command consisting only
of a number followed by the word GO should cause some action, and this
is implemented not with a command verb but using I6's hooks for verbless
commands. The grammar "[number] go" is attached as a grammar line to
the "no verb verb", which is distinguished by having its command word
number set to <span class="extract"><span class="extract-syntax">-1</span></span>. Note that the "no verb verb" exists only in runs of
Inform where it has been needed: the Standard Rules do not use it.
</p>
<p class="commentary">Command GVs other than the "no verb verb" are said to be "genuinely
verbal".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::get_verb_text</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::get_verb_text</span></span>:<br/>Grammar Lines - <a href="5-gl.html#SP24">&#167;24</a>, <a href="5-gl.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::gv_is_genuinely_verbal</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_is_genuinely_verbal</span></span>:<br/><a href="5-gv.html#SP24">&#167;24</a>, <a href="5-gv.html#SP28">&#167;28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>The next routine finds, or if necessary creates, a GV for a given command
word encountered without any indication that it should alias another. Note
that calling this with word number <span class="extract"><span class="extract-syntax">-1</span></span> finds, or creates, the "no verb
verb".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::find_or_create_command</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::find_or_create_command</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP7" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::find_command</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">NO_VERB_VERB_DEFINED_HL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::named_numeric_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, (</span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax">) </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">global_compilation_settings</span><span class="plain-syntax">.</span><span class="identifier-syntax">no_verb_verb_exists</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR_CONSTRUCTION</span><span class="plain-syntax">, </span><span class="string-syntax">"GV%d has verb %W\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>By contrast, this routine merely finds a GV, or returns null if none
exists with the given command word.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::find_command</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::find_command</span></span>:<br/><a href="5-gv.html#SP6">&#167;6</a><br/>Actions Index - <a href="4-ai.html#SP2">&#167;2</a><br/>Traverse for Grammar - <a href="5-tfg.html#SP15_2_1">&#167;15.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;gv-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">W</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. </b>We now have routines to add or remove commands from a given GV. Removing
is the tricky case, since detaching the main command word means that one
of the aliases must become the new main command; or, in the worst case,
that there are no commands left, in which case we need to empty the GV
of grammar lines so that it can either be ignored or re-used (in the
event that the designer, having cancelled the old meaning of the command,
now supplies new ones).
</p>
<p class="commentary">It is not possible to add to, or remove from, the "no verb verb".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::add_command</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::add_command</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP15_2_1">&#167;15.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to add alias command to null GV"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> != </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to add alias command to non-command GV"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax"> == </span><span class="constant-syntax">MAX_ALIASED_COMMANDS</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_TooManyAliases</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this 'understand the command ... as ...' makes too many aliases "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for the same command"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"exceeding the limit of 32."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Adding alias '%W' to G%d '%W'\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">allocation_id</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::remove_command</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::remove_command</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP15_2_1">&#167;15.2.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to detach alias command from null GV"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> != </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to detach alias command from non-command GV"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Detaching verb '%W' from grammar\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Detached verb is the head-verb\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Which had no aliases: clearing grammar to NULL\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[--(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">)];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Which had aliases: making new head-verb '%W'\n"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Detached verb is one of the aliases\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;gv-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">], </span><span class="identifier-syntax">W</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">=</span><span class="identifier-syntax">i</span><span class="plain-syntax">; </span><span class="identifier-syntax">j</span><span class="function-syntax">&lt;gv-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">-1; </span><span class="identifier-syntax">j</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">j</span><span class="plain-syntax">] = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">j</span><span class="plain-syntax">+1];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::index_command_aliases</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::index_command_aliases</span></span>:<br/>Actions Index - <a href="4-ai.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">n</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"/%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]));</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::remove_action</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::remove_action</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">action_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">an</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> != </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> = </span><a href="5-gl.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Lines::list_remove</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">an</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>Command GVs are destined to be compiled into <span class="extract"><span class="extract-syntax">Verb</span></span> directives, as follows.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::gv_compile_Verb_directive_header</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_Verb_directive_header</span></span>:<br/><a href="5-gv.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">array_iname</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> != </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to compile Verb from non-command GV"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"compiling Verb for empty grammar"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Emit::named_verb_array_begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">array_iname</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::array_dword_entry</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"no.verb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">vt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">vt</span><span class="plain-syntax">, </span><span class="string-syntax">"%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-gv.html#SP10" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::command_verb_reserved</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">vt</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"You wrote %1, but %2 is a built-in Inform testing verb, which "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"means it is reserved for Inform's own use and can't be used "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"for ordinary play purposes. %PThe verbs which are reserved in "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this way are all listed in the alphabetical catalogue on the "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"Actions Index page."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">vt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::array_dword_entry</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;gv-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::array_dword_entry</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">WD</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Reserved verb names are collated as the I6 template files are read:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::reserve</span><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">verb_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">reserved_command_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">reserved_command_verb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">rcv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reserved_text</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP10" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::normalise_cv_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reserved_text</span><span class="plain-syntax">, </span><span class="identifier-syntax">verb_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-ai.html#SP2" class="function-link"><span class="function-syntax">PL::Actions::Index::test_verb</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">rcv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reserved_text</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::command_verb_reserved</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::command_verb_reserved</span></span>:<br/><a href="5-gv.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">verb_tried</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">reserved_command_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">rcv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">normalised_vt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP10" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::normalise_cv_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">normalised_vt</span><span class="plain-syntax">, </span><span class="identifier-syntax">verb_tried</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">rcv</span><span class="plain-syntax">, </span><span class="reserved-syntax">reserved_command_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">normalised_vt</span><span class="plain-syntax">, </span><span class="identifier-syntax">rcv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">reserved_text</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">normalised_vt</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::normalise_cv_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::clear</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; (</span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;31) &amp;&amp; (</span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">)); </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">Characters::tolower</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">)));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>The "Commands available to the player" portion of the Actions index page
is, in effect, an alphabetised merge of the GLs found within the command GVs.
GLs for the "no verb verb" appear under the special headword "0" (which
is not displayed); otherwise GLs appear under the main command word, and
aliases are shown with references like: "drag", same as "pull".
</p>
<p class="commentary">One routine takes a GV and creates suitable entries for the Actions index
to process; the other two routines act upon any such entries once they are
needed.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::make_command_index_entries</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::make_command_index_entries</span></span>:<br/>Actions Index - <a href="4-ai.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::empty</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="4-ai.html#SP2" class="function-link"><span class="function-syntax">PL::Actions::Index::vie_new_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"0"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="constant-syntax">NORMAL_COMMAND</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="4-ai.html#SP2" class="function-link"><span class="function-syntax">PL::Actions::Index::vie_new_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">)), </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="constant-syntax">NORMAL_COMMAND</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;gv-&gt;</span><span class="element-syntax">no_aliased_commands</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><a href="4-ai.html#SP2" class="function-link"><span class="function-syntax">PL::Actions::Index::vie_new_from</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">aliased_command</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">])), </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="constant-syntax">ALIAS_COMMAND</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::index_normal</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::index_normal</span></span>:<br/>Actions Index - <a href="4-ai.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">headword</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP21" class="function-link"><span class="function-syntax">PL::Parsing::Lines::sorted_list_index_normal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sorted_first_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">headword</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::index_alias</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::index_alias</span></span>:<br/>Actions Index - <a href="4-ai.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">headword</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"&amp;quot;%S&amp;quot;, &lt;i&gt;same as&lt;/i&gt; &amp;quot;%N&amp;quot;"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">headword</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">link</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">link</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">command</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Index::below_link</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">link</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">link</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_TAG</span><span class="plain-syntax">(</span><span class="string-syntax">"br"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>&#167;12. Named grammar tokens. </b>These are like text substitutions in reverse. For instance, we could define
a token "[suitable colour]". These are identified solely by their textual
names (e.g., "suitable colour").
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::named_token_new</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::named_token_new</span></span>:<br/><a href="5-gv.html#SP14">&#167;14</a><br/>Traverse for Grammar - <a href="5-tfg.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP12" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::named_token_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">GV_IS_TOKEN</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::local_package</span><span class="plain-syntax">(</span><span class="identifier-syntax">NAMED_TOKENS_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_line_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">PARSE_LINE_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">PR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::named_token_by_name</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::named_token_by_name</span></span>:<br/>Grammar Tokens - <a href="5-gt2.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_TOKEN</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>&#167;13. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::index_tokens</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::index_tokens</span></span>:<br/>Actions Index - <a href="4-ai.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"anybody"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"someone_token"</span><span class="plain-syntax">, </span><span class="string-syntax">"same as \"[someone]\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"anyone"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"someone_token"</span><span class="plain-syntax">, </span><span class="string-syntax">"same as \"[someone]\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"anything"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="string-syntax">"same as \"[thing]\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"other things"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"somebody"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"someone_token"</span><span class="plain-syntax">, </span><span class="string-syntax">"same as \"[someone]\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"someone"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"someone_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"something"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="string-syntax">"same as \"[thing]\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"something preferably held"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"text"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"text_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"things"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"things inside"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_WORDING</span><span class="plain-syntax">, </span><span class="string-syntax">"things preferably held"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"things_token"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_TOKEN</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sorted_first_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::index_tokens_for</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">special</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">where</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">defns</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">help</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">explanation</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML::open_indented_p</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="string-syntax">"tight"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\"["</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">special</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%s"</span><span class="plain-syntax">, </span><span class="identifier-syntax">special</span><span class="plain-syntax">); </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%+W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"]\""</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">where</span><span class="plain-syntax">) </span><span class="identifier-syntax">Index::link</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">where</span><span class="plain-syntax">)));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">help</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">Index::DocReferences::link</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">help</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">explanation</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" - %s"</span><span class="plain-syntax">, </span><span class="identifier-syntax">explanation</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">HTML_CLOSE</span><span class="plain-syntax">(</span><span class="string-syntax">"p"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">defns</span><span class="plain-syntax">) </span><a href="5-gl.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Lines::index_list_for_token</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">defns</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>&#167;14. </b>A slight variation is provided by those which are defined by I6 routines.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::translates</span><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_TOKEN</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">Wordings::match</span><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_GrammarTranslatedAlready</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this grammar token has already been translated"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"so there must be some duplication somewhere."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP12" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::named_token_new</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_I6_identifier</span><span class="plain-syntax">, </span><span class="string-syntax">"%N"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p2</span><span class="plain-syntax">)));</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::i6_token_as_iname</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::i6_token_as_iname</span></span>:<br/>Grammar Tokens - <a href="5-gt2.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_I6_identifier</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Produce::find_by_name</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_I6_identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_line_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no token GPR"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_line_iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>&#167;15. Consultation grammars. </b>These are used for grammar included as a column of a table or in a
conditional match. The terminology goes back to the early days of I6, when
CONSULT was a command capable of parsing arbitrary text, something which
a game called Curses made heavy use of.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::consultation_new</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::consultation_new</span></span>:<br/>General Parsing Routines - <a href="5-gpr.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">GV_IS_CONSULT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP16" class="paragraph-anchor"></a><b>&#167;16. Subject parsing grammars. </b>Each inference subject can optionally have a GV, used to parse unusual forms of
its name (though of course many subjects are never parsed at all, so this is
only used in practice for objects and their kinds). The following routine finds
or creates such.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::for_subject</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::for_subject</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax"> != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">GV_IS_OBJECT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">subj_understood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">subj</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::take_out_one_word_grammar</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::take_out_one_word_grammar</span></span>:<br/>Grammar Properties - <a href="5-gp.html#SP10_1">&#167;10.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> != </span><span class="constant-syntax">GV_IS_OBJECT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"One-word optimisation applies only to objects"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> = </span><a href="5-gl.html#SP10" class="function-link"><span class="function-syntax">PL::Parsing::Lines::list_take_out_one_word_grammar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::allow_mixed_lines</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::allow_mixed_lines</span></span>:<br/>Grammar Lines - <a href="5-gl.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_OBJECT</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_VALUE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP17" class="paragraph-anchor"></a><b>&#167;17. Data type parsing grammars. </b>Each kind can optionally have a GV, used to parse unusual forms of
its literals. The following routine finds or creates this.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::for_kind</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::for_kind</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-gv.html#SP30" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::get_parsing_grammar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">) != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-gv.html#SP30" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::get_parsing_grammar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">GV_IS_VALUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP30" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::set_parsing_grammar</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kind_understood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP18" class="paragraph-anchor"></a><b>&#167;18. Property name parsing grammars. </b>Only either/or properties can have a GV, used to parse unusual forms of
the alternatives as used when properties are describing objects. The
following routine finds or creates this for a given property.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::for_prn</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::for_prn</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Properties::EitherOr::get_parsing_grammar</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) != </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">Properties::EitherOr::get_parsing_grammar</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_new</span></a><span class="plain-syntax">(</span><span class="constant-syntax">GV_IS_PROPERTY_NAME</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Properties::EitherOr::set_parsing_grammar</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">prn_understood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prn</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_prn_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">EITHER_OR_GPR_FN_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Properties::package</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP19" class="paragraph-anchor"></a><b>&#167;19. The list of grammar lines. </b>Every GV has a list of GLs: indeed, this list is really the grammar. Here
we test this for emptiness, and provide for adding to it. Removals are not
possible.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::is_empty</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::is_empty</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP15_2_1">&#167;15.2.1</a><br/>General Parsing Routines - <a href="5-gpr.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::add_line</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::add_line</span></span>:<br/>Traverse for Grammar - <a href="5-tfg.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Adding grammar line $g to verb $G\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gl</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="5-gl.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Lines::list_length</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">MAX_LINES_PER_COMMAND</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_TooManyGrammarLines</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"this command verb now has too many Understand possibilities"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"that is, there are too many 'Understand \"whatever ...\" as ...' "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"which share the same initial word 'whatever'. The best way to "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"get around this is to try to consolidate some of those lines "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"together, perhaps by using slashes to combine alternative "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"wordings, or by defining new grammar tokens [in square brackets]."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> = </span><a href="5-gl.html#SP4" class="function-link"><span class="function-syntax">PL::Parsing::Lines::list_add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">gl</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP20" class="paragraph-anchor"></a><b>&#167;20. </b>Each GV has the potential to carry a kind made up of the number of
values produced, and what their types are. This is only really meaningful
for the GVs trying to express a single value: the following routine returns
<span class="extract"><span class="extract-syntax">UNKNOWN_NT</span></span> unless that's the case.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::get_data_type_as_token</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::get_data_type_as_token</span></span>:<br/>Grammar Tokens - <a href="5-gt2.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-gt.html#SP3" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Types::get_data_type_as_token</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_type</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP21" class="paragraph-anchor"></a><b>&#167;21. </b>Some tokens require suitable I6 routines to have already been compiled,
if they are to work nicely: the following routine goes through the tokens
by exploring each GV in turn.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::compile_conditions</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP5" class="function-link"><span class="function-syntax">PL::Parsing::Lines::line_list_compile_condition_tokens</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP22" class="paragraph-anchor"></a><b>&#167;22. Grammar Preparation. </b>This simply causes Phases I and II of grammar processing to take place, one
after the other.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::prepare</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP23" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_slash_all</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP24" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_determine_all</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP23" class="paragraph-anchor"></a><b>&#167;23. Phase I: Slash Grammar. </b>Slashing is really a grammar-line based activity, so we do no more than
pass the buck down to the list of grammar lines.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::gv_slash_all</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_slash_all</span></span>:<br/><a href="5-gv.html#SP22">&#167;22</a>, <a href="5-gv.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::new_stage</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Slashing grammar (G1)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">slashed</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR_CONSTRUCTION</span><span class="plain-syntax">, </span><span class="string-syntax">"Slashing $G\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP11" class="function-link"><span class="function-syntax">PL::Parsing::Lines::line_list_slash</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">slashed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP24" class="paragraph-anchor"></a><b>&#167;24. Phase II: Determining Grammar. </b>Again, at this top level we are really only calling downwards.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::gv_determine_all</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_determine_all</span></span>:<br/><a href="5-gv.html#SP22">&#167;22</a>, <a href="5-gv.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::new_stage</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Determining grammar (G2)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determined</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP24" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::determine</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">determined</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::determine</span><button class="popup" onclick="togglePopup('usagePopup31')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup31">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::determine</span></span>:<br/>Grammar Tokens - <a href="5-gt2.html#SP10_1">&#167;10.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec_union</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-gt.html#SP3" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Types::has_return_type</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_type</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-gt.html#SP3" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Types::get_single_type</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_type</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">depth</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">NUMBER_CREATED</span><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><span class="identifier-syntax">Task::syntax_tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_GrammarIllFounded</span><span class="plain-syntax">),</span>
<span class="plain-syntax"> </span><span class="string-syntax">"grammar tokens are not allowed to be defined in terms of "</span>
<span class="plain-syntax"> </span><span class="string-syntax">"themselves"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="string-syntax">"either directly or indirectly."</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR_CONSTRUCTION</span><span class="plain-syntax">, </span><span class="string-syntax">"Determining $G\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">spec_union</span><span class="plain-syntax"> = </span><a href="5-gl.html#SP13" class="function-link"><span class="function-syntax">PL::Parsing::Lines::line_list_determine</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">depth</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><a href="5-gv.html#SP5" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_is_genuinely_verbal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR_CONSTRUCTION</span><span class="plain-syntax">, </span><span class="string-syntax">"Result of verb $G is $P\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec_union</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gt.html#SP3" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Types::set_single_type</span></a><span class="plain-syntax">(&amp;(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_type</span><span class="plain-syntax">), </span><span class="identifier-syntax">spec_union</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">spec_union</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP25" class="paragraph-anchor"></a><b>&#167;25. Phases III and IV: Sort and Compile Grammar. </b>At this highest level phases III and IV are intermingled, in that Phase III
always precedes Phase IV for any given list of grammar lines, but each GV
goes through both Phase III and IV before the next begins Phase III. So it
would not be appropriate to print banners like "Phase III begins here"
in the debugging log.
</p>
<p class="commentary">Finally, though, some substantive work to do: because it is the GV which
records the purpose of the grammar in question, we must compile a suitable
I6 context for the grammar to appear within.
</p>
<p class="commentary">Four of the five kinds of GV are compiled by the routine below: the fifth
kind is compiled in "Tokens Parsing Values", in response to different
<span class="extract"><span class="extract-syntax">.i6t</span></span> commands, because the token routines are needed at a different position
in the final I6 output.
</p>
<p class="commentary">Sequence is important here: in particular the GPRs must exist before the
<span class="extract"><span class="extract-syntax">Verb</span></span> directives, because otherwise I6 will throw not-declared-yet errors.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_REVERSE_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_SLASH_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_DIVIDER_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_RESULT_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_SPECIAL_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_NUMBER_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_NOUN_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTI_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIINSIDE_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIHELD_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_HELD_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_CREATURE_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_TOPIC_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIEXCEPT_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::named_numeric_constant</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Hierarchy::make_available</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">iname</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::compile_all</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP23" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_slash_all</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP24" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_determine_all</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Log::new_stage</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"Sorting and compiling non-value grammar (G3, G4)"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_REVERSE_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_REVERSE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_SLASH_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_SLASH_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_DIVIDER_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_DIVIDER_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_RESULT_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_RESULT_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_SPECIAL_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_SPECIAL_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">3</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_NUMBER_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_NUMBER_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_NOUN_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_NOUN_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">5</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_MULTI_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTI_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">6</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIINSIDE_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIINSIDE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">7</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIHELD_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIHELD_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">8</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_HELD_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_HELD_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_CREATURE_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_CREATURE_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">10</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_TOPIC_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_TOPIC_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">11</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIEXCEPT_iname</span><span class="plain-syntax"> = </span><a href="5-gv.html#SP25" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::grammar_constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DIRECTIVE_MULTIEXCEPT_HL</span><span class="plain-syntax">, </span><span class="constant-syntax">12</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_TOKEN</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP26" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> makes GPRs for designed tokens</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_COMMAND</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP26" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> makes </span><span class="extract"><span class="extract-syntax">Verb</span></span><span class="comment-syntax"> directives</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_OBJECT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP26" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> makes routines for use in </span><span class="extract"><span class="extract-syntax">parse_name</span></span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_CONSULT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP26" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> routines to parse snippets, used as values</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> == </span><span class="constant-syntax">GV_IS_PROPERTY_NAME</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP26" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> makes routines for use in </span><span class="extract"><span class="extract-syntax">parse_name</span></span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP20" class="function-link"><span class="function-syntax">PL::Parsing::Lines::compile_slash_gprs</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP26" class="paragraph-anchor"></a><b>&#167;26. </b>The following routine unites, so far as possible, the different forms of
GV by compiling each of them as a sandwich: top slice, filling, bottom slice.
The interesting case is of a GV representing names for an object: the
name-behaviour needs to be inherited from the object's kind, and so on up
the kinds hierarchy, but this is a case where I7's kind hierarchy does not
agree with I6's class hierarchy. I6 has no (nice) way to inherit <span class="extract"><span class="extract-syntax">parse_name</span></span>
behaviour from a class to an instance. So we will simply pile up extra
fillings into the sandwich. The order of these is important: by getting
in first, grammar for the instance takes priority; its immediate kind has
next priority, and so on up the hierarchy.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::compile</span><button class="popup" onclick="togglePopup('usagePopup32')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup32">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::compile</span></span>:<br/><a href="5-gv.html#SP25">&#167;25</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling grammar verb $G\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP18" class="function-link"><span class="function-syntax">PL::Parsing::Lines::reset_labels</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_COMMAND:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">package_request</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PR</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::synoptic_package</span><span class="plain-syntax">(</span><span class="identifier-syntax">COMMANDS_HAP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">array_iname</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Hierarchy::make_iname_in</span><span class="plain-syntax">(</span><span class="identifier-syntax">VERB_DECLARATION_ARRAY_HL</span><span class="plain-syntax">, </span><span class="identifier-syntax">PR</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> =</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP9" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_Verb_directive_header</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">array_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Emit::array_end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_TOKEN:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> </span><span class="identifier-syntax">gprk</span><span class="plain-syntax"> = </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::new_kit</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_line_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"gv token not ready"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_line_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_original</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_standard_set</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">original_wn_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">WN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">rv_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GPR_PREPOSITION_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GPR_FAIL_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_CONSULT:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> </span><span class="identifier-syntax">gprk</span><span class="plain-syntax"> = </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::new_kit</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">iname</span><span class="plain-syntax"> = </span><a href="5-gpr.html#SP3" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::General::consult_iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_range_calls</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_original</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_standard_set</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">WN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">range_from_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">original_wn_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">WN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">rv_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GPR_PREPOSITION_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GPR_FAIL_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_OBJECT:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> </span><span class="identifier-syntax">gprk</span><span class="plain-syntax"> = </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::new_kit</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Emit::unused_packaging_state</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-gpr.html#SP6" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::General::compile_parse_name_head</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">save</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">subj_understood</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP27" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_parse_name_lines</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gpr.html#SP9" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::General::compile_parse_name_tail</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_VALUE:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"iv"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">GV_IS_PROPERTY_NAME:</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> </span><span class="identifier-syntax">gprk</span><span class="plain-syntax"> = </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::new_kit</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_prn_iname</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"PRN PN not ready"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">packaging_state</span><span class="plain-syntax"> </span><span class="identifier-syntax">save</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Routines::begin</span><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_prn_iname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_original</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-tpv.html#SP1" class="function-link"><span class="function-syntax">PL::Parsing::Tokens::Values::add_standard_set</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">original_wn_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">WN_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">STORE_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::ref_symbol</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">gprk</span><span class="plain-syntax">.</span><span class="element-syntax">rv_s</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GPR_PREPOSITION_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::inv_primitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">RETURN_BIP</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::val_iname</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">(), </span><span class="identifier-syntax">K_value</span><span class="plain-syntax">, </span><span class="identifier-syntax">Hierarchy::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">GPR_FAIL_HL</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Produce::up</span><span class="plain-syntax">(</span><span class="identifier-syntax">Emit::tree</span><span class="plain-syntax">());</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Routines::end</span><span class="plain-syntax">(</span><span class="identifier-syntax">save</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::compile_iv</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::compile_iv</span></span>:<br/>Tokens Parsing Values - <a href="5-tpv.html#SP1">&#167;1</a>, <a href="5-tpv.html#SP1_1">&#167;1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Compiling grammar verb $G\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">where_gv_created</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP18" class="function-link"><span class="function-syntax">PL::Parsing::Lines::reset_labels</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax"> != </span><span class="constant-syntax">GV_IS_VALUE</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"not iv"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP27" class="paragraph-anchor"></a><b>&#167;27. </b>The special thing about <span class="extract"><span class="extract-syntax">GV_IS_OBJECT</span></span> grammars is that each is attached
to an inference subject, and when we compile them we recurse up the subject
hierarchy: thus if the red ball is of kind ball which is of kind thing,
then the <span class="extract"><span class="extract-syntax">parse_name</span></span> for the red ball consists of grammar lines specified
for the red ball, then those specified for all balls, and lastly those
specified for all things. (This mimics I6 class-to-instance inheritance.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::gv_compile_parse_name_lines</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_parse_name_lines</span></span>:<br/><a href="5-gv.html#SP26">&#167;26</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">subj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">subj_understood</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax"> != </span><span class="identifier-syntax">gv</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"link between subject and GV broken"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"Parse_name content for $j:\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">subj</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InferenceSubjects::narrowest_broader_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">subj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">infs</span><span class="plain-syntax">; </span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InferenceSubjects::narrowest_broader_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">GRAMMAR</span><span class="plain-syntax">, </span><span class="string-syntax">"And parse_name content inherited from $j:\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP28" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">PF_S</span><span class="plain-syntax">(</span><span class="identifier-syntax">parsing</span><span class="plain-syntax">, </span><span class="identifier-syntax">infs</span><span class="plain-syntax">)-&gt;</span><span class="element-syntax">understand_as_this_object</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP28" class="paragraph-anchor"></a><b>&#167;28. </b>All other grammars are compiled just as they are:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span><button class="popup" onclick="togglePopup('usagePopup35')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup35">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::gv_compile_lines</span></span>:<br/><a href="5-gv.html#SP26">&#167;26</a>, <a href="5-gv.html#SP27">&#167;27</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">gpr_kit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP22" class="function-link"><span class="function-syntax">PL::Parsing::Lines::list_assert_ownership</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> Mark for later indexing</span>
<span class="plain-syntax"> </span><a href="5-gv.html#SP29" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::sort_grammar_verb</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">); </span><span class="comment-syntax"> Phase III for the GLs in the GV happens here</span>
<span class="plain-syntax"> </span><a href="5-gl.html#SP17" class="function-link"><span class="function-syntax">PL::Parsing::Lines::sorted_line_list_compile</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gprk</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sorted_first_line</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">gv_is</span><span class="plain-syntax">, </span><span class="identifier-syntax">gv</span><span class="plain-syntax">, </span><a href="5-gv.html#SP5" class="function-link"><span class="function-syntax">PL::Parsing::Verbs::gv_is_genuinely_verbal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">)); </span><span class="comment-syntax"> And Phase IV here</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP29" class="paragraph-anchor"></a><b>&#167;29. </b>All of that was really Phase IV work (compiling), but a very little Phase
III business also happens at this top level. Note that some grammars are
compiled more than once (if a red ball and a blue ball are both of kind
ball, then compiling grammars for them will also involve compiling grammars
for the ball in each case: see above), so the following routine may well be
called more than once for the same GV. We only want to sort once, though, so:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::sort_grammar_verb</span><button class="popup" onclick="togglePopup('usagePopup36')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup36">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::sort_grammar_verb</span></span>:<br/><a href="5-gv.html#SP28">&#167;28</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sorted_first_line</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">sorted_first_line</span><span class="plain-syntax"> = </span><a href="5-gl.html#SP15" class="function-link"><span class="function-syntax">PL::Parsing::Lines::list_sort</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gv</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_line</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP30" class="paragraph-anchor"></a><b>&#167;30. Kinds as GVs. </b>If the user writes lines in the source text such as
</p>
<blockquote>
<p>Understand "eleventy-one" as 111.</p>
</blockquote>
<p class="commentary">then grammar lines will have to be attached to a kind; in fact, a kind can
have its own <span class="extract"><span class="extract-syntax">grammar_verb</span></span> structure attached, which holds a sequence of
such grammar lines. (These are possibilities in addition to those provided
by any GPR existing because of the above routines.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">PL::Parsing::Verbs::set_parsing_grammar</span><button class="popup" onclick="togglePopup('usagePopup37')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup37">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::set_parsing_grammar</span></span>:<br/><a href="5-gv.html#SP17">&#167;17</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"wrong way to handle object grammar"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">understand_as_values</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">grammar_verb</span><span class="plain-syntax"> *</span><span class="function-syntax">PL::Parsing::Verbs::get_parsing_grammar</span><button class="popup" onclick="togglePopup('usagePopup38')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup38">Usage of <span class="code-font"><span class="function-syntax">PL::Parsing::Verbs::get_parsing_grammar</span></span>:<br/><a href="5-gv.html#SP17">&#167;17</a><br/>Tokens Parsing Values - <a href="5-tpv.html#SP1">&#167;1</a>, <a href="5-tpv.html#SP1_1">&#167;1.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"wrong way to handle object grammar"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">construct</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">understand_as_values</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-gp.html">&#10094;</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-ifi.html">2</a></li><li class="progresschapter"><a href="3-tnt.html">3</a></li><li class="progresschapter"><a href="4-act.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-itg.html">itg</a></li><li class="progresssection"><a href="5-tfg.html">tfg</a></li><li class="progresssection"><a href="5-gp.html">gp</a></li><li class="progresscurrent">gv</li><li class="progresssection"><a href="5-gl.html">gl</a></li><li class="progresssection"><a href="5-gt.html">gt</a></li><li class="progresssection"><a href="5-gt2.html">gt2</a></li><li class="progresssection"><a href="5-nft.html">nft</a></li><li class="progresssection"><a href="5-tpv.html">tpv</a></li><li class="progresssection"><a href="5-gpr.html">gpr</a></li><li class="progressnext"><a href="5-gl.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>