 Letter            = [a-zA-Z]
 Digit             = [0-9]
 Digits            = (Digit)+
-SingleLineComment = "//" (!("\n") .)* "\n" => [[ drop ignore ]]
-MultiLineComment  = "/*" (!("*/") .)* "*/" => [[ drop ignore ]]
+SingleLineComment = "//" (!("\n") .)* "\n" => [[ ignore ]]
+MultiLineComment  = "/*" (!("*/") .)* "*/" => [[ ignore ]]
 Space             = " " | "\t" | "\n" | SingleLineComment | MultiLineComment
-Spaces            = (Space)* => [[ drop ignore ]]
+Spaces            = (Space)* => [[ ignore ]]
 NameFirst         = Letter | "$" | "_"
 NameRest          = NameFirst | Digit
 iName             = NameFirst (NameRest)* => [[ first2 swap prefix >string ]]

                     | Spaces => [[ "true" ast-get boa ]] 
For3               =   Expr
                     | Spaces => [[ "undefined" ast-get boa ]] 
ForIn1             =   "var" Name:n => [[ drop n "undefined" ast-get boa ast-var boa ]]
                     | Expr
Switch1            =   "case" Expr:c ":" SrcElems:cs => [[ drop c cs ast-case boa ]]
                     | "default" ":" SrcElems:cs => [[ drop cs ast-default boa ]]  
SwitchBody         = (Switch1)*
Finally            =   "finally" Block:b => [[ drop b ]]
                     | Spaces => [[ drop "undefined" ast-get boa ]]
Stmt               =   Block                     
                     | "var" Bindings:bs Sc                   => [[ drop bs ast-begin boa ]]
                     | "if" "(" Expr:c ")" Stmt:t "else" Stmt:f => [[ drop c t f ast-if boa ]]
                     | "if" "(" Expr:c ")" Stmt:t               => [[ drop c t "undefined" ast-get boa ast-if boa ]]
                     | "while" "(" Expr:c ")" Stmt:s            => [[ drop c s ast-while boa ]]
                     | "do" Stmt:s "while" "(" Expr:c ")" Sc    => [[ drop s c ast-do-while boa ]]
                     | "for" "(" For1:i ";" For2:c ";" For3:u ")" Stmt:s => [[ drop i c u s ast-for boa ]]
                     | "for" "(" ForIn1:v "in" Expr:e ")" Stmt:s => [[ drop v e s ast-for-in boa ]]
                     | "switch" "(" Expr:e ")" "{" SwitchBody:cs "}" => [[ drop e cs ast-switch boa ]]
                     | "break" Sc                                    => [[ drop ast-break boa ]]
                     | "continue" Sc                                 => [[ drop ast-continue boa ]]
                     | "throw" SpacesNoNl Expr:e Sc                  => [[ drop e ast-throw boa ]]
                     | "try" Block:t "catch" "(" Name:e ")" Block:c Finally:f => [[ drop t e c f ast-try boa ]]
                     | "return" Expr:e Sc                            => [[ drop e ast-return boa ]]
                     | "return" Sc                                   => [[ drop "undefined" ast-get boa ast-return boa ]]
                     | Expr:e Sc                                     => [[ drop e ]]
                     | ";"                                           => [[ drop "undefined" ast-get boa ]]
SrcElem            =   "function" Name:n FuncRest:f                  => [[ drop n f ast-var boa ]]
                     | Stmt
SrcElems           = (SrcElem)*                                      => [[ ast-begin boa ]]
TopLevel           = SrcElems Spaces                               

                    | "void"
                    | "while"
                    | "with") => [[ ast-keyword boa ]]
Name              = !(Keyword) (iName):n => [[ n ast-name boa ]]
Number            =   Digits:ws '.' Digits:fs => [[ ws "." fs 3array concat >string string>number ast-number boa ]]
                    | Digits => [[ >string string>number ast-number boa ]]  

EscapeChar        =   "\\n" => [[ 10 ]] 
                    | "\\r" => [[ 13 ]]
                    | "\\t" => [[ 9 ]]
StringChars1       = (EscapeChar | !('"""') .)* => [[ >string ]]
StringChars2       = (EscapeChar | !('"') .)* => [[ >string ]]
StringChars3       = (EscapeChar | !("'") .)* => [[ >string ]]
Str                =   '"""' StringChars1:cs '"""' => [[ cs ast-string boa ]]
                     | '"' StringChars2:cs '"' => [[ cs ast-string boa ]]
                     | "'" StringChars3:cs "'" => [[ cs ast-string boa ]]
Special            =   "("   | ")"   | "{"   | "}"   | "["   | "]"   | ","   | ";"
                     | "?"   | ":"   | "!==" | "~="  | "===" | "=="  | "="   | ">="
                     | ">"   | "<="  | "<"   | "++"  | "+="  | "+"   | "--"  | "-="
