1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-18 06:54:26 +03:00
inform7/docs/if-module/5-gp.html
2020-04-15 23:49:59 +01:00

488 lines
65 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Grammar Properties</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-src/Figures/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="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="index.html"><span class="selectedlink">if</span></a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../problems-module/index.html">problems</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>Shared Modules</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Grammar Properties' generated by 7-->
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</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 Properties</b></li></ul><p class="purpose">A plugin for the I6 run-time properties needed to support parsing.</p>
<ul class="toc"><li><a href="5-gp.html#SP1">&#167;1. Definitions</a></li><li><a href="5-gp.html#SP5">&#167;5. Initialising</a></li><li><a href="5-gp.html#SP6">&#167;6. Plugin startup</a></li><li><a href="5-gp.html#SP11">&#167;11. Visible properties</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></p>
<pre class="display">
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_parse_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">P_action_bitmap</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">real_location_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">actor_location_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">I6_noun_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">I6_second_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">I6_actor_VAR</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Every inference subject (in particular, every object and every kind of object)
contains a pointer to its own unique copy of the following structure:
</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">parsing_data</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">grammar_verb</span><span class="plain"> *</span><span class="identifier">understand_as_this_object</span><span class="plain">; </span><span class="comment"> grammar for parsing the name at run-time</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">parsing_data</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure parsing_data is accessed in 5/gv, 5/gpr and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>And every property permission likewise:
</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">parsing_pp_data</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">visibility_level_in_parser</span><span class="plain">; </span><span class="comment"> if so, does the run-time I6 parser recognise it?</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">visibility_condition</span><span class="plain">; </span><span class="comment"> (at least if...?)</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">visibility_sentence</span><span class="plain">; </span><span class="comment"> where this is specified</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">parsing_pp_data</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure parsing_pp_data is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Initialising. </b></p>
<pre class="display">
<span class="reserved">parsing_data</span><span class="plain"> *</span><span class="functiontext">PL::Parsing::Visibility::new_data<button class="popup" onclick="togglePopup('usagePopup511')">...<span class="popuptext" id="usagePopup511">Usage of <b>PL::Parsing::Visibility::new_data</b>:<br><a href="5-gp.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">) {</span>
<span class="reserved">parsing_data</span><span class="plain"> *</span><span class="identifier">pd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">parsing_data</span><span class="plain">);</span>
<span class="identifier">pd</span><span class="plain">-&gt;</span><span class="element">understand_as_this_object</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">pd</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">parsing_pp_data</span><span class="plain"> *</span><span class="functiontext">PL::Parsing::Visibility::new_pp_data<button class="popup" onclick="togglePopup('usagePopup512')">...<span class="popuptext" id="usagePopup512">Usage of <b>PL::Parsing::Visibility::new_pp_data</b>:<br><a href="5-gp.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain">) {</span>
<span class="reserved">parsing_pp_data</span><span class="plain"> *</span><span class="identifier">pd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">parsing_pp_data</span><span class="plain">);</span>
<span class="identifier">pd</span><span class="plain">-&gt;</span><span class="element">visibility_level_in_parser</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">pd</span><span class="plain">-&gt;</span><span class="element">visibility_condition</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">pd</span><span class="plain">-&gt;</span><span class="element">visibility_sentence</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">pd</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Plugin startup. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::start<button class="popup" onclick="togglePopup('usagePopup513')">...<span class="popuptext" id="usagePopup513">Usage of <b>PL::Parsing::Visibility::start</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_VARIABLE_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP8">PL::Parsing::Visibility::parsing_new_variable_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_SUBJECT_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP6">PL::Parsing::Visibility::parsing_new_subject_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_NEW_PERMISSION_NOTIFY</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP6">PL::Parsing::Visibility::parsing_new_permission_notify</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_COMPLETE_MODEL</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP10">PL::Parsing::Visibility::parsing_complete_model</a></span><span class="plain">);</span>
<span class="identifier">PLUGIN_REGISTER</span><span class="plain">(</span><span class="identifier">PLUGIN_ESTIMATE_PROPERTY_USAGE</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP9">PL::Parsing::Visibility::parsing_estimate_property_usage</a></span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::parsing_new_subject_notify<button class="popup" onclick="togglePopup('usagePopup514')">...<span class="popuptext" id="usagePopup514">Usage of <b>PL::Parsing::Visibility::parsing_new_subject_notify</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">) {</span>
<span class="identifier">CREATE_PF_DATA</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">subj</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP5">PL::Parsing::Visibility::new_data</a></span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::parsing_new_permission_notify<button class="popup" onclick="togglePopup('usagePopup515')">...<span class="popuptext" id="usagePopup515">Usage of <b>PL::Parsing::Visibility::parsing_new_permission_notify</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">new_pp</span><span class="plain">) {</span>
<span class="identifier">CREATE_PLUGIN_PP_DATA</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">new_pp</span><span class="plain">, </span><span class="functiontext"><a href="5-gp.html#SP5">PL::Parsing::Visibility::new_pp_data</a></span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>These are variable names to do with "Understand..." which Inform provides
special support for; it recognises the English names when they are defined by
the Standard Rules or, in the case of "the X understood", by Inform itself.
(So there is no need to translate this to other languages.)
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">parsing</span><span class="plain">-</span><span class="identifier">variables</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">k</span><span class="plain">-</span><span class="identifier">kind</span><span class="plain">&gt; </span><span class="identifier">understood</span><span class="plain"> | ==&gt; </span><span class="constant">0</span><span class="plain">; &lt;&lt;</span><span class="identifier">kind:understood</span><span class="plain">&gt;&gt; = </span><span class="identifier">RP</span><span class="plain">[1]</span>
<span class="identifier">noun</span><span class="plain"> | ==&gt; </span><span class="constant">1</span>
<span class="identifier">location</span><span class="plain"> | ==&gt; </span><span class="constant">2</span>
<span class="identifier">actor</span><span class="plain">-</span><span class="identifier">location</span><span class="plain"> | ==&gt; </span><span class="constant">3</span>
<span class="identifier">second</span><span class="plain"> </span><span class="identifier">noun</span><span class="plain"> | ==&gt; </span><span class="constant">4</span>
<span class="identifier">person</span><span class="plain"> </span><span class="identifier">asked</span><span class="plain"> | ==&gt; </span><span class="constant">5</span>
<span class="identifier">maximum</span><span class="plain"> </span><span class="identifier">score</span><span class="plain"> ==&gt; </span><span class="constant">6</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::parsing_new_variable_notify<button class="popup" onclick="togglePopup('usagePopup516')">...<span class="popuptext" id="usagePopup516">Usage of <b>PL::Parsing::Visibility::parsing_new_variable_notify</b>:<br><a href="5-gp.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="identifier">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">var</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">notable</span><span class="plain">-</span><span class="identifier">parsing</span><span class="plain">-</span><span class="identifier">variables</span><span class="plain">&gt;(</span><span class="identifier">var</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain">)) {</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">kind:understood</span><span class="plain">&gt;&gt; == </span><span class="identifier">NonlocalVariables::kind</span><span class="plain">(</span><span class="identifier">var</span><span class="plain">)) {</span>
<span class="identifier">NonlocalVariables::set_I6_identifier</span><span class="plain">(</span><span class="identifier">var</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">,</span>
<span class="identifier">NonlocalVariables::nve_from_iname</span><span class="plain">(</span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PARSED_NUMBER_HL</span><span class="plain">)));</span>
<span class="identifier">NonlocalVariables::set_I6_identifier</span><span class="plain">(</span><span class="identifier">var</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">,</span>
<span class="identifier">NonlocalVariables::nve_from_iname</span><span class="plain">(</span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">PARSED_NUMBER_HL</span><span class="plain">)));</span>
<span class="identifier">NonlocalVariables::allow_to_be_zero</span><span class="plain">(</span><span class="identifier">var</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">I6_noun_VAR</span><span class="plain"> = </span><span class="identifier">var</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">real_location_VAR</span><span class="plain"> = </span><span class="identifier">var</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="identifier">actor_location_VAR</span><span class="plain"> = </span><span class="identifier">var</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">4</span><span class="plain">: </span><span class="identifier">I6_second_VAR</span><span class="plain"> = </span><span class="identifier">var</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">5</span><span class="plain">: </span><span class="identifier">I6_actor_VAR</span><span class="plain"> = </span><span class="identifier">var</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">6</span><span class="plain">: </span><span class="identifier">max_score_VAR</span><span class="plain"> = </span><span class="identifier">var</span><span class="plain">;</span>
<span class="identifier">NonlocalVariables::make_initalisable</span><span class="plain">(</span><span class="identifier">var</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>This is for <code class="display"><span class="extract">name</span></code> and <code class="display"><span class="extract">plural</span></code>.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::parsing_estimate_property_usage<button class="popup" onclick="togglePopup('usagePopup517')">...<span class="popuptext" id="usagePopup517">Usage of <b>PL::Parsing::Visibility::parsing_estimate_property_usage</b>:<br><a href="5-gp.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">k</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">words_used</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">words_used</span><span class="plain"> += </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">words_used</span><span class="plain"> += </span><span class="identifier">Wordings::length</span><span class="plain">(</span><span class="identifier">PW</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>Once the traverse is done, we can infer values for the two key I6 properties
for parsing:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::parsing_complete_model<button class="popup" onclick="togglePopup('usagePopup518')">...<span class="popuptext" id="usagePopup518">Usage of <b>PL::Parsing::Visibility::parsing_complete_model</b>:<br><a href="5-gp.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == </span><span class="constant">5</span><span class="plain">) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">;</span>
<span class="identifier">P_name</span><span class="plain"> = </span><span class="identifier">Properties::Valued::new_nameless</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"name"</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="functiontext"><a href="5-gp.html#SP10">PL::Parsing::Visibility::name_name</a></span><span class="plain">());</span>
<span class="identifier">P_parse_name</span><span class="plain"> = </span><span class="identifier">Properties::Valued::new_nameless</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"parse_name"</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="identifier">P_action_bitmap</span><span class="plain"> = </span><span class="identifier">Properties::Valued::new_nameless</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"action_bitmap"</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">Emit::tree</span><span class="plain">(), </span><span class="identifier">Properties::iname</span><span class="plain">(</span><span class="identifier">P_action_bitmap</span><span class="plain">));</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Assert the I6 name property</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Assert the I6 parse-name property</span> <span class="cwebmacronumber">10.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Assert the I6 action-bitmap property</span> <span class="cwebmacronumber">10.3</span>&gt;<span class="plain">;</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">LOOP_OVER_BASE_KINDS</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::lt</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_object</span><span class="plain">)) {</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Assert the I6 parse-name property</span> <span class="cwebmacronumber">10.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain"> = </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_thing</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Assert the I6 action-bitmap property</span> <span class="cwebmacronumber">10.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="functiontext">PL::Parsing::Visibility::name_name<button class="popup" onclick="togglePopup('usagePopup519')">...<span class="popuptext" id="usagePopup519">Usage of <b>PL::Parsing::Visibility::name_name</b>:<br>General Parsing Routines - <a href="5-gpr.html#SP7">&#167;7</a>, <a href="5-gpr.html#SP9">&#167;9</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Properties::iname</span><span class="plain">(</span><span class="identifier">P_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP10_1"></a><b>&#167;10.1. </b>The name property requires special care, partly over I6 eccentricities
such as the way that single-letter dictionary words can be misinterpreted
as characters (hence the double slash below), but also because something
called "your ..." in the source text &mdash; "your nose", say &mdash; needs to
be altered to "my ..." for purposes of parsing during play.
</p>
<p class="inwebparagraph">Note that <code class="display"><span class="extract">name</span></code> is additive in I6 terms, meaning that its values
accumulate from class down to instance: but we prevent this, by only
compiling <code class="display"><span class="extract">name</span></code> properties for instance objects directly. The practical
consequence is that we have to imitate this inheritance when it comes
to single-word grammar for things. Recall that a sentence like "Understand
"cube" as the block" formally creates a grammar line which ought to
be parsed as part of some elaborate <code class="display"><span class="extract">parse_name</span></code> property: but that for
efficiency's sake, we notice that "cube" is only one word and so put
it into the <code class="display"><span class="extract">name</span></code> property instead. And we need to perform the same trick
for the kinds we inherit from.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assert the I6 name property</span> <span class="cwebmacronumber">10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-tnt.html#SP10">PL::Naming::object_is_privately_named</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="identifier">Instances::to_kind</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">from_kind</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">PR</span><span class="plain"> = </span><span class="identifier">Hierarchy::package_within</span><span class="plain">(</span><span class="identifier">INLINE_PROPERTIES_HAP</span><span class="plain">, </span><span class="identifier">Instances::package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">name_array</span><span class="plain"> = </span><span class="identifier">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="identifier">INLINE_PROPERTY_HL</span><span class="plain">, </span><span class="identifier">PR</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="identifier">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">name_array</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Instances::get_name_in_play</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Instances::get_name_in_play</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">PW</span><span class="plain">)) {</span>
<span class="identifier">from_kind</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">PW</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name_in_play</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">Projects::get_language_of_play</span><span class="plain">(</span><span class="identifier">Task::project</span><span class="plain">()));</span>
<span class="plain">}</span>
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="identifier">vocabulary_entry</span><span class="plain"> *</span><span class="identifier">ve</span><span class="plain"> = </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">);</span>
<span class="identifier">ve</span><span class="plain"> = </span><span class="identifier">Preform::Nonparsing::replace_word</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">,</span>
<span class="plain">&lt;</span><span class="identifier">possessive</span><span class="plain">-</span><span class="identifier">second</span><span class="plain">-</span><span class="identifier">person</span><span class="plain">&gt;,</span>
<span class="plain">&lt;</span><span class="identifier">possessive</span><span class="plain">-</span><span class="identifier">first</span><span class="plain">-</span><span class="identifier">person</span><span class="plain">&gt;);</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Vocabulary::get_exemplar</span><span class="plain">(</span><span class="identifier">ve</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">, </span><span class="string">"%w"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
<span class="identifier">Emit::array_dword_entry</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_kind</span><span class="plain">) </span><span class="comment"> see test case PM_PluralsFromKind</span>
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">PW</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">additional</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">compare_word</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">Lexer::word</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">)))</span>
<span class="identifier">additional</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">additional</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">, </span><span class="string">"%w"</span><span class="plain">, </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">j</span><span class="plain">));</span>
<span class="identifier">Emit::array_plural_dword_entry</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">understand_as_this_object</span><span class="plain">)</span>
<span class="functiontext"><a href="5-gv.html#SP17">PL::Parsing::Verbs::take_out_one_word_grammar</a></span><span class="plain">(</span>
<span class="identifier">PF_I</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)-&gt;</span><span class="element">understand_as_this_object</span><span class="plain">);</span>
<span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">infs</span><span class="plain"> = </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">Instances::to_kind</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">infs</span><span class="plain">; </span><span class="identifier">infs</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::narrowest_broader_subject</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PF_S</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">PF_S</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">)-&gt;</span><span class="element">understand_as_this_object</span><span class="plain">)</span>
<span class="functiontext"><a href="5-gv.html#SP17">PL::Parsing::Verbs::take_out_one_word_grammar</a></span><span class="plain">(</span>
<span class="identifier">PF_S</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">)-&gt;</span><span class="element">understand_as_this_object</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">Produce::annotate_i</span><span class="plain">(</span><span class="identifier">name_array</span><span class="plain">, </span><span class="identifier">INLINE_ARRAY_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="identifier">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_name</span><span class="plain">, </span><span class="identifier">Instances::as_subject</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">),</span>
<span class="identifier">Rvalues::from_iname</span><span class="plain">(</span><span class="identifier">name_array</span><span class="plain">), </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="5-gp.html#SP10">&#167;10</a>.</p>
<p class="inwebparagraph"><a id="SP10_2"></a><b>&#167;10.2. </b>We attach numbered parse name routines as properties for any object
where grammar has specified a need. (By default, this will not happen.)
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assert the I6 parse-name property</span> <span class="cwebmacronumber">10.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext"><a href="5-gpr.html#SP5">PL::Parsing::Tokens::General::compile_parse_name_property</a></span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">)</span>
<span class="identifier">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_parse_name</span><span class="plain">, </span><span class="identifier">subj</span><span class="plain">,</span>
<span class="identifier">Rvalues::from_iname</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">), </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="5-gp.html#SP10">&#167;10</a> (twice).</p>
<p class="inwebparagraph"><a id="SP10_3"></a><b>&#167;10.3. </b>The action bitmap is an array of bits attached to each object, one
for each action, which records whether that action has yet applied
successfully to that object. This is used at run-time to handle past
tense conditions such as "the jewels have been taken". Note that
we give the bitmap in the class definition associated with "thing"
to ensure that it will be inherited by all I6 objects of this class,
i.e., all I6 objects corresponding to I7 things.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assert the I6 action-bitmap property</span> <span class="cwebmacronumber">10.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">InferenceSubjects::is_within</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">, </span><span class="identifier">Kinds::Knowledge::as_subject</span><span class="plain">(</span><span class="identifier">K_room</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">instance</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">InferenceSubjects::as_instance</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">);</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext"><a href="4-act.html#SP33">PL::Actions::compile_action_bitmap_property</a></span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">Properties::Valued::assert</span><span class="plain">(</span><span class="identifier">P_action_bitmap</span><span class="plain">, </span><span class="identifier">subj</span><span class="plain">,</span>
<span class="identifier">Rvalues::from_iname</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">), </span><span class="identifier">CERTAIN_CE</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="5-gp.html#SP10">&#167;10</a> (twice).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. Visible properties. </b>A visible property is one which can be used to describe an object: for
instance, if colour is a visible property of a car, then it can be called
"green car" if and only if the current value of the colour of the car is
"green".
</p>
<p class="inwebparagraph">Properly speaking it is not the property which is visible, but the
combination of property and object (or kind): thus the following test
depends on a property permission and not a mere property.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::seek<button class="popup" onclick="togglePopup('usagePopup520')">...<span class="popuptext" id="usagePopup520">Usage of <b>PL::Parsing::Visibility::seek</b>:<br>Traverse for Grammar - <a href="5-tfg.html#SP19">&#167;19</a></span></button></span><span class="plain">(</span><span class="identifier">property</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">WHENW</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parity</span><span class="plain">, </span><span class="identifier">upto</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Properties::is_either_or</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">upto</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">parity</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">parity</span><span class="plain"> &lt;= </span><span class="identifier">upto</span><span class="plain">; </span><span class="identifier">parity</span><span class="plain">++) {</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">seek_prn</span><span class="plain"> = (</span><span class="identifier">parity</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">pr:</span><span class="plain">(</span><span class="identifier">Properties::EitherOr::get_negation</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seek_prn</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">World::Permissions::find</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">, </span><span class="identifier">seek_prn</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain"> = </span><span class="identifier">World::Permissions::grant</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">, </span><span class="identifier">seek_prn</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_level_in_parser</span><span class="plain"> = </span><span class="identifier">level</span><span class="plain">;</span>
<span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_sentence</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_condition</span><span class="plain"> = </span><span class="identifier">WHENW</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::any_property_visible_to_subject<button class="popup" onclick="togglePopup('usagePopup521')">...<span class="popuptext" id="usagePopup521">Usage of <b>PL::Parsing::Visibility::any_property_visible_to_subject</b>:<br>General Parsing Routines - <a href="5-gpr.html#SP5">&#167;5</a>, <a href="5-gpr.html#SP6">&#167;6</a></span></button></span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">subj</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_inheritance</span><span class="plain">) {</span>
<span class="identifier">property</span><span class="plain"> *</span><span class="identifier">pr</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">property</span><span class="plain">) {</span>
<span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain"> =</span>
<span class="identifier">World::Permissions::find</span><span class="plain">(</span><span class="identifier">subj</span><span class="plain">, </span><span class="identifier">pr</span><span class="plain">, </span><span class="identifier">allow_inheritance</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pp</span><span class="plain">) &amp;&amp; (</span><span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_level_in_parser</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::get_level<button class="popup" onclick="togglePopup('usagePopup522')">...<span class="popuptext" id="usagePopup522">Usage of <b>PL::Parsing::Visibility::get_level</b>:<br>General Parsing Routines - <a href="5-gpr.html#SP10">&#167;10</a>, <a href="5-gpr.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_level_in_parser</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="functiontext">PL::Parsing::Visibility::get_condition<button class="popup" onclick="togglePopup('usagePopup523')">...<span class="popuptext" id="usagePopup523">Usage of <b>PL::Parsing::Visibility::get_condition</b>:<br>General Parsing Routines - <a href="5-gpr.html#SP11">&#167;11</a></span></button></span><span class="plain">(</span><span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_condition</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">condition</span><span class="plain">&gt;(</span><span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_condition</span><span class="plain">)) </span><span class="identifier">spec</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_condition</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Dash::validate_conditional_clause</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$T"</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_sentence</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">Task::syntax_tree</span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BadVisibilityWhen</span><span class="plain">),</span>
<span class="string">"the condition after 'when' makes no sense to me"</span><span class="plain">,</span>
<span class="string">"although otherwise this worked - it is only the part after 'when' "</span>
<span class="string">"which I can't follow."</span><span class="plain">);</span>
<span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_condition</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">spec</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::Visibility::log_parsing_visibility<button class="popup" onclick="togglePopup('usagePopup524')">...<span class="popuptext" id="usagePopup524">Usage of <b>PL::Parsing::Visibility::log_parsing_visibility</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">inference_subject</span><span class="plain"> *</span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Permissions for $j:\n"</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">);</span>
<span class="identifier">property_permission</span><span class="plain"> *</span><span class="identifier">pp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_PERMISSIONS_FOR_INFS</span><span class="plain">(</span><span class="identifier">pp</span><span class="plain">, </span><span class="identifier">infs</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$Y: visibility %d, condition %W\n"</span><span class="plain">,</span>
<span class="identifier">World::Permissions::get_property</span><span class="plain">(</span><span class="identifier">pp</span><span class="plain">),</span>
<span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_level_in_parser</span><span class="plain">,</span>
<span class="identifier">PLUGIN_PP</span><span class="plain">(</span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">pp</span><span class="plain">)-&gt;</span><span class="element">visibility_condition</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">InferenceSubjects::narrowest_broader_subject</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">))</span>
<span class="functiontext"><a href="5-gp.html#SP11">PL::Parsing::Visibility::log_parsing_visibility</a></span><span class="plain">(</span><span class="identifier">InferenceSubjects::narrowest_broader_subject</span><span class="plain">(</span><span class="identifier">infs</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-tfg.html">Back to 'Traverse for Grammar'</a></li><li><a href="5-gv.html">Continue with 'Grammar Verbs'</a></li></ul><hr class="tocbar">
<!--End of weave-->
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
</main>
</body>
</html>