【问题标题】:How would I implement operator-precedence in my grammar?我将如何在我的语法中实现运算符优先级?
【发布时间】: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


【解决方案1】:

试试这个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2011-10-14
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多