| OLD | NEW |
| (Empty) |
| 1 part of json; | |
| 2 | |
| 3 /** | |
| 4 * JSON grammar. | |
| 5 */ | |
| 6 class JsonGrammar extends GrammarParser { | |
| 7 JsonGrammar() : super(const JsonGrammarDefinition()); | |
| 8 } | |
| 9 | |
| 10 /** | |
| 11 * JSON grammar definition. | |
| 12 */ | |
| 13 class JsonGrammarDefinition extends GrammarDefinition { | |
| 14 const JsonGrammarDefinition(); | |
| 15 | |
| 16 start() => ref(value).end(); | |
| 17 token(p) => p.flatten().trim(); | |
| 18 | |
| 19 array() => ref(token, char('[')) | |
| 20 & ref(elements).optional() | |
| 21 & ref(token, char(']')); | |
| 22 elements() => ref(value).separatedBy(ref(token, char(',')), includeSeparators:
false); | |
| 23 members() => ref(pair).separatedBy(ref(token, char(',')), includeSeparators: f
alse); | |
| 24 object() => ref(token, char('{')) | |
| 25 & ref(members).optional() | |
| 26 & ref(token, char('}')); | |
| 27 pair() => ref(stringToken) | |
| 28 & ref(token, char(':')) | |
| 29 & ref(value); | |
| 30 value() => ref(stringToken) | |
| 31 | ref(numberToken) | |
| 32 | ref(object) | |
| 33 | ref(array) | |
| 34 | ref(trueToken) | |
| 35 | ref(falseToken) | |
| 36 | ref(nullToken); | |
| 37 | |
| 38 trueToken() => ref(token, string('true')); | |
| 39 falseToken() => ref(token, string('false')); | |
| 40 nullToken() => ref(token, string('null')); | |
| 41 stringToken() => ref(token, ref(stringPrimitive)); | |
| 42 numberToken() => ref(token, ref(numberPrimitive)); | |
| 43 | |
| 44 characterPrimitive() => ref(characterNormal) | |
| 45 | ref(characterEscape) | |
| 46 | ref(characterOctal); | |
| 47 characterNormal() => pattern('^"\\'); | |
| 48 characterEscape() => char('\\') | |
| 49 & pattern(new List.from(JSON_ESCAPE_CHARS.keys).join()); | |
| 50 characterOctal() => string('\\u').seq(pattern("0-9A-Fa-f").times(4).flatten())
; | |
| 51 numberPrimitive() => char('-').optional() | |
| 52 & char('0').or(digit().plus()) | |
| 53 & char('.').seq(digit().plus()).optional() | |
| 54 & pattern('eE').seq(pattern('-+').optional()).seq(digit().plus()).optional
(); | |
| 55 stringPrimitive() => char('"') | |
| 56 & ref(characterPrimitive).star() | |
| 57 & char('"'); | |
| 58 | |
| 59 } | |
| 60 | |
| 61 const JSON_ESCAPE_CHARS = const { | |
| 62 '\\': '\\', | |
| 63 '/': '/', | |
| 64 '"': '"', | |
| 65 'b': '\b', | |
| 66 'f': '\f', | |
| 67 'n': '\n', | |
| 68 'r': '\r', | |
| 69 't': '\t' | |
| 70 }; | |
| OLD | NEW |