【问题标题】:How to solve shift/reduce conflict using operator precedence?如何使用运算符优先级解决移位/减少冲突?
【发布时间】:2020-08-24 01:18:13
【问题描述】:

所以我有这个语法,我正在尝试为它构建一个 LR(1) 表

      E' -> E
      E -> E + E
      E -> E * E
      E -> ( E )
      E -> a

到目前为止,这是我的桌子

我正在尝试解决这里的冲突。我想过将语法更改为后缀而不是中缀,但我不确定是否可以这样做。有什么想法吗?

【问题讨论】:

  • 如果您尝试使用优先级解决冲突,您应该使用优先级解决算法。它在 Dragon Book(参见 Parsing Ambiguous Grammars)、Bison manual 和任意数量的 SO 答案中都有描述,例如 this one。如果在阅读完材料后,您对这个简单的算法有任何具体问题,请随时提出。

标签: parsing context-free-grammar dfa lr


【解决方案1】:

这是你的语法,优先:

E' -> E
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> a

不要忘记额外的E -> TT -> F,因为没有它,语法将毫无用处。

注意:这不适用于 LR(0),因为你会遇到冲突。

【讨论】:

  • 你能解释一下吗?我真的不明白您是如何决定将 E-> E+E 替换为 E->E+T 的?
  • @RubaSbeih -- 它改变了节点的创建方式; a 将是一个叶子,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多