Joe
Joe

Reputation: 419

parsing calculation with PEG.js

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

Answers (1)

dan
dan

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

Related Questions