TUPLE: ast-name value ;
TUPLE: ast-number value ;
TUPLE: ast-string value ;
-TUPLE: ast-regexp value ;
+TUPLE: ast-regexp body flags ;
TUPLE: ast-cond-expr condition then else ;
TUPLE: ast-set lhs rhs ;
TUPLE: ast-get value ;
Space = " " | "\t" | "\n"
Spaces = Space* => [[ ignore ]]
Name = . ?[ ast-name? ]? => [[ value>> ]]
-Number = . ?[ ast-number? ]? => [[ value>> ]]
-String = . ?[ ast-string? ]? => [[ value>> ]]
-RegExp = . ?[ ast-regexp? ]? => [[ value>> ]]
+Number = . ?[ ast-number? ]?
+String = . ?[ ast-string? ]?
+RegExp = . ?[ ast-regexp? ]?
SpacesNoNl = (!(nl) Space)* => [[ ignore ]]
Expr = OrExpr:e "?" Expr:t ":" Expr:f => [[ e t f ast-cond-expr boa ]]
PrimExprHd = "(" Expr:e ")" => [[ e ]]
| "this" => [[ ast-this boa ]]
| Name => [[ ast-get boa ]]
- | Number => [[ ast-number boa ]]
- | String => [[ ast-string boa ]]
- | RegExp => [[ ast-regexp boa ]]
+ | Number
+ | String
+ | RegExp
| "function" FuncRest:fr => [[ fr ]]
| "new" PrimExpr:n "(" Args:as ")" => [[ n as ast-new boa ]]
| "new" PrimExpr:n => [[ n f ast-new boa ]]
Str = '"""' StringChars1:cs '"""' => [[ cs ast-string boa ]]
| '"' StringChars2:cs '"' => [[ cs ast-string boa ]]
| "'" StringChars3:cs "'" => [[ cs ast-string boa ]]
+RegExpFlags = NameRest*
RegExpBody = (!("/" | "\n" | "\r") .)* => [[ >string ]]
-RegExp = "/" RegExpBody:r "/" => [[ r ast-regexp boa ]]
+RegExp = "/" RegExpBody:b "/" RegExpFlags:fl => [[ b fl ast-regexp boa ]]
Special = "(" | ")" | "{" | "}" | "[" | "]" | "," | ";"
| "?" | ":" | "!==" | "!=" | "===" | "==" | "=" | ">="
| ">" | "<=" | "<" | "++" | "+=" | "+" | "--" | "-="