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 }