const Expression = rule( [{head: Term}, {tail: star([_, slash("+", "-"), _, Term])}], ({head, tail}) => { return tail.reduce(function(result, element) { if (element[1] === "+") { return result + element[3]; } if (element[1] === "-") { return result - element[3]; } }, head); } ); const Term = rule( [{head: Factor}, {tail: star([_, slash("*", "/"), _, Factor])}], ({head, tail}) => { return tail.reduce(function(result, element) { if (element[1] === "*") { return result * element[3]; } if (element[1] === "/") { return result / element[3]; } }, head); } ); const Factor = slash( rule(["(", _, {expr: Expression}, _, ")"], ({expr}) => expr), Integer ); const Integer = rule([_, /[0-9]+/], () => { return parseInt(text(), 10); }); const _ = /[ \t\n\r]*/;