android & benitlux: use NitObject in clients
[nit.git] / contrib / nitcc / examples / json.sablecc
index 4ec4c55..0de8914 100644 (file)
@@ -2,15 +2,25 @@ Grammar json;
 
 Lexer
 
-number = int frac? exp;
+number = int frac? exp?;
 int = '-'? d+;
 d = '0'..'9';
 frac = '.' d+;
 exp = e d+;
 e = ('e'|'E') ('+'|'-')?;
 
-string = '"' (ch-'\\'-'"' | '\\'ch)+ '"';
-ch = ' '..'~';
+hexdig = '0'..'9' | 'a'..'z' | 'A'..'Z';
+string = '"' (Any - '\\' - '"' | '\\' (
+               '\\' |
+               '"' |
+               '/' |
+               'b' |
+               'f' |
+               'n' |
+               'r' |
+               't' |
+               'u' hexdig hexdig hexdig hexdig
+       ))* '"';
 
 blank = (' '|'\n'|'\t')+;
 
@@ -20,12 +30,12 @@ Ignored blank;
 value =
        {object:} '{' members? '}' |
        {array:} '[' elements? ']' |
-       number |
-       string |
-       'true' |
-       'false' |
-       'null' ;
+       {number:} number |
+       {string:} string |
+       {true:} 'true' |
+       {false:} 'false' |
+       {null:} 'null' ;
 
-members = members ',' pair | pair ;
+members = {tail:} members ',' pair | {head:} pair ;
 pair = string ':' value ;
-elements = elements ',' value | value ;
+elements = {tail:} elements ',' value | {head:} value ;