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