mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 08:34:22 +03:00
171 lines
11 KiB
HTML
171 lines
11 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">§2. Phase I: Slash Grammar</a></li><li><a href="5-itg.html#SP3">§3. Phase II: Determining Grammar</a></li><li><a href="5-itg.html#SP4">§4. Phase III: Sort Grammar</a></li><li><a href="5-itg.html#SP5">§5. Phase IV: Compile Grammar</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§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>§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>§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>§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>§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="4-ai.html">❮</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-act.html">4</a></li><li class="progresscurrentchapter">5</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">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|