bool <- AstRule((((AnyCase("true") !core.identifierNext) / (AnyCase("false") !core.identifierNext)) !identifierNext))
bracket <- AstRule(advanceIf([[]{}()]))
comment <- (fullComment / lineComment)
decimal <- ((plusOrMinus? (integer (fraction? (exponent? advanceIf([%])?)))) !advanceIf((![ \t\n\r\f,'\"``,[]{}():] / core.atDigit)))
decimalFraction <- ((plusOrMinus? (integer? (fraction (exponent? advanceIf([%])?)))) !advanceIf((![ \t\n\r\f,'\"``,[]{}():] / core.atDigit)))
delimiter <- advanceIf([ \t\n\r\f,])+
digit <- advanceIf((core.atDigit / [_]))
digits <- digit+
doubleQuotedString <- AstRule(("\"" ((advanceIf(![\"])* / <predicate>) ("\"" / <predicate>))))
escapedChar <- (advanceIf([\\]) core.advance)
exponent <- (advanceIf([eE]) (plusOrMinus? digits))
fraction <- ("." integer)
fullComment <- ("/*" (advanceIf(!"*/")* "*/"))
i <- AstRule(((AnyCase("i") !core.identifierNext) !identifierNext))
identifier <- (identifierFirst identifierNext*)
identifierFirst <- advanceIf(![ \t\n\r\f,'\"``,[]{}()])
identifierNext <- advanceIf(![ \t\n\r\f,'\"``,[]{}():])
integer <- (core.digit+ digit*)
key <- AstRule((identifier advanceIf([:])))
lineComment <- ("//" untilEol)
literal <- (bool / (null / (nan / i)))
nan <- AstRule(((AnyCase("nan") !core.identifierNext) !identifierNext))
null <- AstRule(((AnyCase("null") !core.identifierNext) !identifierNext))
number <- AstRule((radix / (decimal / (decimalFraction / integer))))
plusOrMinus <- advanceIf([+-])
radix <- ((plusOrMinus? ("0" (advanceIf([oObBxF]) (radixInteger (radixFraction? radixExponent?))))) !advanceIf((![ \t\n\r\f,'\"``,[]{}():] / ([0123456789abcdefABCDEF] / [_]))))
radixDigit <- advanceIf(([0123456789abcdefABCDEF] / [_]))
radixExponent <- (advanceIf([eEpP]) (plusOrMinus? radixDigit+))
radixFraction <- ("." radixInteger)
radixInteger <- (rawRadixDigit+ radixDigit*)
rawRadixDigit <- advanceIf([0123456789abcdefABCDEF])
sequence <- (value (ws value)*)?
singleQuotedString <- AstRule(("'" ((advanceIf(!['])* / <predicate>) ("'" / <predicate>))))
string <- (templateString / (singleQuotedString / doubleQuotedString))
symbol <- AstRule((advanceIf([#]) identifier))
templateString <- AstRule(("`" ((advanceIf(![`])* / <predicate>) ("`" / <predicate>))))
untilEol <- (advanceIf(!core.newLine)* core.newLine?)
value <- (comment / (number / (symbol / (literal / (key / (word / (string / bracket)))))))
word <- AstRule(identifier)
ws <- (delimiter / advanceIf(core.atWs))*
bracket
fflat.bracketidentifierFirst
[ \t\n\r\f,'\"``,[]{}()]identifierNext
[ \t\n\r\f,'\"``,[]{}():]identifier
identifierFirst identifierNextword
fflat.wordkey
fflat.keydigit
core.atDigit [_]digits
digitinteger
atDigit digitfraction
"." integerplusOrMinus
[+-]exponent
[eE] plusOrMinus digitsdecimal
plusOrMinus integer fraction exponent [%] [ \t\n\r\f,'\"``,[]{}():] atDigitdecimalFraction
plusOrMinus integer fraction exponent [%] [ \t\n\r\f,'\"``,[]{}():] atDigitrawRadixDigit
[0123456789abcdefABCDEF]radixDigit
[0123456789abcdefABCDEF] [_]radixInteger
rawRadixDigit radixDigitradixFraction
"." radixIntegerradixExponent
[eEpP] plusOrMinus radixDigitradix
plusOrMinus "0" [oObBxF] radixInteger radixFraction radixExponent [ \t\n\r\f,'\"``,[]{}():] [0123456789abcdefABCDEF] [_]number
fflat.numberuntilEol
core.crlf "\n" [any character] newLinefullComment
"/*" "*/" [any character] "*/"lineComment
"//" untilEolcomment
fullComment lineCommentdelimiter
[ \t\n\r\f,]ws
delimiter core.atWssymbol
fflat.symbolbool
fflat.boolnull
fflat.nullnan
fflat.nani
fflat.iliteral
bool null nan iescapedChar
[\\] [any character]templateString
fflat.templateStringsingleQuotedString
fflat.singleQuotedStringdoubleQuotedString
fflat.doubleQuotedStringstring
templateString singleQuotedString doubleQuotedStringvalue
comment number symbol literal key word string bracketsequence
value ws <style> svg.railroad-diagram { background-color: hsl(30,20%,95%); } svg.railroad-diagram path { stroke-width: 3; stroke: black; fill: none; } svg.railroad-diagram text { font: bold 14px monospace; text-anchor: middle; cursor: pointer; } svg.railroad-diagram text.label { text-anchor: start; } svg.railroad-diagram text.comment { font: italic 12px monospace; } svg.railroad-diagram rect { stroke-width: 3; stroke: black; fill: hsl(120,100%,90%); } </style>