mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 10:04:21 +03:00
647 lines
78 KiB
HTML
647 lines
78 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Noun Phrases</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">
|
|
<script>
|
|
MathJax = {
|
|
tex: {
|
|
inlineMath: '$', '$'], ['\\(', '\\)'
|
|
},
|
|
svg: {
|
|
fontCache: 'global'
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async
|
|
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
|
|
</script>
|
|
|
|
<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="../core-module/index.html">core</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="index.html"><span class="selectedlink">linguistics</span></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 'Noun Phrases' generated by Inweb-->
|
|
<div class="breadcrumbs">
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">linguistics</a></li><li><a href="index.html#4">Chapter 4: Diagramming Sentences</a></li><li><b>Noun Phrases</b></li></ul></div>
|
|
<p class="purpose">To construct noun-phrase subtrees for assertion sentences found in the parse tree.</p>
|
|
|
|
<ul class="toc"><li><a href="4-np.html#SP1">§1. Hierarchy of noun phrases</a></li><li><a href="4-np.html#SP2">§2. Creation</a></li><li><a href="4-np.html#SP4">§4. Raw nounphrases (NP1)</a></li><li><a href="4-np.html#SP5">§5. Articled nounphrases (NP2)</a></li><li><a href="4-np.html#SP7">§7. Balanced variants</a></li><li><a href="4-np.html#SP8">§8. List-divided nounphrases (NP3)</a></li><li><a href="4-np.html#SP11">§11. Worldly nounphrases (NP4)</a></li><li><a href="4-np.html#SP19">§19. Relationship nodes</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1"></a><b>§1. Hierarchy of noun phrases. </b>Noun phrase nodes are built at four levels of elaboration, which we take in
|
|
turn:
|
|
</p>
|
|
|
|
<ul class="items"><ul class="items"><li>(NP1) Raw: where the text is entirely untouched and unannotated.
|
|
</li><li>(NP2) Articled: where any initial English article is converted to an annotation.
|
|
</li><li>(NP3) List-divided: where, in addition, a list is broken up into individual items.
|
|
</li><li>(NP4) Worldly: where, in addition, pronouns, relative phrases establishing
|
|
relationships and properties (and other grammar meaningful only for references
|
|
to physical objects and kinds) are parsed.
|
|
</li></ul>
|
|
</li></ul>
|
|
<p class="commentary">At levels (NP1) and (NP2), a NP produces a single <span class="extract"><span class="extract-syntax">PROPER_NOUN_NT</span></span> node; at
|
|
level (NP3), the result is a subtree contining <span class="extract"><span class="extract-syntax">PROPER_NOUN_NT</span></span> and <span class="extract"><span class="extract-syntax">AND_NT</span></span>
|
|
nodes; but at level (NP4) this subtree may include any of <span class="extract"><span class="extract-syntax">RELATIONSHIP_NT</span></span>,
|
|
<span class="extract"><span class="extract-syntax">CALLED_NT</span></span>, <span class="extract"><span class="extract-syntax">WITH_NT</span></span>, <span class="extract"><span class="extract-syntax">AND_NT</span></span>, <span class="extract"><span class="extract-syntax">KIND_NT</span></span> or <span class="extract"><span class="extract-syntax">PROPER_NOUN_NT</span></span>.
|
|
</p>
|
|
|
|
<p class="commentary">Because a small proportion of noun phrase subtrees is thrown away, due to
|
|
backtracking on mistaken guesses at parsing of sentences, it is important
|
|
that creating an (NP) should have no side-effects beyond the construction
|
|
of the tree itself (and, of course, the memory used up, but we won't worry
|
|
about that: the proportion thrown away really is small).
|
|
</p>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP2"></a><b>§2. Creation. </b>The following macro is useful in the grammar below:
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">GENERATE_RAW_NP</span>
|
|
<span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">; *</span><span class="identifier-syntax">XP</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">preform_lookahead_mode</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)?(</span><a href="4-np.html#SP2" class="function-link"><span class="function-syntax">NounPhrases::new_raw</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">)):</span><span class="identifier-syntax">NULL</span>
|
|
</pre>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">NounPhrases::new_raw</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">NounPhrases::new_raw</span></span>:<br/><a href="4-np.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PN</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Node::new</span><span class="plain-syntax">(</span><span class="constant-syntax">PROPER_NOUN_NT</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="constant-syntax">nounphrase_article_ANNOT</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_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">PN</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">PN</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP3"></a><b>§3. </b>Other node types are generated as follows. Note that these make nothing in
|
|
lookahead mode; this prevents needless memory allocation.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">NounPhrases::PN_void</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">NounPhrases::PN_void</span></span>:<br/><a href="4-np.html#SP16">§16</a>, <a href="4-np.html#SP18">§18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">preform_lookahead_mode</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="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">Node::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">NounPhrases::PN_single</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">NounPhrases::PN_single</span></span>:<br/><a href="4-np.html#SP18">§18</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</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">preform_lookahead_mode</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="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">Node::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">P</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">P</span><span class="plain-syntax">-></span><span class="identifier-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">A</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">P</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">NounPhrases::PN_pair</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">NounPhrases::PN_pair</span></span>:<br/><a href="4-np.html#SP8">§8</a>, <a href="4-np.html#SP10">§10</a>, <a href="4-np.html#SP15">§15</a>, <a href="4-np.html#SP16">§16</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">node_type_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">A</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">B</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">preform_lookahead_mode</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="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">Node::new</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</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">P</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">P</span><span class="plain-syntax">-></span><span class="identifier-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">A</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">next</span><span class="plain-syntax"> = </span><span class="identifier-syntax">B</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">P</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP4"></a><b>§4. Raw nounphrases (NP1). </b>A raw noun phrase can in principle be any nonempty wording:
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> GENERATE_RAW_NP</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="SP5"></a><b>§5. Articled nounphrases (NP2). </b>Although, again, any text is acceptable, now we now take note of the definite
|
|
or indefinite article, and also of whether it's used in the singular or the
|
|
plural.
|
|
</p>
|
|
|
|
<p class="commentary">Note that unexpectedly upper-case articles are left well alone: this is why
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>On the table is a thing called A Town Called Alice.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">creates an object called "A Town Called Alice", not an indefinitely-articled
|
|
one called "Town Called Alice". Articles are not removed if that would
|
|
leave the text empty.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><nounphrase-definite></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><definite-article></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[2]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><nounphrase-articled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NULL; return preform_lookahead_mode; </span><span class="Preform-comment-syntax"> match only when looking ahead</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><if-not-deliberately-capitalised></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><indefinite-article></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[3]; </span><span class="named-paragraph-container code-font"><a href="4-np.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Annotate node by article</span><span class="named-paragraph-number">5.1</span></a></span><span class="Preform-constant-syntax">;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><if-not-deliberately-capitalised></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><definite-article></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[3]; </span><span class="named-paragraph-container code-font"><a href="4-np.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Annotate node by article</span><span class="named-paragraph-number">5.1</span></a></span><span class="Preform-constant-syntax">;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</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="SP5_1"></a><b>§5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Annotate node by article</span><span class="named-paragraph-number">5.1</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="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(*</span><span class="identifier-syntax">XP</span><span class="plain-syntax">, </span><span class="constant-syntax">nounphrase_article_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</span><span class="plain-syntax">[2]);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(*</span><span class="identifier-syntax">XP</span><span class="plain-syntax">, </span><span class="constant-syntax">plural_reference_ANNOT</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">Lcon::get_number</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">[2]) == </span><span class="identifier-syntax">SINGULAR_NUMBER</span><span class="plain-syntax">)?</span><span class="identifier-syntax">FALSE:TRUE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(*</span><span class="identifier-syntax">XP</span><span class="plain-syntax">, </span><span class="constant-syntax">gender_reference_ANNOT</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Lcon::get_gender</span><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">[2]));</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-np.html#SP5">§5</a> (twice).</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP6"></a><b>§6. </b>Sometimes we want to look at the article (if any) used in a raw NP, and
|
|
absorb that into annotations, removing it from the wording. For instance, in
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>On the table is a thing called a part of the broken box.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">we want to remove the initial article from the calling-name to produce
|
|
"part of the broken box". (If we handled this NP as other than raw, we might
|
|
spuriously make a subtree with <span class="extract"><span class="extract-syntax">RELATIONSHIP_NT</span></span> in thanks to the apparent
|
|
"part of" clause.)
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">NounPhrases::annotate_by_articles</span><span class="plain-syntax">(</span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">RAW_NP</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="function-syntax"><nounphrase-articled></span><span class="plain-syntax">(</span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">RAW_NP</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">MODEL</span><span class="plain-syntax"> = </span><span class="function-syntax"><<rp>></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">RAW_NP</span><span class="plain-syntax">, </span><span class="identifier-syntax">Node::get_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">MODEL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">RAW_NP</span><span class="plain-syntax">, </span><span class="constant-syntax">nounphrase_article_ANNOT</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">MODEL</span><span class="plain-syntax">, </span><span class="constant-syntax">nounphrase_article_ANNOT</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">RAW_NP</span><span class="plain-syntax">, </span><span class="constant-syntax">plural_reference_ANNOT</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">MODEL</span><span class="plain-syntax">, </span><span class="constant-syntax">plural_reference_ANNOT</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">RAW_NP</span><span class="plain-syntax">, </span><span class="constant-syntax">gender_reference_ANNOT</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::read_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">MODEL</span><span class="plain-syntax">, </span><span class="constant-syntax">gender_reference_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="identifier-syntax">RAW_NP</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7"></a><b>§7. Balanced variants. </b>The balanced versions match any text in which brackets and braces are used in
|
|
a correctly paired way; otherwise they are the same.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-balanced></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">^<balanced-text></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-articled-balanced></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">^<balanced-text></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-articled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</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="SP8"></a><b>§8. List-divided nounphrases (NP3). </b>An "articled list" matches text like
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>the lion, a witch, and some wardrobes</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">as a list of three articled noun phrases.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><nounphrase-articled-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NULL; return preform_lookahead_mode; </span><span class="Preform-comment-syntax"> match only when looking ahead</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-articled-balanced></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-articled-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_pair(AND_NT, Wordings::one_word(R[2]), RP[1], RP[2])</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-articled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-articled-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-articled-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_,/and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-articled-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</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"></a><b>§9. </b>That builds into a lopsided binary tree: thus "the lion, a witch,
|
|
and some wardrobes" becomes
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> AND_NT ","</span>
|
|
<span class="plain-syntax"> PROPERTY_LIST_NT "lion" article:definite</span>
|
|
<span class="plain-syntax"> AND_NT ", and"</span>
|
|
<span class="plain-syntax"> PROPERTY_LIST_NT "witch" article:indefinite</span>
|
|
<span class="plain-syntax"> PROPERTY_LIST_NT "wardrobe" article:indefinite pluralreference:true</span>
|
|
</pre>
|
|
<p class="commentary">The binary structure is chosen since it allows us to use a simple recursion
|
|
to run through possibilities, and also to preserve each connective of the text
|
|
in the <span class="extract"><span class="extract-syntax">AND_NT</span></span> nodes.
|
|
</p>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP10"></a><b>§10. </b>Alternative lists divide up at "or". Thus
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>voluminous, middling big or poky</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">becomes a tree of three (raw) noun phrases.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><nounphrase-alternative-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NULL; return preform_lookahead_mode; </span><span class="Preform-comment-syntax"> match only when looking ahead</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-balanced></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-alternative-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_pair(AND_NT, Wordings::one_word(R[2]), RP[1], RP[2])</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-alternative-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_or}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-alternative-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_,/or}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-alternative-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</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="SP11"></a><b>§11. Worldly nounphrases (NP4). </b>That just leaves the big one. It comes in two versions, for the object and
|
|
subject NPs of a regular sentence, but they are almost exactly the same. They
|
|
differ slightly, as we'll see, in the handling of relative phrases; when
|
|
parsing a sentence such as
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>X is Y</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">Inform uses <nounphrase-as-subject> on X and <nounphrase-as-object> on Y. Both
|
|
of these make use of the recursive <np-inner> grammar, and the difference
|
|
in effect is that at the topmost level of recursion the as-subject version
|
|
allows only limited RPs, not unlimited ones. (In languages other than English,
|
|
we might want bigger differences, with X read in the nominative and Y in the
|
|
accusative.)
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><nounphrase-as-object></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-articled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><nounphrase-as-subject></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><if-not-deliberately-capitalised></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-relative-phrase-limited></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[2]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner-without-rp></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><nounphrase-articled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><if-not-deliberately-capitalised></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-relative-phrase-unlimited></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[2]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner-without-rp></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</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="SP12"></a><b>§12. </b>So here we go with relative phrases. We've already seen that our two general
|
|
forms of NP differ only in the range of RPs allowed at the top level: here we
|
|
see, furthermore, that the only limitation is that in the subject of an
|
|
assertion sentence, a RP can't be introduced with what seems to be a participle.
|
|
</p>
|
|
|
|
<p class="commentary">It might seem grammatically odd to be parsing RPs as the subject side of a
|
|
sentence, when they surely ought to belong to the VP rather than either of the
|
|
NPs. But English is, in fact, odd this way: it allows indicative statements,
|
|
but no other sentences, to use "subject-verb inversion". An assertion such as
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>In the Garden is a tortoise.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">is impossible to parse with a naive grammar for relative phrases, because
|
|
the "in" is miles away from its governing verb "is". (This quirk is called an
|
|
inversion since the sentence is equivalent to the easier to construe
|
|
"A tortoise is in the Garden".) This is why we want to parse subject NPs
|
|
and object NPs symmetrically, and allow either one to be an RP instead.
|
|
</p>
|
|
|
|
<p class="commentary">And yet subject-verb inversion can't be allowed in all cases, though; we might
|
|
pedantically argue that the Yoda-like utterance
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Holding the light sabre is the young Jedi.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">is grammatically correct, but if so then we have to read
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Holding Area is a room.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">as a statement that a room is holding something called "Area", which then
|
|
causes Inform to throw problem messages about confusion between people and
|
|
rooms (since only people can hold things). So we forbid subject-verb inversion
|
|
in the case of a participle like "holding".
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-relative-phrase-limited></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-relative-phrase-implicit></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><probable-participle></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-relative-phrase-explicit></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-relative-phrase-unlimited></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-relative-phrase-implicit></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-relative-phrase-explicit></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</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="SP13"></a><b>§13. </b>Inform guesses above that most English words ending in "-ing" are present
|
|
participles — like guessing, bluffing, cheating, and so on. But there is
|
|
a conspicuous exception to this; so any word found in <non-participles>
|
|
is never treated as a participle.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><non-participles></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">thing/something</span>
|
|
|
|
<span class="Preform-function-syntax"><probable-participle></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">internal</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-identifier-syntax">Vocabulary::test_flags</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">Wordings::first_wn</span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">), </span><span class="Preform-identifier-syntax">ING_MC</span><span class="Preform-plain-syntax">)) {</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">if</span><span class="Preform-plain-syntax"> (</span><span class="Preform-function-syntax"><non-participles></span><span class="Preform-plain-syntax">(</span><span class="Preform-identifier-syntax">W</span><span class="Preform-plain-syntax">)) </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">TRUE</span><span class="Preform-plain-syntax">;</span>
|
|
<span class="Preform-plain-syntax"> }</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">return</span><span class="Preform-plain-syntax"> </span><span class="Preform-identifier-syntax">FALSE</span><span class="Preform-plain-syntax">;</span>
|
|
<span class="Preform-plain-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="SP14"></a><b>§14. </b>Finally, we define what we mean by implicit and explicit relative phrases.
|
|
As examples, the right-hand sides of:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>The lawnmower is in the Garden.</p>
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>The giraffe is here.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">are explicit and implicit respectively. Implicit RPs are those where the
|
|
relationship is with something unstated. For instance, "here" generally means
|
|
a containment by the room currently being discussed; "carried" implies that
|
|
the player does the carrying.
|
|
</p>
|
|
|
|
<p class="commentary">Note that we throw out a relative phrase if the noun phrase within it would
|
|
begin with "and" or a comma; this enables us to parse sentences concerning
|
|
directions, in particular, a little better.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-relative-phrase-explicit></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><permitted-preposition></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/and</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><permitted-preposition></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">_,/and</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL;</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><permitted-preposition></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner-without-rp></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; </span><span class="named-paragraph-container code-font"><a href="4-np.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">Work out a meaning</span><span class="named-paragraph-number">14.1</span></a></span><span class="Preform-constant-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="SP14_1"></a><b>§14.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out a meaning</span><span class="named-paragraph-number">14.1</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="constant-syntax">VERB_MEANING_LINGUISTICS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax"> = </span><a href="3-vm.html#SP11" class="function-link"><span class="function-syntax">VerbMeanings::get_regular_meaning_of_form</span></a><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><a href="3-vrb.html#SP11" class="function-link"><span class="function-syntax">Verbs::find_form</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">permitted_verb</span><span class="plain-syntax">, </span><span class="identifier-syntax">RP</span><span class="plain-syntax">[1], </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> *</span><span class="identifier-syntax">XP</span><span class="plain-syntax"> = </span><a href="4-np.html#SP19" class="function-link"><span class="function-syntax">NounPhrases::PN_rel</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><a href="3-vm.html#SP2" class="function-link"><span class="function-syntax">VerbMeanings::reverse_VMT</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">R</span><span class="plain-syntax">), -1, </span><span class="identifier-syntax">RP</span><span class="plain-syntax">[2]);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="4-np.html#SP14">§14</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP15"></a><b>§15. </b>Now the heart of it. There are basically seven constructions which can make
|
|
complex NPs from simple ones: we've already seen one of these, the relative
|
|
phrase. The sequence of checking these is very important, because it decides
|
|
which clauses are represented higher in the parse tree when multiple structures
|
|
are present within the NP. For instance, we want to turn
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>[A] in a container called the flask and cap with flange</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">into the subtree:
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-plain-syntax"> RELATIONSHIP_NT "in" = containment</span>
|
|
<span class="Preform-plain-syntax"> CALLED_NT "called"</span>
|
|
<span class="Preform-plain-syntax"> PROPER_NOUN_NT "container" article:indefinite</span>
|
|
<span class="Preform-plain-syntax"> PROPER_NOUN_NT "flask and cap with flange" article:definite</span>
|
|
</pre>
|
|
<p class="commentary">but we also want:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>[B] in a container with carrying capacity 10 and diameter 12</p>
|
|
</blockquote>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-plain-syntax"> RELATIONSHIP_NT "in" = containment</span>
|
|
<span class="Preform-plain-syntax"> WITH_NT "with"</span>
|
|
<span class="Preform-plain-syntax"> PROPER_NOUN_NT "container" article:indefinite</span>
|
|
<span class="Preform-plain-syntax"> AND_NT "and"</span>
|
|
<span class="Preform-plain-syntax"> PROPERTY_LIST_NT "carrying capacity 10"</span>
|
|
<span class="Preform-plain-syntax"> PROPERTY_LIST_NT "diameter 12"</span>
|
|
</pre>
|
|
<p class="commentary">These two cases together force our conventions: from sentence [A] we see
|
|
that initial relative clauses (in) must beat callings ("called") which
|
|
must beat property clauses ("with"), while from [B] we see that property
|
|
clauses must beat lists ("and"). These all have to beat "of" and
|
|
"from", which seem to be about linguistically equal, because these
|
|
constructions must be easily reversible, as we shall see, and the best way
|
|
to ensure that is to make sure they can only appear right down close to
|
|
leaves in the tree. This dictates
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-plain-syntax"> RELATIONSHIP_NT > CALLED_NT > WITH_NT > AND_NT</span>
|
|
</pre>
|
|
<p class="commentary">in the sense that a subtree construction higher in this chain will take
|
|
precedence over (and therefore be higher up in the tree than) one that is
|
|
lower. That leaves just the seventh construction: "kind of ...". To
|
|
avoid misreading this as an "of", and to protect "called", we need
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-plain-syntax"> CALLED_NT > KIND_NT</span>
|
|
</pre>
|
|
<p class="commentary">but otherwise we are fairly free where to put it (though the resulting trees
|
|
will take different shapes in some cases if we move it around, we could
|
|
write code which handled any of the outcomes about equally well). In fact,
|
|
we choose to make it lowest possible, so the final precedence order is:
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-plain-syntax"> RELATIONSHIP_NT > CALLED_NT > WITH_NT > AND_NT > KIND_NT</span>
|
|
</pre>
|
|
<p class="commentary">Once all possible constructions have been recursively exhausted, every leaf we
|
|
end up at is treated as a balanced articled NP. (Thus <np-inner> fails on
|
|
source text where brackets aren't balanced, such as "smile X-)". This is why
|
|
<nounphrase-as-object> above resorts to using <nounphrase-articled> if
|
|
<np-inner> should fail. The reason we want <np-inner> to require balance is
|
|
that otherwise "called" clauses can be misread: "frog (called toad)" can be
|
|
misread as saying that "frog (" is called "toad )".)
|
|
</p>
|
|
|
|
<p class="commentary">Two technicalities to note about the following nonterminal. Production (a)
|
|
exists to accept arbitrary text quickly and without allocating memory to hold
|
|
parse nodes when the Preform parser is simply performing a lookahead (to see
|
|
where it will eventually parse). This is a very important economy: without it,
|
|
parsing a list of \(n\) items will have running time and space requirements of
|
|
order \(2^n\). But during regular parsing, production (a) has no effect, and can
|
|
be ignored. Secondly, note the ampersand notation: recall that
|
|
<span class="extract"><span class="Preform-extract-syntax">&whatever</span></span> at the start of production means "only try this production if the
|
|
word <span class="extract"><span class="Preform-extract-syntax">whatever</span></span> is somewhere in the text we're looking at". Again, it's a
|
|
speed optimisation, and doesn't affect the language's definition.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-inner-without-rp></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NULL; return preform_lookahead_mode; </span><span class="Preform-comment-syntax"> match only when looking ahead</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{called}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-articled-balanced></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_pair(CALLED_NT, WR[1], RP[1], RP[2])</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-with-or-having-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_pair(WITH_NT, Wordings::one_word(R[2]), RP[1], RP[2])</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-and-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_pair(AND_NT, Wordings::one_word(R[2]), RP[1], RP[2])</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-kind-phrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><agent-pronoun></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> GENERATE_RAW_NP; Node::set_pronoun(*XP, RP[1]);</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-articled-balanced></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</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="SP16"></a><b>§16. </b>The tail of with-or-having parses for instance "with carrying capacity 5"
|
|
in the NP
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>a container with carrying capacity 5</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">This makes use of a nifty feature of Preform: when Preform scans to see how to
|
|
divide the text, it tries <np-with-or-having-tail> in each possible position.
|
|
The reply can be yes, no, or no and move on a little. So if we spot "it with
|
|
action", the answer is no, and move on three words: that jumps over a "with"
|
|
which we don't want to recognise. (Because if we did, then "the locking it
|
|
with action" would be parsed as a property list, "action", attaching to a
|
|
bogus object called "locking it".)
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-with-or-having-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">it</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">with</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">action</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL + Wordings::first_wn(WR[1]) - Wordings::first_wn(W);</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{with/having}</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">(/)</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">***</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL + Wordings::first_wn(WR[1]) - Wordings::first_wn(W);</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{with/having}</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">(</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><response-letter></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">)</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; return FAIL_NONTERMINAL + Wordings::first_wn(WR[1]) - Wordings::first_wn(W);</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{with/having}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-new-property-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(WR[1]); *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-new-property-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NULL; return preform_lookahead_mode; </span><span class="Preform-comment-syntax"> match only when looking ahead</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-new-property></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-new-property-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_pair(AND_NT, Wordings::one_word(R[2]), RP[1], RP[2])</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-new-property></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1];</span>
|
|
|
|
<span class="Preform-function-syntax"><np-new-property></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">...</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_void(PROPERTY_LIST_NT, W);</span>
|
|
|
|
<span class="Preform-function-syntax"><np-new-property-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-new-property-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_,/and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-new-property-list></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</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="SP17"></a><b>§17. </b>The "and" tail is much easier:
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-and-tail></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">,</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">{_,/and}</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> Wordings::first_wn(W); *XP= RP[1]</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="SP18"></a><b>§18. </b>Kind phrases are easier:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A sedan chair is a kind of vehicle. A weather pattern is a kind.</p>
|
|
</blockquote>
|
|
|
|
<p class="commentary">Note that indefinite articles are permitted before the word "kind(s)",
|
|
but definite articles are not.
|
|
</p>
|
|
|
|
<pre class="Preform-displayed-code all-displayed-code code-font">
|
|
<span class="Preform-function-syntax"><np-kind-phrase></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><indefinite-article></span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-kind-phrase-unarticled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[2]</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-kind-phrase-unarticled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = RP[1]</span>
|
|
|
|
<span class="Preform-function-syntax"><np-kind-phrase-unarticled></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">::=</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">kind/kinds</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">|</span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_void(KIND_NT, W)</span>
|
|
<span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">kind/kinds</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">of</span><span class="Preform-plain-syntax"> </span><span class="Preform-function-syntax"><np-inner></span><span class="Preform-plain-syntax"> </span><span class="Preform-reserved-syntax">==></span><span class="Preform-plain-syntax"> 0; *XP = NounPhrases::PN_single(KIND_NT, W, RP[1])</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="SP19"></a><b>§19. Relationship nodes. </b>A modest utility routine to construct and annotation RELATIONSHIP nodes.
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="Preform-constant-syntax">STANDARD_RELN</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">0</span><span class="Preform-plain-syntax"> </span><span class="Preform-comment-syntax"> the default annotation value: never explicitly set</span>
|
|
<span class="definition-keyword">define</span> <span class="Preform-constant-syntax">PARENTAGE_HERE_RELN</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">1</span><span class="Preform-plain-syntax"> </span><span class="Preform-comment-syntax"> only ever set by the Spatial plugin</span>
|
|
<span class="definition-keyword">define</span> <span class="Preform-constant-syntax">DIRECTION_RELN</span><span class="Preform-plain-syntax"> </span><span class="Preform-constant-syntax">2</span>
|
|
</pre>
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="function-syntax">NounPhrases::PN_rel</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">NounPhrases::PN_rel</span></span>:<br/><a href="4-np.html#SP14_1">§14.1</a><br/>Verb Phrases - <a href="4-vp.html#SP9_1">§9.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">wording</span><span class="plain-syntax"> </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="constant-syntax">VERB_MEANING_LINGUISTICS_TYPE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">R</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reln_type</span><span class="plain-syntax">, </span><span class="identifier-syntax">parse_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">referent</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">preform_lookahead_mode</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="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">Node::new</span><span class="plain-syntax">(</span><span class="constant-syntax">RELATIONSHIP_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">P</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">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">CORE_MODULE</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">R</span><span class="plain-syntax">) </span><span class="identifier-syntax">Node::set_relationship</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">R</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">reln_type</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">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="constant-syntax">relationship_node_type_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">reln_type</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"undefined relationship node"</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">referent</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">referent</span><span class="plain-syntax"> = </span><a href="4-np.html#SP2" class="function-link"><span class="function-syntax">NounPhrases::new_raw</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">Annotations::write_int</span><span class="plain-syntax">(</span><span class="identifier-syntax">referent</span><span class="plain-syntax">, </span><span class="constant-syntax">implicitly_refers_to_ANNOT</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="identifier-syntax">down</span><span class="plain-syntax"> = </span><span class="identifier-syntax">referent</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">P</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="4-dgr.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-lm.html">1</a></li><li class="progresschapter"><a href="2-adj.html">2</a></li><li class="progresschapter"><a href="3-vrb.html">3</a></li><li class="progresscurrentchapter">4</li><li class="progresssection"><a href="4-dgr.html">dgr</a></li><li class="progresscurrent">np</li><li class="progresssection"><a href="4-vp.html">vp</a></li><li class="progressnext"><a href="4-vp.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|