%start JSONText /* ECMA-262 5th Edition, 15.12.1 The JSON Grammar. */ %% JSONString : STRING { // replace escaped characters with actual character $$ = yytext.replace(/\\(\\|")/g, "$"+"1") .replace(/\\n/g,'\n') .replace(/\\r/g,'\r') .replace(/\\t/g,'\t') .replace(/\\v/g,'\v') .replace(/\\f/g,'\f') .replace(/\\b/g,'\b'); } ; JSONNumber : NUMBER {$$ = Number(yytext);} ; JSONNullLiteral : NULL {$$ = null;} ; JSONBooleanLiteral : TRUE {$$ = true;} | FALSE {$$ = false;} ; JSONText : JSONValue EOF {return $$ = $1;} ; JSONValue : JSONNullLiteral | JSONBooleanLiteral | JSONString | JSONNumber | JSONObject | JSONArray ; JSONObject : '{' '}' {{$$ = {};}} | '{' JSONMemberList '}' {$$ = $2;} ; JSONMember : JSONString ':' JSONValue {$$ = [$1, $3];} ; JSONMemberList : JSONMember {{$$ = {}; $$[$1[0]] = $1[1];}} | JSONMemberList ',' JSONMember {$$ = $1; $1[$3[0]] = $3[1];} ; JSONArray : '[' ']' {$$ = [];} | '[' JSONElementList ']' {$$ = $2;} ; JSONElementList : JSONValue {$$ = [$1];} | JSONElementList ',' JSONValue {$$ = $1; $1.push($3);} ;