output = "." => [[ [ (.) ] ]]
input = "," => [[ [ (,) ] ]]
debug = "#" => [[ [ (#) ] ]]
-space = (" "|"\t"|"\r\n"|"\n")+ => [[ [ ] ]]
+space = [ \t\n\r]+ => [[ [ ] ]]
unknown = (.) => [[ "Invalid input" throw ]]
ops = inc-ptr|dec-ptr|inc-mem|dec-mem|output|input|debug|space
StopChar = ('('|')'|'['|']'|'{'|'}'|'/'|'/'|';'|':'|'!'|'.')
-Space = ' ' | '\t' | '\r' | '\n'
+Space = [ \t\n\r]
Spaces = Space* => [[ ignore ]]
-Newline = ('\n' | '\r')
+Newline = [\n\r]
Number = Sign Digit+ ('.' => [[ first ]] Digit+)? ('e' => [[ first ]] Sign Digit+)?
=> [[ flatten sift >string string>number ]]
Digits = Digit+
Number = Digits '.' Digits => [[ "" concat-as string>number ast-number boa ]]
| Digits => [[ >string string>number ast-number boa ]]
-Space = " " | "\n" | "\r" | "\t"
+Space = [ \t\n\r]
Spaces = Space* => [[ ignore ]]
NameFirst = Letter | "_" => [[ CHAR: _ ]]
NameRest = NameFirst | Digit
#! allows us to detect newlines when we need to for the semicolon
#! insertion rule, but ignore it in all other places.
EBNF: javascript
-tokenizer = default
-nl = "\r" "\n" | "\n"
+tokenizer = default
+nl = "\r\n" | "\n"
tokenizer = <foreign tokenize-javascript Tok>
End = !(.)
-Space = " " | "\t" | "\n"
+Space = [ \t\n]
Spaces = Space* => [[ ignore ]]
-Name = . ?[ ast-name? ]? => [[ value>> ]]
+Name = . ?[ ast-name? ]? => [[ value>> ]]
Number = . ?[ ast-number? ]?
String = . ?[ ast-string? ]?
-RegExp = . ?[ ast-regexp? ]?
+RegExp = . ?[ ast-regexp? ]?
SpacesNoNl = (!(nl) Space)* => [[ ignore ]]
Expr = OrExpr:e "?" Expr:t ":" Expr:f => [[ e t f ast-cond-expr boa ]]
SwitchBody = Switch1*
Finally = "finally" Block:b => [[ b ]]
| Spaces => [[ "undefined" ast-get boa ]]
-Stmt = Block
+Stmt = Block
| "var" Bindings:bs Sc => [[ bs ast-begin boa ]]
| "if" "(" Expr:c ")" Stmt:t "else" Stmt:f => [[ c t f ast-if boa ]]
| "if" "(" Expr:c ")" Stmt:t => [[ c t "undefined" ast-get boa ast-if boa ]]
SrcElem = "function" Name:n FuncRest:f => [[ n f ast-var boa ]]
| Stmt
SrcElems = SrcElem* => [[ ast-begin boa ]]
-TopLevel = SrcElems Spaces
+TopLevel = SrcElems Spaces
;EBNF
Digits = Digit+
SingleLineComment = "//" (!("\n") .)* "\n" => [[ ignore ]]
MultiLineComment = "/*" (!("*/") .)* "*/" => [[ ignore ]]
-Space = " " | "\t" | "\r" | "\n" | SingleLineComment | MultiLineComment
+Space = [ \t\r\n] | SingleLineComment | MultiLineComment
Spaces = Space* => [[ ignore ]]
NameFirst = Letter | "$" => [[ CHAR: $ ]] | "_" => [[ CHAR: _ ]]
NameRest = NameFirst | Digit
Number = Digits:ws '.' Digits:fs => [[ ws "." fs 3array "" concat-as string>number ast-number boa ]]
| Digits => [[ >string string>number ast-number boa ]]
-EscapeChar = "\\n" => [[ 10 ]]
+EscapeChar = "\\n" => [[ 10 ]]
| "\\r" => [[ 13 ]]
| "\\t" => [[ 9 ]]
StringChars1 = (EscapeChar | !('"""') .)* => [[ >string ]]
| '"' StringChars2:cs '"' => [[ cs ast-string boa ]]
| "'" StringChars3:cs "'" => [[ cs ast-string boa ]]
RegExpFlags = NameRest* => [[ >string ]]
-NonTerminator = !("\n" | "\r") .
+NonTerminator = !([\n\r]) .
BackslashSequence = "\\" NonTerminator => [[ second ]]
-RegExpFirstChar = !("*" | "\\" | "/") NonTerminator
+RegExpFirstChar = !([*\\/]) NonTerminator
| BackslashSequence
-RegExpChar = !("\\" | "/") NonTerminator
+RegExpChar = !([\\/]) NonTerminator
| BackslashSequence
RegExpChars = RegExpChar*
RegExpBody = RegExpFirstChar RegExpChars => [[ first2 swap prefix >string ]]
| "||" | "." | "!" | "&=" | "&" | "|=" | "|" | "^="
| "^"
Tok = Spaces (Name | Keyword | Number | Str | RegExp | Special )
-Toks = Tok* Spaces
+Toks = Tok* Spaces
;EBNF
sign =
"+" => [[ f ]] | "-"
digit-sequence = [0-9]+ => [[ >string ]]
-wsp = (" " | "\t" | "\r" | "\n")
+wsp = [ \t\r\n]
transform-list = wsp* transforms?:t wsp*
=> [[ t [ identity-transform ] unless* ]]
exponent = ( "e" | "E" ) sign? digit-sequence
sign = "+" => [[ drop f ]] | "-"
digit-sequence = [0-9]+ => [[ >string ]]
-wsp = (" " | "\t" | "\r" | "\n")
+wsp = [ \t\r\n]
svg-path = wsp* moveto-drawto-command-groups?:x wsp* => [[ x ]]