1 using JsonTokens;
2
3 parser JsonParser
4 {
5 uselexer JsonLexer;
6 main;
7
8 Value : System.Json.JsonValue*
9 ::= STRING{ Token token = lexer.GetToken(pos); return new System.Json.JsonString(System.Json.ParseStringLiteral(token)); }
10 | NUMBER{ Token token = lexer.GetToken(pos); return new System.Json.JsonNumber(System.Json.ParseNumber(token)); }
11 | Object:o{ return o; }
12 | Array:a{ return a; }
13 | TRUE{ return new System.Json.JsonBool(true); }
14 | FALSE{ return new System.Json.JsonBool(false); }
15 | NULL{ return new System.Json.JsonNull(); }
16 ;
17
18 Object(var UniquePtr<System.Json.JsonObject> o) : System.Json.JsonObject*
19 ::= LBRACE{ o.Reset(new System.Json.JsonObject()); } (Field(o.Get()):field % COMMA)? RBRACE{ return o.Release(); }
20 ;
21
22 Field(System.Json.JsonObject* o, var ustring n)
23 ::= STRING{ Token token = lexer.GetToken(pos); n = System.Json.ParseStringLiteral(token); } COLON Value:v{ o->AddField(n, v); }
24 ;
25
26 Array(var UniquePtr<System.Json.JsonArray> a) : System.Json.JsonArray*
27 ::= LBRACKET{ a.Reset(new System.Json.JsonArray()); } (Value:v{ a->AddItem(v); } % COMMA)? RBRACKET{ return a.Release(); }
28 ;
29 }