<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -26,7 +26,7 @@ var Identifier = function(state) { return Identifier(state); }
 
 var ReservedWord = choice(&quot;end&quot;, &quot;fn&quot;, &quot;if&quot;,
                           &quot;infixl&quot;, &quot;infixr&quot;, &quot;infix&quot;, &quot;in&quot;,
-                          &quot;let&quot;, &quot;module&quot;)
+                          &quot;let&quot;, &quot;module&quot;, &quot;do&quot;)
 var ReservedOperator = choice(&quot;|&quot;, &quot;@&quot;, &quot;-&gt;&quot;, &quot;=&quot;)
 
 var IdentifierBeginning = choice(range(&quot;a&quot;, &quot;z&quot;), &quot;_&quot;)
@@ -333,23 +333,29 @@ updateOpParser()
 /* dynamic hook to allow updating the table.  */
 var Infix0 = function(state) { return opParser(state) }
 
-var Infix = chainl(whitespace(Infix0), action(whitespace(';'),
-  function(ast) { return function(lhs, rhs) {
-                    if (lhs.type == &quot;seq&quot;)
-                      return { type: &quot;seq&quot;, exprs: lhs.exprs.concat(rhs) }
-                    else
-                      return { type: &quot;seq&quot;, exprs: [lhs, rhs] }}}))
+var Infix = action(sequence(
+  chainl(whitespace(Infix0), action(whitespace(';'),
+    function(ast) { return function(lhs, rhs) {
+                      if (lhs.type == &quot;seq&quot;)
+                        return { type: &quot;seq&quot;, exprs: lhs.exprs.concat(rhs) }
+                      else
+                        return { type: &quot;seq&quot;, exprs: [lhs, rhs] }}})),
+  optional(whitespace(&quot;;&quot;))),
+    function(ast) { return ast[0] })
 
 var Module = action(wsequence(&quot;module&quot;, repeat0(TopLevelExpr), &quot;end&quot;),
   function(ast) { return { type: &quot;module&quot;, exprs: ast[1] } })
 
+var Block = action(wsequence(&quot;do&quot;, repeat0(Expr), &quot;end&quot;),
+  function(ast) { return { type: &quot;seq&quot;, exprs: ast[1] } })
+
 var NamedModule = action(wsequence(&quot;module&quot;, Identifier,
                                    repeat0(TopLevelExpr), &quot;end&quot;),
   function(ast) { return { type: &quot;def&quot;, bindings:
                            [[ast[1], { type: &quot;module&quot;, exprs: ast[2] }]]
                          }})
 
-var Expr = choice(App, Infix, ExprNoOp, Module)
+var Expr = choice(App, Infix, ExprNoOp, Module, Block)
 
 var OpDecl = action(choice(action(wsequence(&quot;infixl&quot;, Operator, DecimalLiteral),
                                   function(ast) {</diff>
      <filename>yam.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>7d8c28c4083089cefbf9aa76c04d0d5be52f80c3</id>
    </parent>
  </parents>
  <author>
    <name>Christian Neukirchen</name>
    <email>chneukirchen@gmail.com</email>
  </author>
  <url>http://github.com/chneukirchen/yam/commit/a3b53d059ab3d8cc30c1c0f1d90d05337ea6fb51</url>
  <id>a3b53d059ab3d8cc30c1c0f1d90d05337ea6fb51</id>
  <committed-date>2009-02-01T07:21:24-08:00</committed-date>
  <authored-date>2009-02-01T07:21:24-08:00</authored-date>
  <message>Add do/end blocks, allow trailing semicolon</message>
  <tree>378751eac2d6a5b824c5ca14bc3630b2cc1a5a7a</tree>
  <committer>
    <name>Christian Neukirchen</name>
    <email>chneukirchen@gmail.com</email>
  </committer>
</commit>
