我将如何在语法中实现运算符优先级?
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 ")"
这里()*
表示零次或多次。该文法将产生正确的关联树,并且它是确定性的和明确的。乘法和除法具有相同的优先级。加减法也。
我正在尝试制作一个表达式解析器,虽然它可以工作,但它是按时间顺序而不是按 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 ")"
这里()*
表示零次或多次。该文法将产生正确的关联树,并且它是确定性的和明确的。乘法和除法具有相同的优先级。加减法也。