[英]How would I implement operator-precedence in my grammar?
我正在尝试制作一个表达式解析器,虽然它可以工作,但它是按时间顺序而不是按 BIDMAS 进行计算的; 1 + 2 * 3 + 4
返回15
而不是11
。 我重写了解析器以使用递归下降解析和我认为可行的正确语法,但它犯了同样的错误。
到目前为止,我的语法是:
exp ::= term op exp | term
op ::= "/" | "*" | "+" | "-"
term ::= number | (exp)
它也缺乏其他功能,但现在我不确定如何使除法先于乘法等。我应该如何修改我的语法以实现运算符优先级?
尝试这个:
exp ::= add
add ::= mul (("+" | "-") mul)*
mul ::= term (("*" | "/") term)*
term ::= number | "(" exp ")"
这里()*
表示零次或多次。 该文法将产生右关联树,并且它是确定性和明确的。 乘法和除法具有相同的优先级。 加减也。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.