1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/5-itg.html
2021-02-24 10:10:34 +00:00

171 lines
12 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Introduction to Grammar</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">
<link href="../docs-assets/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="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="index.html"><span class="selectedlink">if</span></a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../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="../calculus-module/index.html">calculus</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="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Introduction to Grammar' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7</a></li><li><a href="index.html">if</a></li><li><a href="index.html#5">Chapter 5: Command Grammar</a></li><li><b>Introduction to Grammar</b></li></ul></div>
<p class="purpose">An exposition of the data structures and basic method used to deal with the command-parsing grammar implied by Understand sentences in the source text.</p>
<ul class="toc"><li><a href="5-itg.html#SP2">&#167;2. Phase I: Slash Grammar</a></li><li><a href="5-itg.html#SP3">&#167;3. Phase II: Determining Grammar</a></li><li><a href="5-itg.html#SP4">&#167;4. Phase III: Sort Grammar</a></li><li><a href="5-itg.html#SP5">&#167;5. Phase IV: Compile Grammar</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b>This is grammar in the sense of the parsing structures used at run-time,
and it occupies a chapter of its own in the source code since it is to some
extent detached from the rest of Inform: what we create in this chapter is
almost an independent compiler in its own right, but of a much simpler
language. Although we use many higher-level features of Inform in the process,
none use this.
</p>
<p class="commentary">Grammar is organised in a three-level hierarchy:
</p>
<ul class="items"><li>(a) A grammar verb (GV) is a small independent grammar of alternative
formulations for some concept: for instance, the possible commands beginning
TAKE, or the possible verbal forms of numbers. Each GV is a list of GLs, and
an individual GL must belong to exactly one GV. There are five different
types of GV, differentiated mostly by the purpose to which the GV is put:
<ul class="items"><li>(1) <span class="extract"><span class="extract-syntax">GV_IS_COMMAND</span></span>. An imperative verbal command at run-time.
</li><li>(2) <span class="extract"><span class="extract-syntax">GV_IS_TOKEN</span></span>. A square-bracketed token in other grammar.
</li><li>(3) <span class="extract"><span class="extract-syntax">GV_IS_OBJECT</span></span>. A noun phrase at run time: a name for an object.
</li><li>(4) <span class="extract"><span class="extract-syntax">GV_IS_VALUE</span></span>. A noun phrase at run time: a name for a value.
</li><li>(5) <span class="extract"><span class="extract-syntax">GV_IS_CONSULT</span></span>. A pattern to match in part of a command (such as "consult").
</li><li>(6) <span class="extract"><span class="extract-syntax">GV_IS_PROPERTY_NAME</span></span>. A noun phrase at run time: a name for one
possibility for an either/or property, say "open" or "fixed in place".
</li></ul>
<li>(b) A grammar line (GL) is a single possibility within a GV: for
example, the line matching <span class="extract"><span class="extract-syntax">"take [something]"</span></span> in the GV for the TAKE
command. Each GL is a list of tokens, and an individual token must belong
to exactly one GL.
</li><li>(c) A grammar token (GTOK) is a single particle of a GL: for
example, <span class="extract"><span class="extract-syntax">'take'</span></span> and <span class="extract"><span class="extract-syntax">something</span></span> are tokens.
</li></ul>
<p class="commentary">The picture is not quite so hierarchical as it looks, though, because
a GV naming a token can be used as a token inside other GVs. We need to
be careful that this does not lead to infinite regress: see below.
</p>
<p class="commentary">Much of what we do with grammar involves recursing down this hierarchy,
in some cases allowing results to percolate back upwards. What happens
takes place in four chronological phases. (This division into phases is
convenient because Inform 6 requires that all general parsing routines
and noun filter routines already exist when a <span class="extract"><span class="extract-syntax">Verb</span></span> directive is reached
which uses them.)
</p>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Phase I: Slash Grammar. </b>Slashing is the process of dealing with slashes <span class="extract"><span class="extract-syntax">/</span></span> used in grammar
to indicate alternatives.
</p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. Phase II: Determining Grammar. </b>We check that the grammar is well-founded and find the types of values
expressed by it, if any.
</p>
<p class="commentary">Determining well-foundedness means checking that no two grammar tokens
each require the use of the other, and that when a grammar token takes
several alternative forms, they have compatible results: so, for instance,
you can't have one version resulting in a number and another in a thing.
(This check is only meaningful for grammar verbs of type <span class="extract"><span class="extract-syntax">GV_IS_TOKEN</span></span>.)
</p>
<p class="commentary">The result of a <span class="extract"><span class="extract-syntax">GV_IS_TOKEN</span></span> is a single specification, which is the union of the
kinds resulting from its grammar lines. This is a more sophisticated approach
than we really need here, but might be useful for future expansion.
</p>
<p class="commentary">Of the determining traverse the following can be said:
</p>
<ul class="items"><li>(a) either errors are produced, or it is verified that no token's
definition depends directly or indirectly on already knowing itself;
</li><li>(b) also that no grammar line attached to a <span class="extract"><span class="extract-syntax">GV_IS_COMMAND</span></span> produces
more than 2 values, and that no grammar line attached to anything else
produces more than one; and
</li><li>(c) also that the grammar lines attached to a <span class="extract"><span class="extract-syntax">GV_IS_TOKEN</span></span> are
compatible in that there is a type to which they can all always be cast.
</li></ul>
<p class="commentary">We note of the determining routines that:
</p>
<ul class="items"><li>(a) <span class="extract"><span class="extract-syntax">PL::Parsing::Verbs::determine</span></span> runs at least once for each GV;
</li><li>(b) <span class="extract"><span class="extract-syntax">PL::Parsing::Lines::gl_determine</span></span> runs exactly once on each GL;
</li><li>(c) <span class="extract"><span class="extract-syntax">PL::Parsing::Tokens::determine</span></span> runs exactly once on each token.
</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Phase III: Sort Grammar. </b>We must ensure that if grammar line L1 is logically impossible once L2
has been parsed, then L1 must be checked before L2, regardless of the
ordering in the source code. Since the data sets are very small and
time is not of the essence, we simply insertion-sort the original
definition-order list into a second linked list.
</p>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. Phase IV: Compile Grammar. </b>The final run-through, which uses the sorted order and not the original
declaration order, actually compiles the necessary I6 <span class="extract"><span class="extract-syntax">Verb</span></span> and
<span class="extract"><span class="extract-syntax">Extend</span></span> directives.
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-pnaa.html">&#10094;</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-im.html">1</a></li><li class="progresschapter"><a href="2-bd.html">2</a></li><li class="progresschapter"><a href="3-sm.html">3</a></li><li class="progresschapter"><a href="4-ap.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-pp.html">pp</a></li><li class="progresssection"><a href="5-pnaa.html">pnaa</a></li><li class="progresscurrent">itg</li><li class="progresssection"><a href="5-tfg.html">tfg</a></li><li class="progresssection"><a href="5-gp.html">gp</a></li><li class="progresssection"><a href="5-gv.html">gv</a></li><li class="progresssection"><a href="5-gl.html">gl</a></li><li class="progresssection"><a href="5-gt.html">gt</a></li><li class="progresssection"><a href="5-gt2.html">gt2</a></li><li class="progresssection"><a href="5-nft.html">nft</a></li><li class="progresssection"><a href="5-tpv.html">tpv</a></li><li class="progresssection"><a href="5-gpr.html">gpr</a></li><li class="progressnext"><a href="5-tfg.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>