/* * Simple Arithmetics Grammar * ========================== * * Accepts expressions like "2 * (3 + 4)" and computes their value. */ { function combine(first, rest, combiners) { var result = first, i; for (i = 0; i < rest.length; i++) { result = combiners[rest[i][1]](result, rest[i][3]); } return result; } } Expression = first:Term rest:(_ ("+" / "-") _ Term)* { return combine(first, rest, { "+": function(left, right) { return left + right; }, "-": function(left, right) { return left - right; } }); } Term = first:Factor rest:(_ ("*" / "/") _ Factor)* { return combine(first, rest, { "*": function(left, right) { return left * right; }, "/": function(left, right) { return left / right; } }); } Factor = "(" _ expr:Expression _ ")" { return expr; } / Integer Integer "integer" = [0-9]+ { return parseInt(text(), 10); } _ "whitespace" = [ \t\n\r]*