Compiler construction 一个语法能被LL(1)解析而不能被LR(1)解析吗?

Compiler construction 一个语法能被LL(1)解析而不能被LR(1)解析吗?,compiler-construction,automata,computability,lr1,Compiler Construction,Automata,Computability,Lr1,作为家庭作业,我得到了以下语法: S: D D: AbBb | BaAb A: ε B: ε 我用LL(1)计算得很好。第一组是: S: a, b D: a,b A: ε B: ε S: $ D: $ A: b B: a,b 以下几组是: S: a, b D: a,b A: ε B: ε S: $ D: $ A: b B: a,b 当我创建解析表时,示例字符串“ab”解析得很好。然而,当我试图使用LR(1)解析相同的精确语法时,我遇到了错误 对于项目集0,我得到以下结果:(分隔了

作为家庭作业,我得到了以下语法:

S: D
D: AbBb | BaAb
A: ε 
B: ε
我用LL(1)计算得很好。第一组是:

S: a, b
D: a,b
A: ε 
B: ε
S: $
D: $
A: b
B: a,b
以下几组是:

S: a, b
D: a,b
A: ε 
B: ε
S: $
D: $
A: b
B: a,b
当我创建解析表时,示例字符串“ab”解析得很好。然而,当我试图使用LR(1)解析相同的精确语法时,我遇到了错误

对于项目集0,我得到以下结果:(分隔了前瞻终端)


如果您制作表格,您将清楚地看到项目集0中a和B之间存在减少冲突。如果要求我解析字符串“ab”,解析器将不知道是将my empty减少为A还是将其减少为B。我做错了什么?我总是被告知LR(1)实际上可以解析比LL(1)更多的语法,那么这里的交易是什么呢?如果有人能帮我,我会很感激的,因为我快发疯了。谢谢

他们说您生成的看起来像是从一个
SLR(1)
解析器生成的

如果您使用
LR(1)
甚至
LALR(1)
,您会发现没有冲突。例如,这里是Bison生成的
LALR(1)
机器的状态0:

州0

当然,
LL(1)⊂LR(1)
,在
LL(1)
SLR(1)
LALR(1)
之间没有简单的关系。(我在这里讲的是语法。对于语言集,关系更简单。)你的语法是
LL(1)
语法的一个相当简单的例子,它不是
SLR(1)
;对于
LL(1)
语法的示例,它不是
LALR(1)
,请参见。

我很困惑,您是说A和B的前瞻状态是['A']和['B']?而且,我学到的是,SLR(1)是所有的第一套和第二套语法。而在LR(1)中,只为需要的非端子创建第一组和跟随组。这不是我在第二个例子中所做的吗?@ryan:这些是该状态下的前瞻集,是的。在LR(1)构造中,您不使用为自顶向下解析计算的以下非终结符集。前瞻集来自非终端在该状态下出现的上下文。@ryan:具有完全工作的前瞻计算。@ryan:前瞻集不是“您正在查看的非终端”的第一组。它们是非终端后面右侧部分的第一组(如有必要,可通过项目的前向扩展)。在这种情况下,
A:.%空的
第一个(bBb)
,它显然不包含
a
。这应该很容易理解:缩减的先行设置包含可以跟随缩减的终端,并且很明显,只有在下一个终端是
b
@ryan:老实说,我认为@templatetypedef在我上面链接的答案中解释得更清楚,在这种状态下缩减
a