from our rules and saves it into <code>lib/parser.js</code>.</p></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-2"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-2">¶</a></div><p>The only dependency is on the <strong>Jison.Parser</strong>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="p">{</span><spanclass="nx">Parser</span><spanclass="p">}</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="s1">'jison'</span></pre></div></td></tr><trid="section-3"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-3">¶</a></div><h2>Jison DSL</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-4"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-4">¶</a></div><p>Since we're going to be wrapped in a function by Jison in any case, if our
wrapper and just returning the value directly.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">unwrap = </span><spanclass="sr">/^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/</span></pre></div></td></tr><trid="section-5"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-5">¶</a></div><p>Our handy DSL for Jison grammar generation, thanks to
<spanclass="p">[</span><spanclass="nx">patternString</span><spanclass="p">,</span><spanclass="s2">"$$ = #{action};"</span><spanclass="p">,</span><spanclass="nx">options</span><spanclass="p">]</span></pre></div></td></tr><trid="section-6"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-6">¶</a></div><h2>Grammatical Rules</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-7"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-7">¶</a></div><p>In all of the rules that follow, you'll see the name of the nonterminal as
<code>Expression</code>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">grammar =</span></pre></div></td></tr><trid="section-8"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-8">¶</a></div><p>The <strong>Root</strong> is the top-level node in the syntax tree. Since we parse bottom-up,
all parsing must end here.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Root</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-9"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-9">¶</a></div><p>Any list of statements and expressions, separated by line breaks or semicolons.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Body</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-10"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-10">¶</a></div><p>Expressions and statements, which make up a line in a body.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Line</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-11"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-11">¶</a></div><p>Pure statements which cannot be expressions.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Statement</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-12"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-12">¶</a></div><p>All the different types of expressions in our language. The basic unit of
them somewhat circular.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Expression</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-13"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-13">¶</a></div><p>An indented block of expressions. Note that the <ahref="rewriter.html">Rewriter</a>
<spanclass="nx">o</span><spanclass="s1">'INDENT Body OUTDENT'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">$2</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-14"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-14">¶</a></div><p>A literal identifier, a variable name or property.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Identifier</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-15"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-15">¶</a></div><p>Alphanumerics are separated from the other <strong>Literal</strong> matchers because
they can also serve as keys in object literals.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">AlphaNumeric</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-16"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-16">¶</a></div><p>All of our immediate values. These can (in general), be passed straight
through and printed to JavaScript.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Literal</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-17"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-17">¶</a></div><p>Assignment of a variable, property, or index to a value.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Assign</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-18"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-18">¶</a></div><p>Assignment when it happens within an object literal. The difference from
the ordinary <strong>Assign</strong> is that these allow numbers and strings as keys.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">AssignObj</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-19"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-19">¶</a></div><p>A return statement from a function body.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Return</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-21"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-21">¶</a></div><p>The <strong>Code</strong> node is the function literal. It's defined by an indented block
<spanclass="p">]</span></pre></div></td></tr><trid="section-22"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-22">¶</a></div><p>CoffeeScript has two different symbols for functions. <code>-></code> is for ordinary
functions, and <code>=></code> is for functions bound to the current value of <em>this</em>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">FuncGlyph</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-24"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-24">¶</a></div><p>The list of parameters that a function accepts can be of any length.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">ParamList</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-25"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-25">¶</a></div><p>A single parameter in a function definition can be ordinary, or a splat
that hoovers up the remaining arguments.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Param</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-26"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-26">¶</a></div><p>A splat that occurs outside of a parameter list.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Splat</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-27"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-27">¶</a></div><p>Variables and properties that can be assigned to.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">SimpleAssignable</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-28"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-28">¶</a></div><p>Everything that can be assigned to.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Assignable</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-29"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-29">¶</a></div><p>The types of things that can be treated as values -- assigned to, invoked
as functions, indexed into, named as a class, etc.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Value</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-30"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-30">¶</a></div><p>The general group of accessors into an object, by property, by prototype
or by array index or slice.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Accessor</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-31"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-31">¶</a></div><p>Indexing into an object or array using bracket notation.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Index</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-32"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-32">¶</a></div><p>In CoffeeScript, an object literal is simply a list of assignments.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nb">Object</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-33"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-33">¶</a></div><p>Assignment of properties within an object literal can be separated by
comma, as in JavaScript, or simply by newline.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">AssignList</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-34"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-34">¶</a></div><p>Class definitions have optional bodies of prototype property assignments,
and optional references to the superclass.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Class</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="nx">o</span><spanclass="s1">'CLASS EXTENDS Value Block'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="k">new</span><spanclass="nx">Class</span><spanclass="kc">null</span><spanclass="p">,</span><spanclass="nx">$3</span><spanclass="p">,</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'CLASS SimpleAssignable EXTENDS Value Block'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="k">new</span><spanclass="nx">Class</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">$4</span><spanclass="p">,</span><spanclass="nx">$5</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-35"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-35">¶</a></div><p>Ordinary function invocation, or a chained series of calls.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Invocation</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-36"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-36">¶</a></div><p>An optional existence check on a function.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">OptFuncExist</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-37"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-37">¶</a></div><p>The list of arguments to a function call.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Arguments</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-38"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-38">¶</a></div><p>A reference to the <em>this</em> current object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">This</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-39"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-39">¶</a></div><p>A reference to a property on <em>this</em>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">ThisProperty</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-41"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-41">¶</a></div><p>The <strong>ArgList</strong> is both the list of objects passed into a function call,
(i.e. comma-separated expressions). Newlines work as well.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">ArgList</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-42"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-42">¶</a></div><p>Valid arguments are Expressions or Splats.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Arg</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-43"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-43">¶</a></div><p>Just simple, comma-separated, required arguments (no fancy syntax). We need
having the newlines wouldn't make sense.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">SimpleArgs</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-45"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-45">¶</a></div><p>A catch clause names its error and runs a block of code.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Catch</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-46"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-46">¶</a></div><p>Throw an exception object.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">Throw</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-47"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-47">¶</a></div><p>Parenthetical expressions. Note that the <strong>Parenthetical</strong> is a <strong>Value</strong>,
<spanclass="p">]</span></pre></div></td></tr><trid="section-48"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-48">¶</a></div><p>The condition portion of a while loop.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">WhileSource</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="nx">o</span><spanclass="s1">'WHILE Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="k">new</span><spanclass="nx">While</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'UNTIL Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="k">new</span><spanclass="nx">While</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">invert</span><spanclass="o">:</span><spanclass="kc">true</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-49"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-49">¶</a></div><p>The while loop can either be normal, with a block of expressions to execute,
or postfix, with a single expression. There is no do..while.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">While</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-50"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-50">¶</a></div><p>Array, object, and range comprehensions, at the most generic level.
or postfix, with a single expression.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">For</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-51"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-51">¶</a></div><p>An array of all accepted values for a variable inside the loop. This
enables support for pattern matching.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">ForValue</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="nx">o</span><spanclass="s1">'FORIN Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">source</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'FORIN Expression BY Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">source</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">step</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'FORIN Expression BY Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">source</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">step</span><spanclass="o">:</span><spanclass="nx">$4</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$6</span>
<spanclass="nx">o</span><spanclass="s1">'FOROF Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">object</span><spanclass="o">:</span><spanclass="kc">on</span><spanclass="p">,</span><spanclass="nx">source</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'TO Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">to</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'TO Expression BY Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">to</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">step</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="nx">o</span><spanclass="s1">'TO Expression BY Expression WHEN Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">to</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">step</span><spanclass="o">:</span><spanclass="nx">$4</span><spanclass="p">,</span><spanclass="nx">guard</span><spanclass="o">:</span><spanclass="nx">$6</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-52"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-52">¶</a></div><p>The source of a comprehension is an array or object with an optional guard
in fixed-size increments.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">ForBody</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="nx">o</span><spanclass="s1">'FOR ALL Identifier ForOf'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">extend</span><spanclass="nx">$4</span><spanclass="p">,</span><spanclass="nx">raw</span><spanclass="o">:</span><spanclass="kc">on</span><spanclass="p">,</span><spanclass="nx">index</span><spanclass="o">:</span><spanclass="nx">$3</span>
<spanclass="nx">o</span><spanclass="s1">'FOR ALL Identifier , ForValue ForOf'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">extend</span><spanclass="nx">$6</span><spanclass="p">,</span><spanclass="nx">raw</span><spanclass="o">:</span><spanclass="kc">on</span><spanclass="p">,</span><spanclass="nx">index</span><spanclass="o">:</span><spanclass="nx">$3</span><spanclass="p">,</span><spanclass="nx">name</span><spanclass="o">:</span><spanclass="nx">$5</span>
<spanclass="nx">o</span><spanclass="s1">'FOR Identifier FROM Expression ForTo'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">extend</span><spanclass="nx">$5</span><spanclass="p">,</span><spanclass="nx">index</span><spanclass="o">:</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">from</span><spanclass="o">:</span><spanclass="nx">$4</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-54"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-54">¶</a></div><p>The most basic form of <em>if</em> is a condition and an action. The following
<spanclass="nx">o</span><spanclass="s1">'IfBlock ELSE IF Expression Block'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="nx">$1</span><spanclass="p">.</span><spanclass="nx">addElse</span><spanclass="k">new</span><spanclass="nx">If</span><spanclass="nx">$4</span><spanclass="p">,</span><spanclass="nx">$5</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-55"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-55">¶</a></div><p>The full complement of <em>if</em> expressions, including postfix one-liner
<em>if</em> and <em>unless</em>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nx">If</span><spanclass="o">:</span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-56"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-56">¶</a></div><p>Arithmetic and logical operators, working on one or more operands.
<spanclass="nx">o</span><spanclass="s1">'Expression MATH Expression'</span><spanclass="p">,</span><spanclass="o">-></span><spanclass="k">new</span><spanclass="nx">Op</span><spanclass="nx">$2</span><spanclass="p">,</span><spanclass="nx">$1</span><spanclass="p">,</span><spanclass="nx">$3</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-58"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-58">¶</a></div><h2>Precedence</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-59"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-59">¶</a></div><p>Operators at the top of this list have higher precedence than the ones lower
<spanclass="p">]</span></pre></div></td></tr><trid="section-60"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-60">¶</a></div><h2>Wrapping Up</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-61"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-61">¶</a></div><p>Finally, now what we have our <strong>grammar</strong> and our <strong>operators</strong>, we can create
<spanclass="nx">alt</span></pre></div></td></tr><trid="section-62"><tdclass="docs"><divclass="pilwrap"><aclass="pilcrow"href="#section-62">¶</a></div><p>Initialize the <strong>Parser</strong> with our list of terminal <strong>tokens</strong>, our <strong>grammar</strong>
(as in <ahref="http://dinosaur.compilertools.net/yacc/index.html">Yacc</a>).</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">exports.parser = </span><spanclass="k">new</span><spanclass="nx">Parser</span>