1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/22-ph.html
2019-08-24 11:21:48 +01:00

653 lines
66 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>22/cs</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '22/ph' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#22">Chapter 22: Phrases</a></li><li><b>Phrases</b></li></ul><p class="purpose">To create one |phrase| object for each phrase declaration in the source text.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP9">&#167;9. Miscellaneous</a></li><li><a href="#SP12">&#167;12. Compilation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>As noted in the introduction to this chapter, a <code class="display"><span class="extract">phrase</span></code> structure is
created for each "To..." definition and each rule in the source text. It is
divided internally into five substructures, the PHTD, PHUD, PHRCD, PHSF
and PHOD.
</p>
<p class="inwebparagraph">Two more abbreviations appear in this section. The first is the EFF, or
the "effect" of a phrase, which categorises all phrases into four:
"To..." phrases, phrases used to define adjective, rules explicitly naming
a rulebook they belong to, and rules not doing so. (This is called the "effect"
because it decides under what circumstances the phrase will be executed
at run-time.)
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">TO_PHRASE_EFF</span><span class="plain"> 1 </span> <span class="comment">"To award (some - number) points: ..."</span>
<span class="definitionkeyword">define</span> <span class="constant">RULE_IN_RULEBOOK_EFF</span><span class="plain"> 2 </span> <span class="comment">"Before taking a container, ..."</span>
<span class="definitionkeyword">define</span> <span class="constant">RULE_NOT_IN_RULEBOOK_EFF</span><span class="plain"> 3 </span> <span class="comment">"At 9 PM: ...", "This is the zap rule: ..."</span>
<span class="definitionkeyword">define</span> <span class="constant">DEFINITIONAL_PHRASE_EFF</span><span class="plain"> 4 </span> <span class="comment">"Definition: a container is roomy if: ..."</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The second new abbreviation is MOR, the "manner of return", which is only
of interest for "To..." phrases. Some of these decide a value, some decide a
condition, some decide nothing (but exist in order to do something); the
exceptional case is the last, <code class="display"><span class="extract">DECIDES_NOTHING_AND_RETURNS_MOR</span></code>, which marks
out a phrase which exits the phrase it is invoked from &mdash; like the statement
<code class="display"><span class="extract">return</span></code> in a C function. (There is no way to create such a phrase in source
text without using an inline definition, and the intention is that only the
Standard Rules will ever make phrases like it.)
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">DONT_KNOW_MOR</span><span class="plain"> 1 </span> <span class="comment">but ask me later</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDES_NOTHING_MOR</span><span class="plain"> 2 </span> <span class="comment">e.g., "award 4 points"</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDES_VALUE_MOR</span><span class="plain"> 3 </span> <span class="comment">e.g., "square root of 16"</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDES_CONDITION_MOR</span><span class="plain"> 4 </span> <span class="comment">e.g., "a random chance of 1 in 3 succeeds"</span>
<span class="definitionkeyword">define</span> <span class="constant">DECIDES_NOTHING_AND_RETURNS_MOR</span><span class="plain"> 5 </span> <span class="comment">e.g., "continue the action"</span>
</pre>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And here is the structure. Note that the MOR and EFF are stored inside
the sub-structures, and aren't visible here; but they're relevant to the
code below.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">phrase</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">declaration_node</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">ROUTINE_NT</span></code> node where declared</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inline_wn</span><span class="plain">; </span> <span class="comment">word number of inline I6 definition, or <code class="display"><span class="extract">-1</span></code> if not inline</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_schema</span><span class="plain"> *</span><span class="identifier">inter_head_defn</span><span class="plain">; </span> <span class="comment">inline definition translated to inter, if possible</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_schema</span><span class="plain"> *</span><span class="identifier">inter_tail_defn</span><span class="plain">; </span> <span class="comment">inline definition translated to inter, if possible</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inter_defn_converted</span><span class="plain">; </span> <span class="comment">has this been tried yet?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inline_mor</span><span class="plain">; </span> <span class="comment">manner of return for inline I6 definition, or <code class="display"><span class="extract">UNKNOWN_NT</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">ph_documentation_symbol</span><span class="plain">; </span> <span class="comment">cross-reference with documentation</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">compilation_module</span><span class="plain"> *</span><span class="identifier">owning_module</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">requests_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">rule_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ph_type_data</span><span class="plain"> </span><span class="identifier">type_data</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ph_usage_data</span><span class="plain"> </span><span class="identifier">usage_data</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ph_runtime_context_data</span><span class="plain"> </span><span class="identifier">runtime_context_data</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ph_stack_frame</span><span class="plain"> </span><span class="identifier">stack_frame</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ph_options_data</span><span class="plain"> </span><span class="identifier">options_data</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">at_least_one_compiled_form_needed</span><span class="plain">; </span> <span class="comment">do we still need to compile this?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">compile_with_run_time_debugging</span><span class="plain">; </span> <span class="comment">in the RULES command</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">ph_iname</span><span class="plain">; </span> <span class="comment">or NULL for inline phrases</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">imported</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">next_in_logical_order</span><span class="plain">; </span> <span class="comment">for "to..." phrases only</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sequence_count</span><span class="plain">; </span> <span class="comment">within the logical order list, from 0</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">phrase</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure phrase is accessed in 2/si, 10/cap, 14/rv, 14/ds2, 15/pr, 20/eq, 21/rl, 21/rb, 21/rl2, 21/ac, 22/cs, 22/pu, 22/prcd, 22/ptd, 22/dptd, 22/po, 22/pav, 22/tp, 22/tp2, 22/pi, 25/in, 25/pi, 25/ci, 25/cii, 25/cp and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>"To..." phrases, though no others, are listed in logical precedence order:
</p>
<pre class="display">
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">first_in_logical_order</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The life of a <code class="display"><span class="extract">phrase</span></code> structure begins when we look at the parse-tree
representation of its declaration in the source text.
</p>
<p class="inwebparagraph">A phrase is inline if and only if its definition consists of a single
invocation which is given as verbatim I6.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::create_from_preamble</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) != </span><span class="constant">ROUTINE_NT</span><span class="plain">))</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"a phrase preamble should be at a ROUTINE_NT node"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inline_wn</span><span class="plain"> = -1; </span> <span class="comment">the word number of an inline I6 definition if any</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mor</span><span class="plain"> = </span><span class="constant">DONT_KNOW_MOR</span><span class="plain">; </span> <span class="comment">and its manner of return</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span> <span class="comment">the text of the phrase options, if any</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">documentation_W</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span> <span class="comment">the documentation reference, if any</span>
&lt;<span class="cwebmacro">Look for an inline definition</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">ph_options_data</span><span class="plain"> </span><span class="identifier">phod</span><span class="plain">;</span>
<span class="reserved">ph_type_data</span><span class="plain"> </span><span class="identifier">phtd</span><span class="plain">;</span>
<span class="reserved">ph_usage_data</span><span class="plain"> </span><span class="identifier">phud</span><span class="plain">;</span>
<span class="reserved">ph_stack_frame</span><span class="plain"> </span><span class="identifier">phsf</span><span class="plain">;</span>
<span class="reserved">ph_runtime_context_data</span><span class="plain"> </span><span class="identifier">phrcd</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Parse for the PHUD in fine mode</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">effect</span><span class="plain"> = </span><span class="functiontext">Phrases::Usage::get_effect</span><span class="plain">(&amp;</span><span class="identifier">phud</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">inline_wn</span><span class="plain"> &gt;= 0) &amp;&amp; (</span><span class="identifier">effect</span><span class="plain"> != </span><span class="constant">TO_PHRASE_EFF</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Inline is for To... phrases only</span> <span class="cwebmacronumber">6.10</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">effect</span><span class="plain"> != </span><span class="constant">DEFINITIONAL_PHRASE_EFF</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
&lt;<span class="cwebmacro">There seems to be no definition</span> <span class="cwebmacronumber">6.9</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Construct the PHTD, find the phrase options, find the documentation reference</span> <span class="cwebmacronumber">6.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Construct the PHOD</span> <span class="cwebmacronumber">6.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Construct the PHSF, using the PHTD and PHOD</span> <span class="cwebmacronumber">6.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Construct the PHRCD</span> <span class="cwebmacronumber">6.6</span>&gt;<span class="plain">;</span>
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">new_ph</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Create the phrase structure</span> <span class="cwebmacronumber">6.8</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Tell other parts of Inform about this new phrase</span> <span class="cwebmacronumber">6.7</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::create_from_preamble is used in 22/cs (<a href="22-cs.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Look for an inline definition</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">) &amp;&amp; (</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="functiontext">Phrases::parse_possible_inline_defn</span><span class="plain">(</span>
<span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">), &amp;</span><span class="identifier">inline_wn</span><span class="plain">, &amp;</span><span class="identifier">mor</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inline_wn</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">inline_defn</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">inline_wn</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wide::len</span><span class="plain">(</span><span class="identifier">inline_defn</span><span class="plain">) &gt;= </span><span class="constant">MAX_INLINE_DEFN_LENGTH</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Forbid overly long inline definitions</span> <span class="cwebmacronumber">6.1.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse for the PHUD in fine mode</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">phud</span><span class="plain"> = </span><span class="functiontext">Phrases::Usage::new</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">), </span><span class="identifier">FALSE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Construct the PHTD, find the phrase options, find the documentation reference</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="functiontext">Phrases::Usage::get_preamble_text</span><span class="plain">(&amp;</span><span class="identifier">phud</span><span class="plain">);</span>
<span class="identifier">phtd</span><span class="plain"> = </span><span class="functiontext">Phrases::TypeData::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inline_wn</span><span class="plain"> &gt;= 0) </span><span class="functiontext">Phrases::TypeData::make_inline</span><span class="plain">(&amp;</span><span class="identifier">phtd</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">effect</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TO_PHRASE_EFF</span><span class="plain">:</span>
<span class="identifier">documentation_W</span><span class="plain"> = </span><span class="identifier">Index::DocReferences::position_of_symbol</span><span class="plain">(&amp;</span><span class="identifier">XW</span><span class="plain">);</span>
<span class="functiontext">Phrases::TypeData::Textual::parse</span><span class="plain">(&amp;</span><span class="identifier">phtd</span><span class="plain">, </span><span class="identifier">XW</span><span class="plain">, &amp;</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DEFINITIONAL_PHRASE_EFF</span><span class="plain">:</span>
<span class="functiontext">Phrases::TypeData::set_mor</span><span class="plain">(&amp;</span><span class="identifier">phtd</span><span class="plain">, </span><span class="constant">DECIDES_CONDITION_MOR</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="functiontext">Phrases::TypeData::set_mor</span><span class="plain">(&amp;</span><span class="identifier">phtd</span><span class="plain">, </span><span class="constant">DECIDES_NOTHING_AND_RETURNS_MOR</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Construct the PHOD</span> <span class="cwebmacronumber">6.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">phod</span><span class="plain"> = </span><span class="functiontext">Phrases::Options::parse_declared_options</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_5"></a><b>&#167;6.5. </b>The stack frame needs to know the kind of this phrase &mdash; something like
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">phrase number -&gt; text</span>
</pre>
<p class="inwebparagraph">&mdash; in order to work out what happens when values are decided by it later on.
We also tell the stack frame if there are phrase options, because then a
special parameter called <code class="display"><span class="extract">{phrase options}</span></code> is available when expanding
inline definitions.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Construct the PHSF, using the PHTD and PHOD</span> <span class="cwebmacronumber">6.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">phsf</span><span class="plain"> = </span><span class="functiontext">Frames::new</span><span class="plain">();</span>
<span class="functiontext">Phrases::TypeData::into_stack_frame</span><span class="plain">(&amp;</span><span class="identifier">phsf</span><span class="plain">, &amp;</span><span class="identifier">phtd</span><span class="plain">,</span>
<span class="functiontext">Phrases::TypeData::kind</span><span class="plain">(&amp;</span><span class="identifier">phtd</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Phrases::Options::allows_options</span><span class="plain">(&amp;</span><span class="identifier">phod</span><span class="plain">))</span>
<span class="functiontext">LocalVariables::options_parameter_is_needed</span><span class="plain">(&amp;</span><span class="identifier">phsf</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_6"></a><b>&#167;6.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Construct the PHRCD</span> <span class="cwebmacronumber">6.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">phrcd</span><span class="plain"> = </span><span class="functiontext">Phrases::Context::new</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_7"></a><b>&#167;6.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Tell other parts of Inform about this new phrase</span> <span class="cwebmacronumber">6.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">effect</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TO_PHRASE_EFF</span><span class="plain">:</span>
<span class="functiontext">Routines::ToPhrases::new</span><span class="plain">(</span><span class="identifier">new_ph</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DEFINITIONAL_PHRASE_EFF</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Give this phrase a local variable for the subject of the definition</span> <span class="cwebmacronumber">6.7.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RULE_IN_RULEBOOK_EFF</span><span class="plain">:</span>
<span class="functiontext">Rules::request_automatic_placement</span><span class="plain">(</span>
<span class="functiontext">Phrases::Usage::to_rule</span><span class="plain">(&amp;(</span><span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;usage_data</span><span class="plain">), </span><span class="identifier">new_ph</span><span class="plain">));</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;compile_with_run_time_debugging</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">RULE_NOT_IN_RULEBOOK_EFF</span><span class="plain">:</span>
<span class="functiontext">Phrases::Usage::to_rule</span><span class="plain">(&amp;(</span><span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;usage_data</span><span class="plain">), </span><span class="identifier">new_ph</span><span class="plain">);</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;compile_with_run_time_debugging</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_7_1"></a><b>&#167;6.7.1. </b>If a phrase defines an adjective, like so:
</p>
<blockquote>
<p>Definition: A container is capacious if: ...</p>
</blockquote>
<p class="inwebparagraph">we need to make the pronoun "it" a local variable of kind "container" in the
stack frame used to compile the "..." part. If it uses a calling, like so:
</p>
<blockquote>
<p>Definition: A container (called the sack) is capacious if: ...</p>
</blockquote>
<p class="inwebparagraph">then we also want the name "sack" to refer to this. Here's where we take care
of it:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Give this phrase a local variable for the subject of the definition</span> <span class="cwebmacronumber">6.7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">Phrases::Phrasal::define_adjective_by_phrase</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">new_ph</span><span class="plain">, &amp;</span><span class="identifier">CW</span><span class="plain">, &amp;</span><span class="identifier">K</span><span class="plain">);</span>
<span class="functiontext">LocalVariables::add_pronoun</span><span class="plain">(&amp;(</span><span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">), </span><span class="identifier">CW</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_7">&#167;6.7</a>.</p>
<p class="inwebparagraph"><a id="SP6_8"></a><b>&#167;6.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create the phrase structure</span> <span class="cwebmacronumber">6.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="functiontext">Phrases::Usage::get_preamble_text</span><span class="plain">(&amp;</span><span class="identifier">phud</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">PHRASE_CREATIONS</span><span class="plain">, </span><span class="string">"Creating phrase: &lt;%W&gt;\</span><span class="plain">n</span><span class="string">$U"</span><span class="plain">, </span><span class="identifier">XW</span><span class="plain">, &amp;</span><span class="identifier">phud</span><span class="plain">);</span>
<span class="identifier">new_ph</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain">);</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;options_data</span><span class="plain"> = </span><span class="identifier">phod</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;runtime_context_data</span><span class="plain"> = </span><span class="identifier">phrcd</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain"> = </span><span class="identifier">phsf</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;type_data</span><span class="plain"> = </span><span class="identifier">phtd</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;usage_data</span><span class="plain"> = </span><span class="identifier">phud</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;inline_wn</span><span class="plain"> = </span><span class="identifier">inline_wn</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;inter_head_defn</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;inter_tail_defn</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;inter_defn_converted</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;inline_mor</span><span class="plain"> = </span><span class="identifier">mor</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;ph_iname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;imported</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;owning_module</span><span class="plain"> = </span><span class="functiontext">Modules::find</span><span class="plain">(</span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;requests_package</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inline_wn</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;at_least_one_compiled_form_needed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;at_least_one_compiled_form_needed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;compile_with_run_time_debugging</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;next_in_logical_order</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;sequence_count</span><span class="plain"> = -1;</span>
<span class="identifier">new_ph</span><span class="plain">-</span><span class="element">&gt;ph_documentation_symbol</span><span class="plain"> = </span><span class="identifier">documentation_W</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_9"></a><b>&#167;6.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">There seems to be no definition</span> <span class="cwebmacronumber">6.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_Undefined</span><span class="plain">),</span>
<span class="string">"there doesn't seem to be any definition here"</span><span class="plain">,</span>
<span class="string">"so I can't see what this rule or phrase would do."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_1_1"></a><b>&#167;6.1.1. </b>That just leaves two problem messages about inline definitions:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Forbid overly long inline definitions</span> <span class="cwebmacronumber">6.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Inline definition: &lt;%s&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">inline_defn</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_InlineTooLong</span><span class="plain">),</span>
<span class="string">"the inline definition of this 'to...' phrase is too long"</span><span class="plain">,</span>
<span class="string">"using a quantity of Inform 6 code which exceeds the fairly small limit "</span>
<span class="string">"allowed. You will need either to write the phrase definition in Inform 7, "</span>
<span class="string">"or to call an I6 routine which you define elsewhere with an 'Include ...'."</span><span class="plain">);</span>
<span class="identifier">inline_defn</span><span class="plain">[</span><span class="constant">MAX_INLINE_DEFN_LENGTH</span><span class="plain">-1] = 0;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_1">&#167;6.1</a>.</p>
<p class="inwebparagraph"><a id="SP6_10"></a><b>&#167;6.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Inline is for To... phrases only</span> <span class="cwebmacronumber">6.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_InlineRule</span><span class="plain">),</span>
<span class="string">"only 'to...' phrases can be given inline Inform 6 definitions"</span><span class="plain">,</span>
<span class="string">"and in particular rules and adjective definitions can't."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Inline definitions open with a raw Inform 6 inclusion. The lexer processes
those as two words: first <code class="display"><span class="extract">(-</span></code>, which serves as a marker, and then the raw
text of the inclusion treated as a single "word".
</p>
<p class="inwebparagraph">Some inline definitions also mark themselves to be included only in To phrases
of the right sort: it makes no sense to respond "yes" to a phrase "To decide
what number is...", for instance.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">inline</span><span class="plain">-</span><span class="reserved">phrase</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">&gt; ::=</span>
<span class="plain">(- ### - </span><span class="identifier">in</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">only</span><span class="plain"> | ==&gt; </span><span class="constant">DECIDES_NOTHING_MOR</span><span class="plain">; &lt;&lt;</span><span class="identifier">inlinecode</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
<span class="plain">(- ### - </span><span class="identifier">in</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">decide</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> </span><span class="identifier">only</span><span class="plain"> | ==&gt; </span><span class="constant">DECIDES_CONDITION_MOR</span><span class="plain">; &lt;&lt;</span><span class="identifier">inlinecode</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
<span class="plain">(- ### - </span><span class="identifier">in</span><span class="plain"> </span><span class="identifier">to</span><span class="plain"> </span><span class="identifier">decide</span><span class="plain"> </span><span class="identifier">only</span><span class="plain"> | ==&gt; </span><span class="constant">DECIDES_VALUE_MOR</span><span class="plain">; &lt;&lt;</span><span class="identifier">inlinecode</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
<span class="plain">(- ### | ==&gt; </span><span class="constant">DONT_KNOW_MOR</span><span class="plain">; &lt;&lt;</span><span class="identifier">inlinecode</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1])</span>
<span class="plain">(- ### ... ==&gt; </span><span class="constant">DONT_KNOW_MOR</span><span class="plain">; &lt;&lt;</span><span class="identifier">inlinecode</span><span class="plain">&gt;&gt; = </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">WR</span><span class="plain">[1]); </span>&lt;<span class="cwebmacro">Issue PM_TailAfterInline problem</span> <span class="cwebmacronumber">7.1</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_TailAfterInline problem</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">DONT_KNOW_MOR</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TailAfterInline</span><span class="plain">),</span>
<span class="string">"some unexpected text appears after the tail of an inline definition"</span><span class="plain">,</span>
<span class="string">"placed within '(-' and '-)' markers to indicate that it is written in "</span>
<span class="string">"Inform 6. Here, there seems to be something extra after the '-)'."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And this is used when the preamble is first looked at:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::parse_possible_inline_defn</span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">wn</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">mor</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">MATCHING</span><span class="plain">, </span><span class="string">"form of inline: %W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">wn</span><span class="plain"> = -1;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">inline</span><span class="plain">-</span><span class="reserved">phrase</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">)) { *</span><span class="identifier">wn</span><span class="plain"> = &lt;&lt;</span><span class="identifier">inlinecode</span><span class="plain">&gt;&gt;; *</span><span class="identifier">mor</span><span class="plain"> = &lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;; }</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::parse_possible_inline_defn is used in <a href="#SP6_1">&#167;6.1</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Miscellaneous. </b>That completes the process of creation. Here's how we log them:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::log</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) { </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"RULE:NULL"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%n"</span><span class="plain">, </span><span class="functiontext">Phrases::iname</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">));</span>
<span class="functiontext">Phrases::Usage::log_rule_name</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;usage_data</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::log_briefly</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="functiontext">Phrases::TypeData::Textual::log_briefly</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;type_data</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::log is used in 1/cm (<a href="1-cm.html#SP5">&#167;5</a>, <a href="1-cm.html#SP6_6">&#167;6.6</a>), 22/tp (<a href="22-tp.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Phrases::log_briefly is used in 25/in (<a href="25-in.html#SP10">&#167;10</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Relatedly, for indexing purposes:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::write_HTML_representation</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">format</span><span class="plain">) {</span>
<span class="functiontext">Phrases::TypeData::Textual::write_HTML_representation</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, &amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;type_data</span><span class="plain">), </span><span class="identifier">format</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::write_HTML_representation is used in 2/sq (<a href="2-sq.html#SP1">&#167;1</a>), 22/dptd (<a href="22-dptd.html#SP5">&#167;5</a>, <a href="22-dptd.html#SP6_1">&#167;6.1</a>), 22/tp (<a href="22-tp.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>Some access functions:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Phrases::compiled_inline</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inline_wn</span><span class="plain"> &lt; 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">Phrases::get_inline_definition</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inline_wn</span><span class="plain"> &lt; 0)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to access inline definition of non-inline phrase"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inline_wn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_schema</span><span class="plain"> *</span><span class="functiontext">Phrases::get_inter_head</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_defn_converted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inline_wn</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">InterSchemas::from_inline_phrase_definition</span><span class="plain">(</span><span class="functiontext">Phrases::get_inline_definition</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">), &amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_head_defn</span><span class="plain">), &amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_tail_defn</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_defn_converted</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_head_defn</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_schema</span><span class="plain"> *</span><span class="functiontext">Phrases::get_inter_tail</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_defn_converted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inline_wn</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">InterSchemas::from_inline_phrase_definition</span><span class="plain">(</span><span class="functiontext">Phrases::get_inline_definition</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">), &amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_head_defn</span><span class="plain">), &amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_tail_defn</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_defn_converted</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;inter_tail_defn</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">Phrases::iname</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;ph_iname</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="functiontext">Hierarchy::package</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;owning_module</span><span class="plain">, </span><span class="constant">ADJECTIVE_PHRASES_HAP</span><span class="plain">);</span>
<span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;ph_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">DEFINITION_FN_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;ph_iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">Phrases::declaration_node</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;declaration_node</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::compiled_inline is used in 22/pav (<a href="22-pav.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Phrases::get_inline_definition is used in 22/tp (<a href="22-tp.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Phrases::get_inter_head is used in 25/cii (<a href="25-cii.html#SP1_3">&#167;1.3</a>).</p>
<p class="endnote">The function Phrases::get_inter_tail is used in 25/cii (<a href="25-cii.html#SP1_3">&#167;1.3</a>).</p>
<p class="endnote">The function Phrases::iname is used in <a href="#SP9">&#167;9</a>, 21/rl (<a href="21-rl.html#SP19">&#167;19</a>), 22/prcd (<a href="22-prcd.html#SP10">&#167;10</a>, <a href="22-prcd.html#SP10_1">&#167;10.1</a>), 22/tp2 (<a href="22-tp2.html#SP4">&#167;4</a>), 23/abp (<a href="23-abp.html#SP1">&#167;1</a>), 25/cp (<a href="25-cp.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Phrases::declaration_node is used in 22/cs (<a href="22-cs.html#SP10_6">&#167;10.6</a>, <a href="22-cs.html#SP10_7">&#167;10.7</a>), 22/pu (<a href="22-pu.html#SP10_2_1">&#167;10.2.1</a>), 22/tp (<a href="22-tp.html#SP4">&#167;4</a>, <a href="22-tp.html#SP7_1">&#167;7.1</a>, <a href="22-tp.html#SP8">&#167;8</a>), 22/pi (<a href="22-pi.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Compilation. </b>The following is called to give us an opportunity to compile a routine defining
a phrase. As was mentioned in the introduction, "To..." phrases are sometimes
compiled multiple times, for different kinds of tokens, and are compiled in
response to "requests". All other phrases are compiled just once.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::import</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">) {</span>
<span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;imported</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::compile</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">i</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_i</span><span class="plain">,</span>
<span class="reserved">stacked_variable_owner_list</span><span class="plain"> *</span><span class="identifier">legible</span><span class="plain">, </span><span class="reserved">to_phrase_request</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">applicability_condition</span><span class="plain"> *</span><span class="identifier">acl</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;imported</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">effect</span><span class="plain"> = </span><span class="functiontext">Phrases::Usage::get_effect</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;usage_data</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">effect</span><span class="plain"> == </span><span class="constant">RULE_NOT_IN_RULEBOOK_EFF</span><span class="plain">) </span><span class="identifier">effect</span><span class="plain"> = </span><span class="constant">RULE_IN_RULEBOOK_EFF</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">effect</span><span class="plain"> == </span><span class="constant">TO_PHRASE_EFF</span><span class="plain">) {</span>
<span class="functiontext">Routines::Compile::routine</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">, </span><span class="identifier">legible</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">acl</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Move along the progress bar if it's this phrase's first compilation</span> <span class="cwebmacronumber">12.1</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;at_least_one_compiled_form_needed</span><span class="plain">) {</span>
<span class="functiontext">Routines::Compile::routine</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">, </span><span class="identifier">legible</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">acl</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Move along the progress bar if it's this phrase's first compilation</span> <span class="cwebmacronumber">12.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::import appears nowhere else.</p>
<p class="endnote">The function Phrases::compile is used in 21/rl (<a href="21-rl.html#SP22">&#167;22</a>), 22/cs (<a href="22-cs.html#SP10_4">&#167;10.4</a>), 22/tp (<a href="22-tp.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP12_1"></a><b>&#167;12.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Move along the progress bar if it's this phrase's first compilation</span> <span class="cwebmacronumber">12.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;at_least_one_compiled_form_needed</span><span class="plain">) {</span>
<span class="identifier">ph</span><span class="plain">-</span><span class="element">&gt;at_least_one_compiled_form_needed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">(*</span><span class="identifier">i</span><span class="plain">)++;</span>
<span class="functiontext">ProgressBar::update_progress_bar</span><span class="plain">(4, ((</span><span class="reserved">float</span><span class="plain">) (*</span><span class="identifier">i</span><span class="plain">))/((</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">max_i</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP12">&#167;12</a> (twice).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="22-cs.html">Back to 'Construction Sequence'</a></li><li><a href="22-pu.html">Continue with 'Phrase Usage'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>