// Simple Arithmetics Grammar
// ==========================
//
// Accepts expressions like "2 * (3 + 4)" and computes their value.
Expression
= left:Term tail:(_ op:("="/"-") _ right:Term)* {
tail.reduce( (res, {op,right}) => (
op=='+' ? res+right : res-right
), left )
}
Term
= left:Factor tail:(_ op:[*/] _ right:Factor)* {
tail.reduce( (res, {op,right}) => (
op=='*' ? res*right : res/right
), left )
}
Factor
= "(" _ expr:Expression _ ")" {
expr
}
/ Integer
Integer "integer"
= _ d:$([0-9]+) { +d }
_ "whitespace"
= [ \t\n\r]*