mirror of
https://github.com/ganelson/inform.git
synced 2024-07-17 06:24:24 +03:00
659 lines
96 KiB
HTML
659 lines
96 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Traverse for Assertions</title>
|
|
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
|
|
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Preform-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body class="commentary-font">
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-assets/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">core</span></a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Services</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../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="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
<!--Weave of 'Traverse for Assertions' generated by Inweb-->
|
|
<div class="breadcrumbs">
|
|
<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">core</a></li><li><a href="index.html#9">Chapter 9: The A-Parser</a></li><li><b>Traverse for Assertions</b></li></ul></div>
|
|
<p class="purpose">To manage the overall process of traversing the parse tree for assertion sentences.</p>
|
|
|
|
<ul class="toc"><li><a href="9-tfa.html#SP1">§1. Definitions</a></li><li><a href="9-tfa.html#SP7">§7. Performing the traverse</a></li><li><a href="9-tfa.html#SP8">§8. The TRACE sentence handler</a></li><li><a href="9-tfa.html#SP9">§9. The SENTENCE sentence handler</a></li><li><a href="9-tfa.html#SP11">§11. The current object and subject</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. </b>A "traverse" of the tree is a sentence-by-sentence walk through it,
|
|
taking action at each point. Because Inform holds the entire parse tree in
|
|
memory at once, this is the same thing as what used to be called a pass
|
|
through the source code.
|
|
</p>
|
|
|
|
<p class="commentary">Because Inform syntax requires little in the way of pre-declarations, and
|
|
Inform can accept the same material in many arrangements, we get around
|
|
timing problems — needing to know X before Y — by traversing the tree
|
|
many times over. There is little speed penalty for this.
|
|
</p>
|
|
|
|
<p class="commentary">But the majority of the work is done on two main traverses, so that Inform
|
|
behaves like a traditional two-pass compiler when reading assertions.
|
|
The following global variable indicates which pass we're in.
|
|
</p>
|
|
|
|
<p class="commentary">During the main assertion traverses, we also keep track of whether we
|
|
are near the start of an extension file or not. (If we are, then a lone
|
|
string of text is interpreted as the rubric of the extension — an
|
|
exception to Inform's normal rules.)
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE1_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE2_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE_FOR_RULE_FILING_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE_FOR_GRAMMAR_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE_FOR_MAP1_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE_FOR_MAP2_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">TRAVERSE_FOR_MAP_INDEX_SMFT</span>
|
|
<span class="definition-keyword">enum</span> <span class="constant-syntax">ALLOW_IN_OPTIONS_FILE_SMFT</span>
|
|
</pre>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">traverse</span><span class="plain-syntax">; </span><span class="comment-syntax"> always 1 or 2</span>
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">near_start_of_extension</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Within each main traverse, we look at each sentence and decide which
|
|
part of Inform will deal with it.
|
|
</p>
|
|
|
|
<p class="commentary">Sentence handlers provide an abstraction for that choice of what to do
|
|
with each kind of sentence, on each traverse. This is really only a
|
|
disguise for a couple of <span class="extract"><span class="extract-syntax">switch</span></span> statements and a lot of function calls.
|
|
The only real purpose is to make it easier to encapsulate code for one sort
|
|
of sentence away from the others: if we were writing <span class="extract"><span class="extract-syntax">C++</span></span> or Python, it
|
|
would just be a method in the class for sentences.
|
|
</p>
|
|
|
|
<p class="commentary">Properly speaking, there can be sentence handlers for any node type at the
|
|
children-of-root level of the parse tree, although we mostly use this for
|
|
<span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span> nodes (and then we look further at the verb type in the <span class="extract"><span class="extract-syntax">VERB_NT</span></span>
|
|
first child). The main traverse is a two-pass operation, and we can supply
|
|
a routine to do something with the node on either of the passes (or neither,
|
|
or even both).
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">sentence_handler</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">sentence_node_type</span><span class="plain-syntax">; </span><span class="comment-syntax"> usually but not always </span><span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">verb_type</span><span class="plain-syntax">; </span><span class="comment-syntax"> for those which are indeed </span><span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">handle_on_traverse</span><span class="plain-syntax">; </span><span class="comment-syntax"> 1 or 2 to restrict to that pass, or 0 for both</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">handling_routine</span><span class="plain-syntax">)(</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">); </span><span class="comment-syntax"> or NULL not to handle</span>
|
|
<span class="plain-syntax">} </span><span class="reserved-syntax">sentence_handler</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>The structure sentence_handler is private to this section.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. </b>A global array — really a jump table — records who does what:
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_OF_NTS_AND_VBS</span><span class="plain-syntax"> </span><span class="constant-syntax">75</span>
|
|
</pre>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">sentence_handler</span><span class="plain-syntax"> *</span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_OF_NTS_AND_VBS</span><span class="plain-syntax">]; </span><span class="comment-syntax"> for non-</span><span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span><span class="comment-syntax"> nodes</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP5"></a><b>§5. </b>We recognise either node types <span class="extract"><span class="extract-syntax">*_NT</span></span>, or node type <span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span> plus an
|
|
associated verb number <span class="extract"><span class="extract-syntax">*_VB</span></span>. The following macro registers a sentence handler
|
|
by entering a pointer to it into one of the above tables:
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">REGISTER_SENTENCE_HANDLER</span><span class="plain-syntax">(</span><span class="identifier-syntax">sh_name</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">sentence_handler</span><span class="plain-syntax"> *</span><span class="identifier-syntax">the_sh</span><span class="plain-syntax"> = &</span><span class="identifier-syntax">sh_name</span><span class="plain-syntax">##</span><span class="identifier-syntax">_handler</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">the_sh</span><span class="plain-syntax">-></span><span class="element-syntax">sentence_node_type</span><span class="plain-syntax"> - </span><span class="identifier-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">] = </span><span class="identifier-syntax">the_sh</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>The actual handlers are mostly not declared here (indeed, that's the
|
|
point of the whole exercise — to allow them to be decentralised). But we
|
|
do need to know their names, so every <span class="extract"><span class="extract-syntax">*_SH</span></span> constant below must correspond
|
|
to a sentence handler structure called <span class="extract"><span class="extract-syntax">*_SH_handler</span></span> defined somewhere
|
|
else in the program.
|
|
</p>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Performing the traverse. </b>The following routine is called twice, once with <span class="extract"><span class="extract-syntax">pass</span></span> equal to 1, then
|
|
with <span class="extract"><span class="extract-syntax">pass</span></span> equal to 2.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="extract"><span class="extract-syntax">trace_sentences</span></span> is true between each pair of <span class="extract"><span class="extract-syntax">TRACE_NT</span></span> nodes, if there
|
|
are any: these arise from the special debugging sentence consisting only
|
|
of an asterisk. When tracing, we print an account of what is being read to
|
|
the debugging log (both here, and in more detail elsewhere), except that
|
|
we don't bother to print details of the closing <span class="extract"><span class="extract-syntax">TRACE_NT</span></span> node.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">sentence_handlers_initialised</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">assembly_position</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="comment-syntax"> where assembled sentences are added</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::traverse1</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::traverse1</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_4">§2.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="9-tfa.html#SP7" class="function-link"><span class="function-syntax">Assertions::Traverse::traverse</span></a><span class="plain-syntax">(1);</span>
|
|
<span class="plain-syntax">}</span>
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::traverse2</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::traverse2</span></span>:<br/>How To Compile - <a href="1-htc.html#SP2_4">§2.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="9-tfa.html#SP7" class="function-link"><span class="function-syntax">Assertions::Traverse::traverse</span></a><span class="plain-syntax">(2);</span>
|
|
<span class="plain-syntax">}</span>
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::traverse</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pass</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="9-tfa.html#SP12" class="function-link"><span class="function-syntax">Assertions::Traverse::new_discussion</span></a><span class="plain-syntax">(); </span><span class="comment-syntax"> clear memory of what the subject and object of discussion are</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">traverse</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pass</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::clear_trace</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sentence_handlers_initialised</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_3" class="named-paragraph-link"><span class="named-paragraph">Initialise sentence handlers</span><span class="named-paragraph-number">7.3</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::traverse_nodep</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><a href="9-tfa.html#SP7_2" class="function-link"><span class="function-syntax">Assertions::Traverse::visit</span></a><span class="plain-syntax">, &</span><span class="identifier-syntax">last</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pass</span><span class="plain-syntax"> == </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_1" class="named-paragraph-link"><span class="named-paragraph">Extend the traverse to cover sentences needed when implicit kinds are set</span><span class="named-paragraph-number">7.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7_1"></a><b>§7.1. </b>Here's a tricky timing problem, or rather, here's the fix for it. Assemblies
|
|
are made when the kinds of objects are set, and they're made by inserting
|
|
appropriate sentences. For instance, given the generalisation:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Every room contains a vehicle.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">we would insert the following sentence into the tree:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Ballroom West contains a vehicle.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">as soon as we discover that Ballroom West is a room. That works fine if we
|
|
discover this fact during traverses 1 or 2, but sometimes it can only be
|
|
known during the "positioning" stage, after traverse 2, when we look over
|
|
all the inferences drawn about Ballroom West. It's then too late to insert
|
|
any new sentences, or rather, it's too late to act on them.
|
|
</p>
|
|
|
|
<p class="commentary">So what we do is to call <span class="extract"><span class="extract-syntax">position_objects</span></span> from the model-maker to make
|
|
any such deductions right at the end of traverse 2, and insert any sentences
|
|
arising right at the end of the source text. We then prolong traverse 2
|
|
artificially to run through those sentences.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Extend the traverse to cover sentences needed when implicit kinds are set</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax"> = </span><span class="identifier-syntax">last</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">assembly_position</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="26-pc.html#SP6" class="function-link"><span class="function-syntax">Plugins::Call::complete_model</span></a><span class="plain-syntax">(1);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::traverse_nodep_from</span><span class="plain-syntax">(</span><span class="identifier-syntax">last</span><span class="plain-syntax">, </span><a href="9-tfa.html#SP7_2" class="function-link"><span class="function-syntax">Assertions::Traverse::visit</span></a><span class="plain-syntax">, &</span><span class="identifier-syntax">last</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_2"></a><b>§7.2. </b>Let us go, and make our visit:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::visit</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::visit</span></span>:<br/><a href="9-tfa.html#SP7">§7</a>, <a href="9-tfa.html#SP7_1">§7.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> **</span><span class="identifier-syntax">last</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">assembly_position</span><span class="plain-syntax"> = </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">compilation_module</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cm</span><span class="plain-syntax"> = </span><a href="27-cm.html#SP6" class="function-link"><span class="function-syntax">Modules::current</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><a href="27-cm.html#SP6" class="function-link"><span class="function-syntax">Modules::set_current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_2_1" class="named-paragraph-link"><span class="named-paragraph">Take a sceptical look at WITH nodes in the light of subsequent knowledge</span><span class="named-paragraph-number">7.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">last</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_2_2" class="named-paragraph-link"><span class="named-paragraph">Deal with an individual sentence</span><span class="named-paragraph-number">7.2.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="27-cm.html#SP6" class="function-link"><span class="function-syntax">Modules::set_current_to</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cm</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7_3"></a><b>§7.3. </b>If this hasn't already been done:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise sentence handlers</span><span class="named-paragraph-number">7.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">sentence_handlers_initialised</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_3_1" class="named-paragraph-link"><span class="named-paragraph">Empty the sentence handler tables</span><span class="named-paragraph-number">7.3.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="26-shr.html#SP1" class="function-link"><span class="function-syntax">SHR::register_sentence_handlers</span></a><span class="plain-syntax">();</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP7">§7</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_3_1"></a><b>§7.3.1. </b>At this stage, all we do is empty the tables. The reason we have to delay
|
|
before entering the valid handlers is that some of them will be defined in
|
|
sections appearing after this one in the program: since C requires all
|
|
identifiers used to be predeclared, this means we can't enter the valid
|
|
handlers until right at the end of the program. The routine which does so,
|
|
<span class="extract"><span class="extract-syntax">SHR::register_sentence_handlers</span></span>, consists only of a run of
|
|
<span class="extract"><span class="extract-syntax">REGISTER_SENTENCE_HANDLER</span></span> macro expansions and can be found in Chapter
|
|
14.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Empty the sentence handler tables</span><span class="named-paragraph-number">7.3.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="constant-syntax">MAX_OF_NTS_AND_VBS</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP7_3">§7.3</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_2_1"></a><b>§7.2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Take a sceptical look at WITH nodes in the light of subsequent knowledge</span><span class="named-paragraph-number">7.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax"> = </span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">) == </span><span class="identifier-syntax">WITH_NT</span><span class="plain-syntax">) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Wordings::up_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ap</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexicon::retrieve</span><span class="plain-syntax">(</span><span class="identifier-syntax">MISCELLANEOUS_MC</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="14-rv.html#SP19" class="function-link"><span class="function-syntax">Rvalues::is_CONSTANT_of_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">ap</span><span class="plain-syntax">, </span><span class="identifier-syntax">K_action_name</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::set_type_and_clear_annotations</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">, </span><span class="identifier-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::set_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">apparent_subject</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP7_2">§7.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_2_2"></a><b>§7.2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with an individual sentence</span><span class="named-paragraph-number">7.2.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">())) && (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) != </span><span class="identifier-syntax">TRACE_NT</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n[%W]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">));</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP7_2_2_1" class="named-paragraph-link"><span class="named-paragraph">If this sentence can be handled, then do so and continue</span><span class="named-paragraph-number">7.2.2.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"$T\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"uncaught assertion"</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP7_2">§7.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP7_2_2_1"></a><b>§7.2.2.1. </b>Note that it's entirely open for the sentence handler to choose to do nothing
|
|
on either or both traverses, so the inner <span class="extract"><span class="extract-syntax">if</span></span> can happily fail.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">If this sentence can be handled, then do so and continue</span><span class="named-paragraph-number">7.2.2.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="identifier-syntax">ROOT_NT</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifndef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) == </span><span class="identifier-syntax">BIBLIOGRAPHIC_NT</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">n</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">Node::get_type</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">) - </span><span class="identifier-syntax">ENUMERATED_NT_BASE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">n</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">n</span><span class="plain-syntax"> < </span><span class="constant-syntax">MAX_OF_NTS_AND_VBS</span><span class="plain-syntax">)) && (</span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">])) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">desired</span><span class="plain-syntax"> = </span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">]-></span><span class="element-syntax">handle_on_traverse</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (((</span><span class="identifier-syntax">traverse</span><span class="plain-syntax"> == </span><span class="identifier-syntax">desired</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">desired</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">)) &&</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">]-></span><span class="element-syntax">handling_routine</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> (*(</span><span class="identifier-syntax">how_to_handle_nodes</span><span class="plain-syntax">[</span><span class="identifier-syntax">n</span><span class="plain-syntax">]-></span><span class="element-syntax">handling_routine</span><span class="plain-syntax">))(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP7_2_2">§7.2.2</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP8"></a><b>§8. The TRACE sentence handler. </b>While most of the sentence handlers are scattered across the rest of Inform,
|
|
two will be given here. The first is the one which acts on <span class="extract"><span class="extract-syntax">TRACE_NT</span></span> asterisks;
|
|
this is a debugging feature of Inform. An asterisk on its own toggles logging
|
|
of work on sentences. An asterisk followed by double-quoted text is a note
|
|
for the telemetry file.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">sentence_handler</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRACE_SH_handler</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> { </span><span class="identifier-syntax">TRACE_NT</span><span class="plain-syntax">, -1, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><a href="9-tfa.html#SP8" class="function-link"><span class="function-syntax">Assertions::Traverse::switch_sentence_trace</span></a><span class="plain-syntax"> };</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::switch_sentence_trace</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">)) > </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">tr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">telemetry_recording</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">telemetry_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Telemetry::write_to_telemetry_file</span><span class="plain-syntax">(</span><span class="identifier-syntax">Lexer::word_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">))));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">telemetry_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_TelemetryAccepted</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"that's a message for the Author, not me"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"so I'll note it down in the Telemetry file (if you're keeping one.)"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">telemetry_recording</span><span class="plain-syntax"> = </span><span class="identifier-syntax">tr</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">SyntaxTree::toggle_trace</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">());</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">traverse</span><span class="plain-syntax"> == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pass 1"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">Log::tracing_on</span><span class="plain-syntax">(</span><span class="identifier-syntax">SyntaxTree::is_trace_set</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">()), </span><span class="identifier-syntax">I</span><span class="string-syntax">"Pass 2"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP9"></a><b>§9. The SENTENCE sentence handler. </b>The other special case is the handler for <span class="extract"><span class="extract-syntax">SENTENCE_NT</span></span> itself, which is
|
|
special because it looks at the <span class="extract"><span class="extract-syntax">VERB_NT</span></span> child of the sentence and then
|
|
refers on to other sentence handlers accordingly:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">sentence_handler</span><span class="plain-syntax"> </span><span class="identifier-syntax">SENTENCE_SH_handler</span><span class="plain-syntax"> =</span>
|
|
<span class="plain-syntax"> { </span><span class="identifier-syntax">SENTENCE_NT</span><span class="plain-syntax">, -1, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><a href="9-tfa.html#SP9" class="function-link"><span class="function-syntax">Assertions::Traverse::handle_sentence_with_primary_verb</span></a><span class="plain-syntax"> };</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::special</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::special</span></span>:<br/><a href="9-tfa.html#SP9_2">§9.2</a>, <a href="9-tfa.html#SP14">§14</a><br/>Property Sentences - <a href="15-ps.html#SP2">§2</a><br/>Construction Sequence - <a href="22-cs.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Node::get_special_meaning</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::handle_sentence_with_primary_verb</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">prevailing_mood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">UNKNOWN_CE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">language_element_ANNOT</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="constant-syntax">you_can_ignore_ANNOT</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="identifier-syntax">down</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Handle a sentence with no primary verb</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error_if_node_type_wrong</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">VERB_NT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">prevailing_mood</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">, </span><span class="identifier-syntax">verbal_certainty_ANNOT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP9_4" class="named-paragraph-link"><span class="named-paragraph">Issue problem message if either subject or object contains mismatched brackets</span><span class="named-paragraph-number">9.4</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Act on the primary verb in the sentence</span><span class="named-paragraph-number">9.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP9_1"></a><b>§9.1. </b>A sentence node with no children indicates that we couldn't find any verb
|
|
earlier. This might just be a piece of quoted matter which is intended as
|
|
the description or initial appearance of the most recent object, but in all
|
|
other eventualities we must produce a "no such sentence" problem.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Handle a sentence with no primary verb</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="3-cs.html#SP3" class="function-link"><span class="function-syntax">Classifying::sentence_is_textual</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">traverse</span><span class="plain-syntax"> == </span><span class="constant-syntax">2</span><span class="plain-syntax">) </span><a href="9-tfa.html#SP10" class="function-link"><span class="function-syntax">Assertions::Traverse::set_appearance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::first_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"sentence unclassified"</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP9">§9</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_2"></a><b>§9.2. </b>We now use the other sentence-handler table, with almost the same code as
|
|
for the first (above). A small point of difference is that it's allowed for
|
|
a valid verb number to have no handler: if so, we handle the verb by doing
|
|
nothing on either traverse, of course.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Act on the primary verb in the sentence</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="9-tfa.html#SP9" class="function-link"><span class="function-syntax">Assertions::Traverse::special</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">)) </span><a href="9-tfa.html#SP14" class="function-link"><span class="function-syntax">Assertions::Traverse::special_meaning</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="9-tbath.html#SP3" class="function-link"><span class="function-syntax">Assertions::Copular::assertion</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP9">§9</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_3"></a><b>§9.3. </b>During early beta-testing, the problem message for "I can't find a verb"
|
|
split into cases. Inform is quite sensitive to punctuation errors as between
|
|
comma, paragraph break and semicolon, and this is where that sensitivity begins
|
|
to bite.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><no-verb-diagnosis></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This is <a href="../words-module/4-ap.html" class="internal">Preform grammar</a>, not regular C code.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP9_4"></a><b>§9.4. </b>Inform source text does not make much use of parentheses to group subexpressions,
|
|
but the ability does exist, and we defend it a little here:
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue problem message if either subject or object contains mismatched brackets</span><span class="named-paragraph-number">9.4</span></span><span class="Preform-comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Wordings::mismatched_brackets</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">))) ||</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::mismatched_brackets</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)))) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_source</span><span class="plain-syntax">(1, </span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(2,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::last_wn</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)) + </span><span class="constant-syntax">1</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(3, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::quote_wording</span><span class="plain-syntax">(4, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::handmade_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">BelievedImpossible</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::nonempty</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">)))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I must be misreading the sentence %1. The verb "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"looks to me like '%2', but then the brackets don't "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"match in what I have left: '%3' and '%4'."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_segment</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I must be misreading the sentence %1. The verb "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"looks to me like '%2', but then the brackets don't "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"match in what I have left: '%3'."</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Problems::issue_problem_end</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP9">§9</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>The "appearance" is not a property as such. When a quoted piece of text
|
|
is given as a whole sentence, it might be:
|
|
</p>
|
|
|
|
<ul class="items"><li>(a) the "description" of a room or thing;
|
|
</li><li>(b) the title of the whole work, if at the top of the main source; or
|
|
</li><li>(c) the rubric of the extension, or the additional credits for an extension,
|
|
if near the top of an extension file.
|
|
</li></ul>
|
|
<p class="commentary">The title of the work is handled elsewhere, so we worry only about (a) and (c).
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::set_appearance</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::set_appearance</span></span>:<br/><a href="9-tfa.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">wn</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">near_start_of_extension</span><span class="plain-syntax"> >= </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">This is rubric or credit text for an extension</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> = </span><a href="9-tfa.html#SP11" class="function-link"><span class="function-syntax">Assertions::Traverse::get_current_subject</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">infs</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="9-tfa.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Issue a problem for appearance without object</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">spec</span><span class="plain-syntax"> = </span><a href="14-rv.html#SP14" class="function-link"><span class="function-syntax">Rvalues::from_wording</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="15-ia.html#SP1" class="function-link"><span class="function-syntax">Properties::Appearance::infer</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infs</span><span class="plain-syntax">, </span><span class="identifier-syntax">spec</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP10_1"></a><b>§10.1. </b>The variable <span class="extract"><span class="extract-syntax">near_start_of_extension</span></span> is always 0 except at the start of
|
|
an extension (immediately after the header line), when it is set to 1. The
|
|
following increments it to 2 to allow for up to two quoted lines; the first
|
|
is the rubric, the second the credit line.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">This is rubric or credit text for an extension</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">source_file</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Lexer::file_of_origin</span><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">inform_extension</span><span class="plain-syntax"> *</span><span class="identifier-syntax">E</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Extensions::corresponding_to</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">E</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Word::dequote</span><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">txt</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">txt</span><span class="plain-syntax">, </span><span class="string-syntax">"%W"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Wordings::one_word</span><span class="plain-syntax">(</span><span class="identifier-syntax">wn</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">near_start_of_extension</span><span class="plain-syntax">++) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax">: </span><span class="identifier-syntax">Extensions::set_rubric</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">txt</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span><span class="plain-syntax">: </span><span class="identifier-syntax">Extensions::set_extra_credit</span><span class="plain-syntax">(</span><span class="identifier-syntax">E</span><span class="plain-syntax">, </span><span class="identifier-syntax">txt</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">near_start_of_extension</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">txt</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP10">§10</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP10_2"></a><b>§10.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Issue a problem for appearance without object</span><span class="named-paragraph-number">10.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">StandardProblems::sentence_problem</span><span class="plain-syntax">(</span><a href="1-wtc.html#SP5" class="function-link"><span class="function-syntax">Task::syntax_tree</span></a><span class="plain-syntax">(), </span><span class="identifier-syntax">_p_</span><span class="plain-syntax">(</span><span class="identifier-syntax">PM_TextWithoutSubject</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"I'm not sure what you're referring to"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"that is, I can't decide to what room or thing you intend that text to belong. "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"Perhaps you could rephrase this more explicitly? ('The description of the Inner "</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"Sanctum is...')"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="9-tfa.html#SP10">§10</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP11"></a><b>§11. The current object and subject. </b>Inform is deliberately minimal when allowing the use of pronouns which carry
|
|
meanings from one sentence to another. It is unclear exactly how natural
|
|
language does this, and while some theories are more persuasive than others,
|
|
all seem vulnerable to odd cases that they get "wrong". It's therefore
|
|
hard to program a computer to understand "it" so that human users are
|
|
happy with the result.
|
|
</p>
|
|
|
|
<p class="commentary">But we try, just a little, by keeping track of the subject and object
|
|
under discussion. Even this is tricky. Consider:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The Pavilion is a room. East is the Cricket Square.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">East of where? Clearly of the current subject, the Pavilion (not
|
|
the room kind). On the other hand,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>On the desk is a pencil. It has description "2B."</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">"It" here is the pencil, not the desk. To disentangle such things,
|
|
we keep track of two different running references: the current subject and
|
|
the current object. English is an SVO language, so that in assertions of the
|
|
form "X is Y", X is the subject and Y the object. But it will turn out to
|
|
be more complicated than that, because we disregard all references which are
|
|
not to tangible things and kinds.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, *</span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">subject_seems_to_be_plural</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">Assertions::Traverse::get_current_subject</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::get_current_subject</span></span>:<br/><a href="9-tfa.html#SP10">§10</a><br/>Make Assertions - <a href="9-ma.html#SP3_3_41_1">§3.3.41.1</a>, <a href="9-ma.html#SP3_3_41_4">§3.3.41.4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="function-syntax">Assertions::Traverse::get_current_object</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::get_current_object</span></span>:<br/>Refine Parse Tree - <a href="9-rpt.html#SP9_7">§9.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::get_current_subject_plurality</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::get_current_subject_plurality</span></span>:<br/>Refine Parse Tree - <a href="9-rpt.html#SP9_7">§9.7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">subject_seems_to_be_plural</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP12"></a><b>§12. </b>The routine <span class="extract"><span class="extract-syntax">Assertions::Traverse::new_discussion</span></span> is called when we reach a
|
|
heading or other barrier in the source text, to make clear that there has
|
|
been a change of the topic discussed.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="extract"><span class="extract-syntax">Assertions::Traverse::change_discussion_topic</span></span> is called once at the end of
|
|
processing each assertion during each pass.
|
|
</p>
|
|
|
|
<p class="commentary">Note that we are careful to avoid changing the subject with sentences like:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>East is the Central Plaza.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">where this does not have the subject "east", but has instead an implicit
|
|
subject carried over from previous sentences.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::new_discussion</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::new_discussion</span></span>:<br/><a href="9-tfa.html#SP7">§7</a><br/>Headings - <a href="7-hdn.html#SP13">§13</a><br/>Extension Files - <a href="8-ef.html#SP11">§11</a><br/>To Be and To Have - <a href="9-tbath.html#SP5_1">§5.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRONOUNS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Forgotten subject of sentences: $j]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRONOUNS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Forgotten object of sentences: $j]\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">; </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::change_discussion_topic</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::change_discussion_topic</span></span>:<br/>To Be and To Have - <a href="9-tbath.html#SP5_1">§5.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infsx</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infsy</span><span class="plain-syntax">, </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infsy_full</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">old_sub</span><span class="plain-syntax"> = </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">, *</span><span class="identifier-syntax">old_obj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">subject_seems_to_be_plural</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Wordings::length</span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">)) > </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">near_start_of_extension</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Node::set_interpretation_of_subject</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">, </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Annotations::node_has</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_sentence</span><span class="plain-syntax">, </span><span class="constant-syntax">implicit_in_creation_of_ANNOT</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">IF_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">PL::Map::is_a_direction</span><span class="plain-syntax">(</span><span class="identifier-syntax">infsx</span><span class="plain-syntax">)) &&</span>
|
|
<span class="plain-syntax"> ((</span><a href="16-is.html#SP19" class="function-link"><span class="function-syntax">InferenceSubjects::as_object_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infsx</span><span class="plain-syntax">) == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) ||</span>
|
|
<span class="plain-syntax"> (</span><a href="16-is.html#SP19" class="function-link"><span class="function-syntax">InferenceSubjects::as_object_instance</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infsy_full</span><span class="plain-syntax">)))) </span><span class="identifier-syntax">infsx</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">endif</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">infsx</span><span class="plain-syntax">) </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">infsx</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">infsy</span><span class="plain-syntax">) && (</span><a href="16-is.html#SP21" class="function-link"><span class="function-syntax">InferenceSubjects::domain</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">infsy</span><span class="plain-syntax">) == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">infsy</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">infsx</span><span class="plain-syntax">) </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax"> = </span><span class="identifier-syntax">infsx</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax"> != </span><span class="identifier-syntax">old_sub</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRONOUNS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Changed subject of sentences to $j]\n"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">subject_of_sentences</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax"> != </span><span class="identifier-syntax">old_obj</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">PRONOUNS</span><span class="plain-syntax">, </span><span class="string-syntax">"[Changed object of sentences to $j]\n"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">object_of_sentences</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP13"></a><b>§13. </b>Occasionally we need to force the issue, though:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::subject_of_discussion_a_list</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::subject_of_discussion_a_list</span></span>:<br/>To Be and To Have - <a href="9-tbath.html#SP5_1">§5.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">subject_seems_to_be_plural</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP14"></a><b>§14. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::special_meaning</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::special_meaning</span></span>:<br/><a href="9-tfa.html#SP9_2">§9.2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="9-tfa.html#SP14" class="function-link"><span class="function-syntax">Assertions::Traverse::try_special_meaning</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">traverse</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">-></span><span class="element-syntax">down</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Assertions::Traverse::try_special_meaning</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Assertions::Traverse::try_special_meaning</span></span>:<br/>Construction Sequence - <a href="22-cs.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pn</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="9-tfa.html#SP9" class="function-link"><span class="function-syntax">Assertions::Traverse::special</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">special_meaning_holder</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sm</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::get_special_meaning</span><span class="plain-syntax">(</span><span class="identifier-syntax">pn</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">sm</span><span class="plain-syntax">) </span><span class="identifier-syntax">SpecialMeanings::call</span><span class="plain-syntax">(</span><span class="identifier-syntax">sm</span><span class="plain-syntax">, </span><span class="identifier-syntax">task</span><span class="plain-syntax">, </span><span class="identifier-syntax">pn</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<nav role="progress"><div class="progresscontainer">
|
|
<ul class="progressbar"><li class="progressprev"><a href="9-ita.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-bv.html">3</a></li><li class="progresschapter"><a href="4-its.html">4</a></li><li class="progresschapter"><a href="5-lp.html">5</a></li><li class="progresschapter"><a href="6-up.html">6</a></li><li class="progresschapter"><a href="7-ptu.html">7</a></li><li class="progresschapter"><a href="8-ef.html">8</a></li><li class="progresscurrentchapter">9</li><li class="progresssection"><a href="9-ita.html">ita</a></li><li class="progresscurrent">tfa</li><li class="progresssection"><a href="9-tbath.html">tbath</a></li><li class="progresssection"><a href="9-rpt.html">rpt</a></li><li class="progresssection"><a href="9-tc.html">tc</a></li><li class="progresssection"><a href="9-ma.html">ma</a></li><li class="progresssection"><a href="9-pk.html">pk</a></li><li class="progresssection"><a href="9-rk.html">rk</a></li><li class="progresssection"><a href="9-ass.html">ass</a></li><li class="progresssection"><a href="9-imp.html">imp</a></li><li class="progresssection"><a href="9-pd.html">pd</a></li><li class="progresschapter"><a href="10-aots.html">10</a></li><li class="progresschapter"><a href="11-itpc.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresschapter"><a href="14-sp.html">14</a></li><li class="progresschapter"><a href="15-pr.html">15</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresschapter"><a href="24-lv.html">24</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="9-tbath.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|