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