为什么LR(1)DFA没有Shift / Reduce冲突?

时间:2016-01-24 18:47:18

标签: compiler-construction dfa lr

鉴于这个语法: enter image description here

对于LR( 0 )DFA,我可以清楚地看到为什么这是Shift / Reduce冲突:

enter image description here

(部分DFA)

但我无法理解为什么LR( 1 )DFA解决了这个问题?

enter image description here (部分DFA)

对我而言,由于前瞻符号与 B 规则完全相同,因此这仍然是一种转移减少冲突? LR(1)解析器应如何区分它们,而不区分LR(0)?

1 个答案:

答案 0 :(得分:1)

因为如果前瞻是 a ,你只能减少 B →ε。

在LR(0)中你不能考虑前瞻,但在LR(1)中你可以根据下一个输入符号来决定,这里规则很简单:如果下一个符号是 b ,移动它,如果它是 a ,那么 B 的epsilon减少。