【发布时间】:2021-12-19 09:58:35
【问题描述】:
我正在尝试制作一个表达式解析器,虽然它可以工作,但它会按时间顺序而不是按 BIDMAS 进行计算; 1 + 2 * 3 + 4 返回 15 而不是 11。我重写了解析器以使用递归下降解析和我认为可行的正确语法,但它犯了同样的错误。
到目前为止我的语法是:
exp ::= term op exp | term
op ::= "/" | "*" | "+" | "-"
term ::= number | (exp)
它也缺少其他功能,但现在我不确定如何让除法先于乘法等。我应该如何修改我的语法以实现运算符优先级?
【问题讨论】:
-
这 (stackoverflow.com/a/69591031/14298586) 是否回答了您的问题?
-
除法不先于乘法。除法和乘法具有相同的优先级,从左到右分组。它们比加法和减法更强烈地分组,加法和减法也是从左到右分组的。底线是您不能将所有运算符集中到单个
op非终端中。事实上,运算符非终结符通常不是一个好主意,即使您为每个优先级定义了一个这样的非终结符。最好将使用每个不同运算符的产品分开。
标签: parsing grammar context-free-grammar