mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
390 lines
38 KiB
HTML
390 lines
38 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Adjectival Definitions</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Compiler Webs</h2><ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul><h2>Inbuild Modules</h2><ul>
|
|
<li><a href="../supervisor-module/index.html">supervisor</a></li>
|
|
</ul><h2>Inform7 Modules</h2><ul>
|
|
<li><a href="index.html"><span class="selectedlink">core</span></a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul><h2>Inter Modules</h2><ul>
|
|
<li><a href="../bytecode-module/index.html">bytecode</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul><h2>Shared Modules</h2><ul>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'Adjectival Definitions' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#23">Chapter 23: Calculated Adjectives</a></li><li><b>Adjectival Definitions</b></li></ul><p class="purpose">The second of four ways phrases are invoked: as definitions of adjectives which can be used as unary predicates in the calculus. (And we also look after adjectives arising from I6 or I7 conditions, and from I6 routines.)</p>
|
|
|
|
<ul class="toc"><li><a href="23-ad.html#SP1">§1. Definitions</a></li><li><a href="23-ad.html#SP3">§3. The adjectives traverse</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>A typical example would be:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Definition: A container is significant if it contains a clue.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">Here the domain of the definition is "container", and the meaning assigned
|
|
to "significant" is an I7 condition; but we can also make it an I6
|
|
condition, or (a tidier way to express the same thing) delegate it to an
|
|
I6 routine. Phrases enter only when we define an adjective with an
|
|
explicit, though nameless, I7 rule:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Definition: A container (called the sac) is significant: if the sac contains a clue, decide yes; ...</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">That makes four distinct kinds of adjective, but all share the following
|
|
structure to hold details of their specific meanings:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">definition</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">definition_node</span><span class="plain">; </span><span class="comment"> current sentence: where the word "Definition" is</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">node</span><span class="plain">; </span><span class="comment"> where the actual definition is</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">format</span><span class="plain">; </span><span class="comment"> <code class="display"><span class="extract">+1</span></code> to go by condition, <code class="display"><span class="extract">-1</span></code> to negate it, <code class="display"><span class="extract">0</span></code> to use routine</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">condition_to_match</span><span class="plain">; </span><span class="comment"> text of condition to match, if <code class="display"><span class="extract">+1</span></code> or <code class="display"><span class="extract">-1</span></code></span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">domain_calling</span><span class="plain">; </span><span class="comment"> what if anything the term is called</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am_of_def</span><span class="plain">; </span><span class="comment"> which adjective meaning</span>
|
|
<span class="identifier">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">definition</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure definition is accessed in 23/abrp, 23/abrc, 23/abp, 23/abc and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. The adjectives traverse. </b>The following is used to deal with adjective definitions. In the simple
|
|
example:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Definition: A container is significant if it contains something.</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">we recognise this as a definition because its preamble consists just of
|
|
that one word:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="reserved">definition</span><span class="plain">-</span><span class="identifier">header</span><span class="plain">> ::=</span>
|
|
<span class="reserved">definition</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Having got that far, Inform descends to the body of the definition:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>A container is significant if it contains something</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">and applies the following grammar. This parsing happens very early in Inform's
|
|
run, before most of the kinds are created; but eventually the text of the
|
|
domain is expected to match <k-kind>. The text of the condition in
|
|
productions (a) and (b) in <adjective-definition> can have various
|
|
different forms. For timing reasons, we don't parse it this way, but it's
|
|
as if it had to match one of the following list of choices:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(1) <measurement-adjective-definition>
|
|
</li><li>(2) <inform6-routine-adjective-definition>
|
|
</li><li>(3) <inform6-condition-adjective-definition>
|
|
</li><li>(4) <spec-condition>
|
|
</li></ul>
|
|
<p class="inwebparagraph">At any rate, it will eventually have to make sense, but not yet.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Production (c) here looks useless, but is intended to catch cases like
|
|
this:
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Definition: a container is roomy rather than poky: ...</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">where the material at <code class="display"><span class="extract">...</span></code> is a phrase determining the truth of the
|
|
definition. (This was a very early feature of Inform, and one I think the
|
|
language could drop without much loss. No comparable feature exists for
|
|
binary predicates, so it seems odd to have it for unary predicates, and
|
|
the doubled use of colons is unfortunate.)
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain"><</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">> ::=</span>
|
|
<span class="plain"><</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">domain</span><span class="plain">> </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> <</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">wording</span><span class="plain">> </span><span class="reserved">if</span><span class="plain"> ... | ==> </span><span class="constant">DEFINED_POSITIVELY</span>
|
|
<span class="plain"><</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">domain</span><span class="plain">> </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> <</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">wording</span><span class="plain">> </span><span class="identifier">unless</span><span class="plain"> ... | ==> </span><span class="constant">DEFINED_NEGATIVELY</span>
|
|
<span class="plain"><</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">domain</span><span class="plain">> </span><span class="identifier">is</span><span class="plain">/</span><span class="identifier">are</span><span class="plain"> <</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">wording</span><span class="plain">> ==> </span><span class="constant">DEFINED_PHRASALLY</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">domain</span><span class="plain">> ::=</span>
|
|
<span class="plain">... ( </span><span class="identifier">called</span><span class="plain"> </span><span class="identifier">the</span><span class="plain"> ... ) | ==> </span><span class="constant">0</span><span class="plain">; <<</span><span class="identifier">calling</span><span class="plain">>> = </span><span class="identifier">TRUE</span>
|
|
<span class="plain">... ( </span><span class="identifier">called</span><span class="plain"> ... ) | ==> </span><span class="constant">0</span><span class="plain">; <<</span><span class="identifier">calling</span><span class="plain">>> = </span><span class="identifier">TRUE</span>
|
|
<span class="plain">... ==> </span><span class="constant">0</span><span class="plain">; <<</span><span class="identifier">calling</span><span class="plain">>> = </span><span class="identifier">FALSE</span>
|
|
|
|
<span class="plain"><</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">wording</span><span class="plain">> ::=</span>
|
|
<span class="plain">... </span><span class="identifier">rather</span><span class="plain"> </span><span class="identifier">than</span><span class="plain"> ... | ==> </span><span class="constant">0</span><span class="plain">; <<</span><span class="identifier">antonym</span><span class="plain">>> = </span><span class="identifier">TRUE</span>
|
|
<span class="plain">... ==> </span><span class="constant">0</span><span class="plain">; <<</span><span class="identifier">antonym</span><span class="plain">>> = </span><span class="identifier">FALSE</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>And here is the supporting code:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">DEFINED_POSITIVELY</span><span class="plain"> </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DEFINED_NEGATIVELY</span><span class="plain"> -1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DEFINED_PHRASALLY</span><span class="plain"> </span><span class="constant">0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DEFINED_IN_SOME_WAY_NOT_YET_KNOWN</span><span class="plain"> -2</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::Adjectives::traverse<button class="popup" onclick="togglePopup('usagePopup1822')">...<span class="popuptext" id="usagePopup1822">Usage of <b>Phrases::Adjectives::traverse</b>:<br>How To Compile - <a href="1-htc.html#SP2_3">§2.3</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="identifier">ParseTree::traverse</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="functiontext"><a href="23-ad.html#SP5">Phrases::Adjectives::look_for_headers</a></span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::Adjectives::look_for_headers<button class="popup" onclick="togglePopup('usagePopup1823')">...<span class="popuptext" id="usagePopup1823">Usage of <b>Phrases::Adjectives::look_for_headers</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) == </span><span class="identifier">ROUTINE_NT</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="reserved">definition</span><span class="plain">-</span><span class="identifier">header</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">))) {</span>
|
|
<span class="identifier">compilation_module</span><span class="plain"> *</span><span class="identifier">cm</span><span class="plain"> = </span><span class="functiontext"><a href="27-cm.html#SP6">Modules::current</a></span><span class="plain">();</span>
|
|
<span class="functiontext"><a href="27-cm.html#SP6">Modules::set_current</a></span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain"> = (</span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain">)?(</span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain">-></span><span class="element">down</span><span class="plain">):</span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">q</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><<span class="cwebmacro">Futz with the parse tree, trying right not down</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">DNW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span><span class="comment"> domain name</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CALLW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span><span class="comment"> calling</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span><span class="comment"> adjective name</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span><span class="comment"> negation name</span>
|
|
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CONW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">; </span><span class="comment"> condition text</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">the_format</span><span class="plain"> = </span><span class="constant">DEFINED_IN_SOME_WAY_NOT_YET_KNOWN</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Parse the Q-node as an adjective definition</span> <span class="cwebmacronumber">5.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Perform sanity checks on the result</span> <span class="cwebmacronumber">5.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Register the resulting adjective</span> <span class="cwebmacronumber">5.4</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">the_format</span><span class="plain"> != </span><span class="constant">DEFINED_PHRASALLY</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="functiontext"><a href="27-cm.html#SP6">Modules::set_current_to</a></span><span class="plain">(</span><span class="identifier">cm</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b>The tree structure is slightly different according to whether the adjective
|
|
is defined by routine or not.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Futz with the parse tree, trying right not down</span> <span class="cwebmacronumber">5.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">-></span><span class="element">next</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">ParseTree::get_type</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">-></span><span class="element">next</span><span class="plain">) != </span><span class="identifier">ROUTINE_NT</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">BelievedImpossible</span><span class="plain">),</span>
|
|
<span class="string">"don't leave me in suspense"</span><span class="plain">,</span>
|
|
<span class="string">"write a definition after 'Definition:'!"</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">q</span><span class="plain"> = </span><span class="identifier">p</span><span class="plain">-></span><span class="element">next</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">-></span><span class="element">next</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">-></span><span class="element">next</span><span class="plain">; </span><span class="identifier">p</span><span class="plain">-></span><span class="element">down</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">-></span><span class="element">down</span><span class="plain">; </span><span class="identifier">q</span><span class="plain">-></span><span class="element">next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="23-ad.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Parse the Q-node as an adjective definition</span> <span class="cwebmacronumber">5.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">>(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">))) {</span>
|
|
<span class="identifier">the_format</span><span class="plain"> = <<</span><span class="identifier">r</span><span class="plain">>>;</span>
|
|
<span class="identifier">DNW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">domain</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">calling</span><span class="plain">>>) </span><span class="identifier">CALLW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">domain</span><span class="plain">>, </span><span class="constant">2</span><span class="plain">);</span>
|
|
<span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">wording</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (<<</span><span class="identifier">antonym</span><span class="plain">>>) </span><span class="identifier">NW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">adjective</span><span class="plain">-</span><span class="identifier">wording</span><span class="plain">>, </span><span class="constant">2</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">the_format</span><span class="plain"> != </span><span class="constant">DEFINED_PHRASALLY</span><span class="plain">)</span>
|
|
<span class="identifier">CONW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(<</span><span class="identifier">adjective</span><span class="plain">-</span><span class="reserved">definition</span><span class="plain">>, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="23-ad.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_3"></a><b>§5.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Perform sanity checks on the result</span> <span class="cwebmacronumber">5.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">the_format</span><span class="plain"> == </span><span class="constant">DEFINED_IN_SOME_WAY_NOT_YET_KNOWN</span><span class="plain">) ||</span>
|
|
<span class="plain">((</span><span class="identifier">the_format</span><span class="plain"> == </span><span class="constant">DEFINED_PHRASALLY</span><span class="plain">) && (</span><span class="identifier">q</span><span class="plain">-></span><span class="element">down</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Definition tree (%d):\n$T\n"</span><span class="plain">, </span><span class="identifier">the_format</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_DefinitionWithoutCondition</span><span class="plain">),</span>
|
|
<span class="identifier">q</span><span class="plain">, </span><span class="string">"a definition must take the form 'Definition: a ... is ... if/unless "</span>
|
|
<span class="string">"...' or else 'Definition: a ... is ...: ...'"</span><span class="plain">,</span>
|
|
<span class="string">"but I can't make this fit either shape."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::mismatched_brackets</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">)) ||</span>
|
|
<span class="plain">((</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)) && (</span><span class="identifier">Wordings::mismatched_brackets</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)))) {</span>
|
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Definition tree:\n$T\n"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::definition_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_BracketedAdjective</span><span class="plain">),</span>
|
|
<span class="identifier">q</span><span class="plain">, </span><span class="string">"this definition seems to involve unexpected brackets in the name of "</span>
|
|
<span class="string">"the adjective being defined"</span><span class="plain">,</span>
|
|
<span class="string">"so I think I must be misreading it."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="23-ad.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_4"></a><b>§5.4. </b>As we've seen, adjectives can take many forms, and what we do here is to
|
|
offer the new adjective around and see if anybody claims it.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Register the resulting adjective</span> <span class="cwebmacronumber">5.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">am</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP36">Adjectives::Meanings::parse</a></span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">the_format</span><span class="plain">, </span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">DNW</span><span class="plain">, </span><span class="identifier">CONW</span><span class="plain">, </span><span class="identifier">CALLW</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">am</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unclaimed adjective definition"</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)) {</span>
|
|
<span class="reserved">adjective_meaning</span><span class="plain"> *</span><span class="identifier">neg</span><span class="plain"> = </span><span class="functiontext"><a href="4-am.html#SP17">Adjectives::Meanings::negate</a></span><span class="plain">(</span><span class="identifier">am</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-am.html#SP7">Adjectives::Meanings::declare</a></span><span class="plain">(</span><span class="identifier">neg</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">, </span><span class="constant">5</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="23-ad.html#SP5">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">ADJECTIVE_NAME_VETTING</span><span class="plain"> </span><span class="functiontext"><a href="23-ad.html#SP6">Phrases::Adjectives::vet_name</a></span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Phrases::Adjectives::vet_name<button class="popup" onclick="togglePopup('usagePopup1824')">...<span class="popuptext" id="usagePopup1824">Usage of <b>Phrases::Adjectives::vet_name</b>:<br>none</span></button></span><span class="plain">(</span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">article</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_ArticleAsAdjective</span><span class="plain">),</span>
|
|
<span class="string">"a defined adjective cannot consist only of an article such as "</span>
|
|
<span class="string">"'a' or 'the'"</span><span class="plain">,</span>
|
|
<span class="string">"since this will lead to parsing ambiguities."</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (<</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">>(</span><span class="identifier">W</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">problem_count</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::quote_wording</span><span class="plain">(2, </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="functiontext"><a href="1-wtc.html#SP5">Task::syntax_tree</a></span><span class="plain">(), </span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_AdjectivePunctuated</span><span class="plain">));</span>
|
|
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
|
|
<span class="string">"The sentence %1 seems to create an adjective with the name "</span>
|
|
<span class="string">"'%2', but adjectives have to be contain only unpunctuated "</span>
|
|
<span class="string">"words."</span><span class="plain">);</span>
|
|
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOOP_THROUGH_WORDING</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">)</span>
|
|
<span class="identifier">Preform::mark_word</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">, <</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">adjective</span><span class="plain">>);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Which leaves only:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">definition</span><span class="plain"> *</span><span class="functiontext">Phrases::Adjectives::def_new<button class="popup" onclick="togglePopup('usagePopup1825')">...<span class="popuptext" id="usagePopup1825">Usage of <b>Phrases::Adjectives::def_new</b>:<br>Adjectives by Raw Phrase - <a href="23-abrp.html#SP2">§2</a><br>Adjectives by Raw Condition - <a href="23-abrc.html#SP2">§2</a><br>Adjectives by Phrase - <a href="23-abp.html#SP1">§1</a><br>Adjectives by Condition - <a href="23-abc.html#SP1">§1</a></span></button></span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">) {</span>
|
|
<span class="reserved">definition</span><span class="plain"> *</span><span class="identifier">def</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">definition</span><span class="plain">);</span>
|
|
<span class="identifier">def</span><span class="plain">-></span><span class="element">node</span><span class="plain"> = </span><span class="identifier">q</span><span class="plain">;</span>
|
|
<span class="identifier">def</span><span class="plain">-></span><span class="element">format</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">def</span><span class="plain">-></span><span class="element">condition_to_match</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">def</span><span class="plain">-></span><span class="element">domain_calling</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
|
|
<span class="identifier">def</span><span class="plain">-></span><span class="element">definition_node</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">def</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><i>(This section begins Chapter 23: Calculated Adjectives.)</i></li><li><a href="23-abrp.html">Continue with 'Adjectives by Raw Phrase'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|