/
try.js
84 lines (68 loc) · 2.24 KB
/
try.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(function ($) {
var parser,
parser2;
//IE, mainly
if(typeof console === 'undefined'){
console = {};
console.log = function (str) {$("#out").text(uneval(str))};
}
// noop
print = function (){}
var printOut = function (str) { $("#out").text(str); };
$(document).ready(function () {
$("#process_btn").click(processGrammar);
$("#parse_btn").click(runParser);
$("#examples").change(function(ev) {
var file = this.options[this.selectedIndex].value;
$(document.body).addClass("loading");
$.get("/jison/examples/"+file, function (data) {
$("#grammar").val(data);
$(document.body).removeClass("loading");
});
});
});
function processGrammar () {
var type = "lalr";
var grammar = $("#grammar").val();
try {
var cfg = JSON.parse(grammar);
} catch(e) {
try {
var cfg = bnf.parse(grammar);
} catch (e) {
$("#gen_out").text("Oops. Make sure your grammar is in the correct format.\n"+e).addClass('bad');
return;
}
}
Jison.print = function () {};
parser = Jison.Generator(cfg, {type: type});
$("#out").removeClass("good").removeClass("bad").html('');
$("#gen_out").removeClass("good").removeClass("bad");
if (!parser.conflicts) {
$("#gen_out").text('Generated successfully!').addClass('good');
} else {
$("#gen_out").text('Conflicts encountered:\n').addClass('bad');
}
$("#download_btn").click(function () {
window.location.href = "data:application/javascript;charset=utf-8;base64,"+Base64.encode(parser.generate());
}).removeAttr('disabled');
parser.resolutions.forEach(function (res) {
var r = res[2];
if (!r.bydefault) return;
$("#gen_out").append(r.msg+"\n"+"("+r.s+", "+r.r+") -> "+r.action);
});
parser2 = parser.createParser();
}
function runParser () {
if (!parser) processGrammar();
printOut("Parsing...");
var source = $("#source").val();
try {
$("#out").removeClass("bad").addClass('good');
printOut(JSON.stringify(parser2.parse(source)));
} catch(e) {
$("#out").removeClass("good").addClass('bad');
printOut(e.message || e);
}
}
})(jQuery);