Skip to content

Instantly share code, notes, and snippets.

@kinoh
Created October 9, 2016 14:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kinoh/321da3efdc4fc2feefc5b28b3b3cf67c to your computer and use it in GitHub Desktop.
Save kinoh/321da3efdc4fc2feefc5b28b3b3cf67c to your computer and use it in GitHub Desktop.
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