mirror of
https://github.com/ijprest/keyboard-layout-editor
synced 2024-11-11 13:10:29 +00:00
Converted JSONL parser to EBNF form to be more hackable
This commit is contained in:
parent
e11477a517
commit
36b09f8183
5
Makefile
5
Makefile
@ -13,13 +13,10 @@ all: js_files css_files bower_copy
|
||||
.PHONY: js_files css_files bower_copy
|
||||
|
||||
# Rules to minify our .js files
|
||||
js_files: js/jsonl.min.js js/cssparser.js
|
||||
js_files: js/jsonl.min.js js/cssparser.min.js
|
||||
js/%.min.js: js/%.js
|
||||
$(call mkdir,$(dir $@))
|
||||
uglifyjs "$^" > "$@"
|
||||
js/%.js: %.grammar.js
|
||||
$(call mkdir,$(dir $@))
|
||||
node "$^" > "$@"
|
||||
js/%.js: %.y
|
||||
$(call mkdir,$(dir $@))
|
||||
jison "$^" -o "$@"
|
||||
|
@ -1,90 +0,0 @@
|
||||
//
|
||||
// compile with:
|
||||
// node jsonl_grammar.js > js/jsonl.js
|
||||
// uglify js/jsonl.js > js/jsonl.min.js
|
||||
//
|
||||
var Generator = require("jison").Generator;
|
||||
|
||||
exports.grammar = {
|
||||
"comment": "ECMA-262 5th Edition, 15.12.1 The JSON Grammar. Parses JSON strings into objects. This parser supports a 'lenient' version of JSON that doesn't require quotes around identifiers.",
|
||||
"author": "Zach Carter; Ian Prest",
|
||||
|
||||
"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 = eval(yytext); return 'STRING';"],
|
||||
["\\{", "return '{'"],
|
||||
["\\}", "return '}'"],
|
||||
["\\[", "return '['"],
|
||||
["\\]", "return ']'"],
|
||||
[",", "return ','"],
|
||||
[":", "return ':'"],
|
||||
["true\\b", "return 'TRUE'"],
|
||||
["false\\b", "return 'FALSE'"],
|
||||
["null\\b", "return 'NULL'"],
|
||||
["[_a-zA-Z][_a-zA-Z0-9]*", "return 'IDENTIFIER'" ]
|
||||
]
|
||||
},
|
||||
|
||||
"tokens": "STRING NUMBER { } [ ] , : TRUE FALSE NULL IDENTIFIER",
|
||||
"start": "JSONText",
|
||||
|
||||
"bnf": {
|
||||
"JSONString": [[ "STRING", "$$ = yytext;" ]],
|
||||
"JSONIdentifier": [[ "STRING", "$$ = yytext;" ],
|
||||
[ "IDENTIFIER", "$$ = 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": [[ "JSONIdentifier : JSONValue", "$$ = [$1, $3];" ]],
|
||||
|
||||
"JSONMemberList": [[ "JSONMember", "$$ = {}; $$[$1[0]] = $1[1];" ],
|
||||
[ "JSONMemberList , JSONMember", "$$ = $1; $1[$3[0]] = $3[1];" ]],
|
||||
|
||||
"JSONArray": [[ "[ ]", "$$ = [];" ],
|
||||
[ "[ JSONElementList ]", "$$ = $2;" ]],
|
||||
|
||||
"JSONArrayValue": [[ "JSONValue", "$$ = $1;" ],
|
||||
[ "", "$$ = undefined;" ]],
|
||||
|
||||
"JSONElementList": [[ "JSONValue", "$$ = [$1];" ],
|
||||
[ "JSONElementList , JSONArrayValue", "$$ = $1; $1.push($3);" ]]
|
||||
}
|
||||
};
|
||||
|
||||
var options = {type: "slr", moduleType: "commonjs", moduleName: "jsonl"};
|
||||
|
||||
exports.main = function main (args) {
|
||||
var code = new Generator(exports.grammar, options).generate();
|
||||
console.log(code);
|
||||
};
|
||||
|
||||
if (require.main === module)
|
||||
exports.main();
|
||||
|
98
jsonl.y
Normal file
98
jsonl.y
Normal file
@ -0,0 +1,98 @@
|
||||
/* ECMA-262 5th Edition, 15.12.1 The JSON Grammar. */
|
||||
/* Parses JSON strings into objects. */
|
||||
/* This parser supports a 'lenient' version of JSON that doesn't require quotes around identifiers. */
|
||||
/* Author: Zach Carter; Ian Prest (lenient bits) */
|
||||
|
||||
%lex
|
||||
/* Lexer Macros */
|
||||
digit [0-9]
|
||||
int \-?(?:[0-9]|[1-9][0-9]+)
|
||||
exp (?:[eE][-+]?[0-9]+)
|
||||
frac (?:\.[0-9]+)
|
||||
esc \\
|
||||
|
||||
%%
|
||||
/* Lexical Tokens */
|
||||
\s+ /* skip whitespace */
|
||||
{int}{frac}?{exp}?\b return 'NUMBER';
|
||||
'"'(?:{esc}["bfnrt/{esc}]|{esc}u[a-fA-F0-9]{4}|[^"{esc}]|\(|\))*'"' yytext = eval(yytext); return 'STRING';
|
||||
'{' return '{'
|
||||
'}' return '}'
|
||||
'[' return '['
|
||||
']' return ']'
|
||||
',' return ','
|
||||
':' return ':'
|
||||
'true'\b return 'TRUE'
|
||||
'false'\b return 'FALSE'
|
||||
'null'\b return 'NULL'
|
||||
[_a-zA-Z][_a-zA-Z0-9]* return 'IDENTIFIER'
|
||||
|
||||
/lex
|
||||
|
||||
/* language grammar */
|
||||
%start JSONText
|
||||
%%
|
||||
|
||||
JSONString
|
||||
: STRING { $$ = yytext; }
|
||||
;
|
||||
|
||||
JSONIdentifier
|
||||
: STRING { $$ = yytext; }
|
||||
| IDENTIFIER { $$ = 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
|
||||
: JSONIdentifier ':' JSONValue { $$ = [$1, $3]; }
|
||||
;
|
||||
|
||||
JSONMemberList
|
||||
: JSONMember { $$ = {}; $$[$1[0]] = $1[1]; }
|
||||
| JSONMemberList ',' JSONMember { $$ = $1; $1[$3[0]] = $3[1]; }
|
||||
;
|
||||
|
||||
JSONArray
|
||||
: '[' ']' { $$ = []; }
|
||||
| '[' JSONElementList ']' { $$ = $2; }
|
||||
;
|
||||
|
||||
JSONArrayValue
|
||||
: JSONValue { $$ = $1; }
|
||||
| /*empty*/ { $$ = undefined; }
|
||||
;
|
||||
|
||||
JSONElementList
|
||||
: JSONValue { $$ = [$1]; }
|
||||
| JSONElementList ',' JSONArrayValue { $$ = $1; $1.push($3); }
|
||||
;
|
4
kb.html
4
kb.html
@ -29,9 +29,9 @@ All rights reserved.
|
||||
<script type="text/javascript" src="js/bootstrap-colorpicker-module.min.js"></script>
|
||||
<script type="text/javascript" src="js/doT.min.js"></script>
|
||||
<script type="text/javascript" src="js/urlon.js"></script>
|
||||
<script type="text/javascript" src="js/cssparser.js"></script><script type="text/javascript">$cssParser = parser;</script>
|
||||
<script type="text/javascript" src="js/cssparser.min.js"></script><script type="text/javascript">$cssParser = parser;</script>
|
||||
<script type="text/javascript" src="js/color.js"></script>
|
||||
<script type="text/javascript" src="js/jsonl.min.js"></script>
|
||||
<script type="text/javascript" src="js/jsonl.min.js"></script><script type="text/javascript">jsonl = parser;</script>
|
||||
<script type="text/javascript" src="js/html2canvas.min.js"></script>
|
||||
<script type="text/javascript" src="extensions.js"></script>
|
||||
<script type="text/javascript" src="render.js"></script>
|
||||
|
Loading…
Reference in New Issue
Block a user