为什么 LR(1) DFA 没有 Shift/Reduce 冲突?
Why does a LR(1) DFA doesn't have a Shift/Reduce conflict?
鉴于此语法:
对于 LR(0) DFA 我可以清楚地看到为什么这是一个 Shift/Reduce 冲突:
(部分 DFA)
但是我不明白为什么LR(1) DFA解决了这个问题?
(部分 DFA)
对我来说,这仍然是一个移位减少冲突,因为前瞻符号与 B 规则完全相同? LR(1) 解析器应该如何区分它们,而不是 LR(0) 解析器?
因为如果前瞻是a.
,你只能减少B→ε
在LR(0)中你不能考虑前瞻,但在LR(1)中你可以根据下一个输入符号来决定,这里的规则很简单:如果下一个符号是 b,移位,如果是a,做B.
的epsilon缩减
鉴于此语法:
对于 LR(0) DFA 我可以清楚地看到为什么这是一个 Shift/Reduce 冲突:
(部分 DFA)
但是我不明白为什么LR(1) DFA解决了这个问题?
对我来说,这仍然是一个移位减少冲突,因为前瞻符号与 B 规则完全相同? LR(1) 解析器应该如何区分它们,而不是 LR(0) 解析器?
因为如果前瞻是a.
,你只能减少B→ε在LR(0)中你不能考虑前瞻,但在LR(1)中你可以根据下一个输入符号来决定,这里的规则很简单:如果下一个符号是 b,移位,如果是a,做B.
的epsilon缩减