【问题标题】:Shift-Reduce and Reduce-Reduce examples and one solved examples?Shift-Reduce 和 Reduce-Reduce 示例和一个已解决的示例?
【发布时间】:2016-02-19 14:33:24
【问题描述】:

在以下语法的简单优先级解析(分解)中,我们有 shift-reducereduce-reduce 冲突。 X 是开始符号,X'-->$X$ 是添加规则。另外+lower symbol 是终端。

X'-->$X$
X-->Y | X + a
Y-->b | b + Y

问题:我的助教如何解决这个问题并解决shift-reducereduce-reduce 冲突?这个问题的任何步骤?这对我来说太模棱两可了!也许有错误的答案。

【问题讨论】:

  • 你考虑过问你的助教吗?
  • 不,因为这是两年前的@MadPhysicist

标签: parsing compiler-construction programming-languages grammar compiler-optimization


【解决方案1】:

我尝试使用 SLR 算法创建自动机。正如您在下面看到的,状态 1 和前瞻符号 + 存在移位减少冲突。您可以看到状态 1 和 4 的项目集。

在状态 1 中,有 r3: Y -> b . 项,因此正确的操作是使用第三条规则进行减少。

但是,状态 1 也包含该项目

  • r4: Y -> b . + Y,而状态 4 包含该项目
  • r4: Y -> b + . Y,因此另一个正确的操作是切换到状态 4。

这会导致自动机中同一单元格的一次正确移位和一次正确归约动作,从而产生移位归约冲突。

我看不到 reduce-reduce 冲突。

每个规则的所有项目

r0: root -> . X EOF
r0: root -> X . EOF
r0: root -> X EOF .

r1: X -> . Y
r1: X -> Y .

r2: X -> . X + a
r2: X -> X . + a
r2: X -> X + . a
r2: X -> X + a .

r3: Y -> . b
r3: Y -> b .

r4: Y -> . b + Y
r4: Y -> b . + Y
r4: Y -> b + . Y
r4: Y -> b + Y .

自动机

    +   a   b   EOF X   Y
0:          s1      2   3
1:  inv         r3      
2:  s5          acc     
3:  r1          r1      
4:          s1          6
5:      s7              
6:  r4          r4      
7:  r2          r2      

冲突

shift/reduce conflict for state 1 and symbol +: s4 r3
s1
r4: Y -> b . + Y
r3: Y -> b .

s4
r4: Y -> b + . Y
r3: Y -> . b
r4: Y -> . b + Y

【讨论】:

  • 我看到了这个问题和你的回答,有一点对我来说很奇怪,“创建自动机”没有找到其他方法来解决这个没有自动机的例子吗?这让我很惊讶
  • @DaviedZuhraph 如果自动机中的单元格有多个有效操作,则会发现冲突。因此,如果可以在没有任何冲突的情况下构造自动机,那么就没有冲突。请注意,这也取决于算法,例如SLR, LALR, ... 但是,可能还有其他方法可以检查冲突,我目前不知道。
  • +1。 1)我认为你的Automaton中有错字,请检查2)“acc”和“inv”是什么意思
  • 1) 你能给我一个提示吗?类型在哪里? 2) acc 表示接受提供的输入。这是一个有效的程序。 inv 表示无效。该单元格存在冲突。
  • 我不是很专业,我检查了一下,我认为它有一个错字,也许我错了。谢谢我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多