Created
October 9, 2016 14:33
-
-
Save kinoh/321da3efdc4fc2feefc5b28b3b3cf67c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var grammar = ` | |
Expression | |
= Scalar | |
/ GeneralVectorExpr | |
GeneralVectorExpr | |
= head: GeneralVector tail: (_ ("+" / "-") _ GeneralVector) * { | |
return head; | |
} | |
GeneralVector | |
= BracketedList | |
/ "(" _ list: ScalarList _ ")" { return list; } | |
BracketedList | |
= "[" _ list: ScalarList _ "]" { return list; } | |
/ "[" head:BracketedList tail:(_ "," _ x:BracketedList)* "]" | |
{ | |
var result =[head]; | |
for (var i = 0; i < tail.length; i++) { | |
if (tail[i][3].length != head, length) { | |
throw "jaggy matrix"; | |
} | |
result[1 +i]= tail[i][3]; | |
} | |
return result; | |
} | |
ScalarList | |
= head: Scalar tail: (_ "," _ Scalar) * { | |
var result =[head]; | |
for (var i = 0; i < tail.length; i++) { | |
result[1 +i]= tail[i][3]; | |
} | |
return result; | |
} | |
Scalar | |
= head: Term tail: (_ ("+" / "-") _ Term) * { | |
var result = head; | |
for (var i = 0; i < tail.length; i++) { | |
if (tail[i][1]=== "+") { result += tail[i][3]; } | |
if (tail[i][1]=== "-") { result -= tail[i][3]; } | |
} | |
return result; | |
} | |
Term | |
= head: Factor tail: (_ ("*" / "/") _ Factor) * { | |
var result = head; | |
for (var i = 0; i < tail.length; i++) { | |
if (tail[i][1]=== "*") { result *= tail[i][3]; } | |
if (tail[i][1]=== "/") { result /= tail[i][3]; } | |
} | |
return result; | |
} | |
Factor | |
= "(" _ expr: Scalar _ ")" { return expr; } | |
/ Integer | |
Integer "integer" | |
=[0-9]+{ return parseInt(text(), 10); } | |
_ "whitespace" | |
=[ \\t\\n\\r]* | |
`; | |
var parser = peg.generate(grammar); | |
function stringify(value) | |
{ | |
if (Array.isArray(value)) | |
{ | |
return value.toSource(); | |
} | |
return value.toString(); | |
} | |
var testcase = { | |
"1": 1, | |
"1 + 2": 3, | |
"1 + 2 * 3": 7, | |
"(1 + 2) * 3": 9, | |
"(1, 2, 3)": [1, 2, 3], | |
"[1, 2, 3]": [1, 2, 3], | |
"[[1, 2], [3, 4]]": [[1, 2], [3, 4]], | |
"2 * [1, 2]": [2, 4], | |
}; | |
$(function () | |
{ | |
for (key in testcase) | |
{ | |
var result; | |
try { | |
result = stringify(parser.parse(key)); | |
} catch(e) { | |
result = "!!! " + e + " !!!"; | |
} | |
var expected = stringify(testcase[key]); | |
var row = $("<div>").addClass("row"); | |
row.append($("<div>").addClass("cell").text(key)); | |
row.append($("<div>").addClass("cell").addClass(result == expected ? "test_ok" : "test_fail").text(result)); | |
row.append($("<div>").addClass("cell").text(expected)); | |
$("#area").append(row); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment