Reputation: 419
I am trying to use the peg.js library to parse math expressions. I put in online peg.js the following grammar:
start
= any
additive
= left:primary "+" right:any { return left + right; }
multiplicative
= left:primary "*" right:any { return left * right; }
any
= multiplicative
/ additive
/ primary
primary
= float
/ integer
/ "(" any:any ")" { return any; }
/ "" { return 0; }
float "float"
= left:[0-9]+ "." right:[0-9]+ { return parseFloat(left.join("") + "." + right.join("")); }
integer "integer"
= digits:[0-9]+ { return parseInt(digits.join(""), 10); }
But when I try to calculate:
3*5+1
I get 18
Upvotes: 1
Views: 994
Reputation: 2388
I think the code below is what you're after.
The trick is having your weakest operator (+) have a rule which references a multiplication rule so that the addition cannot happen until multiplication has matched, which in turn cannot happen until primary expressions have matched.
start
= any
any
= additive
additive
= left:multiplicative "+" right:additive { return left + right; }
/ multiplicative
multiplicative
= left:primary "*" right:multiplicative { return left * right; }
/ primary
primary
= float
/ integer
/ "(" any:any ")" { return any; }
/ "" { return 0; }
float "float"
= left:[0-9]+ "." right:[0-9]+ { return parseFloat(left.join("") + "." + right.join("")); }
integer "integer"
= digits:[0-9]+ { return parseInt(digits.join(""), 10); }
Upvotes: 4