Number = Digits:ws '.' Digits:fs => [[ ws "." fs 3array "" concat-as string>number ast-number boa ]]
| Digits => [[ >string string>number ast-number boa ]]
-EscapeChar = "\\b" => [[ CHAR: \b ]]
- | "\\f" => [[ CHAR: \f ]]
- | "\\n" => [[ CHAR: \n ]]
- | "\\r" => [[ CHAR: \r ]]
- | "\\t" => [[ CHAR: \t ]]
- | "\\v" => [[ CHAR: \v ]]
- | "\\'" => [[ CHAR: ' ]]
- | "\\\"" => [[ CHAR: " ]]
- | "\\\\" => [[ CHAR: \\ ]]
+SingleEscapeChar = "b" => [[ CHAR: \b ]]
+ | "f" => [[ CHAR: \f ]]
+ | "n" => [[ CHAR: \n ]]
+ | "r" => [[ CHAR: \r ]]
+ | "t" => [[ CHAR: \t ]]
+ | "v" => [[ CHAR: \v ]]
+ | "'" => [[ CHAR: ' ]]
+ | "\"" => [[ CHAR: " ]]
+ | "\\" => [[ CHAR: \\ ]]
+HexDigit = [0-9a-fA-F]
+HexEscapeChar = "x" (HexDigit HexDigit):d => [[ d hex> ]]
+UnicodeEscapeChar = "u" (HexDigit HexDigit HexDigit HexDigit):d => [[ d hex> ]]
+ | "u{" HexDigit+:d "}" => [[ d hex> ]]
+EscapeChar = "\\" (SingleEscapeChar | HexEscapeChar | UnicodeEscapeChar):c => [[ c ]]
StringChars1 = (EscapeChar | !('"""') .)* => [[ >string ]]
StringChars2 = (EscapeChar | !('"') .)* => [[ >string ]]
StringChars3 = (EscapeChar | !("'") .)* => [[ >string ]]