mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
84 lines
2.8 KiB
JavaScript
84 lines
2.8 KiB
JavaScript
|
var Generator = require("jison").Generator;
|
||
|
var system = require("system");
|
||
|
var fs = require("file");
|
||
|
|
||
|
exports.grammar = {
|
||
|
"comment": "ECMA-262 5th Edition, 15.12.1 The JSON Grammar. Parses JSON strings into objects.",
|
||
|
"author": "Zach Carter",
|
||
|
|
||
|
"lex": {
|
||
|
"macros": {
|
||
|
"digit": "[0-9]",
|
||
|
"esc": "\\\\",
|
||
|
"int": "-?(?:[0-9]|[1-9][0-9]+)",
|
||
|
"exp": "(?:[eE][-+]?[0-9]+)",
|
||
|
"frac": "(?:\\.[0-9]+)"
|
||
|
},
|
||
|
"rules": [
|
||
|
["\\s+", "/* skip whitespace */"],
|
||
|
["{int}{frac}?{exp}?\\b", "return 'NUMBER';"],
|
||
|
["\"(?:{esc}[\"bfnrt/{esc}]|{esc}u[a-fA-F0-9]{4}|[^\"{esc}])*\"", "yytext = yytext.substr(1,yyleng-2); return 'STRING';"],
|
||
|
["\\{", "return '{'"],
|
||
|
["\\}", "return '}'"],
|
||
|
["\\[", "return '['"],
|
||
|
["\\]", "return ']'"],
|
||
|
[",", "return ','"],
|
||
|
[":", "return ':'"],
|
||
|
["true\\b", "return 'TRUE'"],
|
||
|
["false\\b", "return 'FALSE'"],
|
||
|
["null\\b", "return 'NULL'"]
|
||
|
]
|
||
|
},
|
||
|
|
||
|
"tokens": "STRING NUMBER { } [ ] , : TRUE FALSE NULL",
|
||
|
"start": "JSONText",
|
||
|
|
||
|
"bnf": {
|
||
|
"JSONString": [[ "STRING", "$$ = yytext;" ]],
|
||
|
|
||
|
"JSONNumber": [[ "NUMBER", "$$ = Number(yytext);" ]],
|
||
|
|
||
|
"JSONNullLiteral": [[ "NULL", "$$ = null;" ]],
|
||
|
|
||
|
"JSONBooleanLiteral": [[ "TRUE", "$$ = true;" ],
|
||
|
[ "FALSE", "$$ = false;" ]],
|
||
|
|
||
|
|
||
|
"JSONText": [[ "JSONValue", "return $$ = $1;" ]],
|
||
|
|
||
|
"JSONValue": [[ "JSONNullLiteral", "$$ = $1;" ],
|
||
|
[ "JSONBooleanLiteral", "$$ = $1;" ],
|
||
|
[ "JSONString", "$$ = $1;" ],
|
||
|
[ "JSONNumber", "$$ = $1;" ],
|
||
|
[ "JSONObject", "$$ = $1;" ],
|
||
|
[ "JSONArray", "$$ = $1;" ]],
|
||
|
|
||
|
"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);" ]]
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var options = {type: "slr", moduleType: "commonjs", moduleName: "jsonparse"};
|
||
|
|
||
|
exports.main = function main (args) {
|
||
|
var cwd = fs.path(fs.cwd()),
|
||
|
code = new Generator(exports.grammar, options).generate(),
|
||
|
stream = cwd.join(options.moduleName+".js").open("w");
|
||
|
stream.print(code).close();
|
||
|
};
|
||
|
|
||
|
if (require.main === module)
|
||
|
exports.main(system.args);
|
||
|
|