我将如何在语法中实现运算符优先级?

How would I implement operator-precedence in my grammar?

我正在尝试制作一个表达式解析器,虽然它可以工作,但它是按时间顺序而不是按 BIDMAS 进行计算的; 1 + 2 * 3 + 4 returns 15 而不是 11。我重写了解析器以使用递归下降解析和我认为可行的适当语法,但它犯了同样的错误。

到目前为止我的语法是:

exp     ::= term op exp | term
op      ::= "/" | "*" | "+" | "-"
term    ::= number | (exp)

它也缺少其他功能,但现在我不确定如何使除法先于乘法等。我应该如何修改我的语法以实现运算符优先级?

试试这个:

exp   ::= add
add   ::= mul (("+" | "-") mul)*
mul   ::= term (("*" | "/") term)*
term  ::= number | "(" exp ")"

这里()*表示零次或多次。该文法将产生正确的关联树,并且它是确定性的和明确的。乘法和除法具有相同的优先级。加减法也。