capable } escapable = _{ "b" | "f" | "n" | "r" | "t" | "/" | "\\" | ("u" ~ hexchar) } member_name_shorthand = { name_first ~ name_char* } name_first = { ALPHA | "_" | '\u{0080}'..'\u{D7FF}' | '\u{E000}'..'\u{10FFFF}' } name_char = { name_first | DIGIT } not_op = {"!"} curr = _{"@"} ESC = _{ "\\" } unescaped = _{ '\u{0020}'..'\u{0021}' | '\u{0023}'..'\u{0026}' | '\u{0028}'..'\u{005B}' | '\u{005D}'..'\u{D7FF}' | '\u{E000}'..'\u{10FFFF}' } S = _{ WHITESPACE* } hexchar = _{ non_surrogate | (high_surrogate ~ "\\" ~ "u" ~ low_surrogate) } number = { (int | "-0") ~ frac? ~ exp? } frac = { "." ~ DIGIT+ } exp = { ("e" | "E") ~ ("-" | "+")? ~ DIGIT+ } non_surrogate = _{ (DIGIT | "A" | "B" | "C" | "E" | "F") ~ HEXDIG{3} | ("D" ~ ('0'..'7') ~ HEXDIG{2}) } high_surrogate = _{ "D" ~ ("8" | "9" | "A" | "B") ~ HEXDIG{2} } low_surrogate = _{ "D" ~ ("C" | "D" | "E" | "F") ~ HEXDIG{2} } HEXDIG = _{ DIGIT | "A" | "B" | "C" | "D" | "E" | "F" } DIGIT = _{ ASCII_DIGIT } DIGIT1 = _{ ASCII_NONZERO_DIGIT} ALPHA = { ASCII_ALPHA } WHITESPACE = _{ " " | "\t" | "\r\n" | "\n" | "\r"} // Matches any number less than 9007199254740991 early escape for any number <= 999999999999999 safe_int = _{ ( DIGIT1 ~ DIGIT{0,14} ~ !ASCII_DIGIT // 1 to 15 digits (well below the max) | '1'..'8' ~ ASCII_DIGIT{15} | "900" ~ '0'..'6' ~ ASCII_DIGIT{12} | "90070" ~ ASCII_DIGIT{11} | "90071" ~ '0'..'8' ~ ASCII_DIGIT{10} | "900719" ~ '0'..'8' ~ ASCII_DIGIT{9} | "9007199" ~ '0'..'1' ~ ASCII_DIGIT{8} | "90071992" ~ '0'..'4' ~ ASCII_DIGIT{7} | "900719925" ~ '0'..'3' ~ ASCII_DIGIT{6} | "9007199254" ~ '0'..'6' ~ ASCII_DIGIT{5} | "90071992547" ~ '0'..'3' ~ ASCII_DIGIT{4} | "9007199254740" ~ '0'..'8' ~ ASCII_DIGIT{2} | "90071992547409" ~ '0'..'8' ~ ASCII_DIGIT | "900719925474099" ~ '0'..'1' ) ~ !ASCII_DIGIT }