Javascript 使用PEG.js进行解析计算

Javascript 使用PEG.js进行解析计算,javascript,parsing,Javascript,Parsing,我正在尝试使用peg.js库解析数学表达式。 我输入了以下语法: start = any additive = left:primary "+" right:any { return left + right; } multiplicative = left:primary "*" right:any { return left * right; } any = multiplicative / additive / primary pri

我正在尝试使用peg.js库解析数学表达式。 我输入了以下语法:

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); }
但当我试图计算时:
3*5+1
我得到了
18

我想下面的代码就是你想要的

诀窍是让最弱的运算符(+)有一个引用乘法规则的规则,以便在乘法匹配之前加法不能发生,而在主表达式匹配之前加法也不能发生

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); }

您已经创建了一个正确的关联语法,并且使乘法和加法具有相同的优先级。如何使运算符具有适当的优先级?您需要另一个非终端“层”,以便将乘法解析为比加法操作数更低级别的组。