Compiler construction 如何解析给定的LALR(1)语法

Compiler construction 如何解析给定的LALR(1)语法,compiler-construction,automata,lalr,lr1,Compiler Construction,Automata,Lalr,Lr1,使用LALR方法解析以下语法时遇到问题 s -> y y -> dX | ydX X -> e | Zd z -> F | epsilon 一开始我还可以,这里是项目状态0:(将前瞻状态分开) 现在这很好,但当你们移动到d终端的状态1时,我会感到困惑。我的书的状态2如下: y -> d.X, $d X -> .e, $d X -> .Zd, $d Z -> .f, d Z -> ., d 在X非终端中,前瞻终端“d”来自何处?我原以为d.

使用LALR方法解析以下语法时遇到问题

s -> y
y -> dX | ydX
X -> e | Zd
z -> F | epsilon
一开始我还可以,这里是项目状态0:(将前瞻状态分开)

现在这很好,但当你们移动到d终端的状态1时,我会感到困惑。我的书的状态2如下:

y -> d.X, $d
X -> .e, $d
X -> .Zd, $d
Z -> .f, d
Z -> ., d

在X非终端中,前瞻终端“d”来自何处?我原以为d.X来自.dX,它有前置终端“$”和“$d”。但在执行E-closure时,前置终端不应该是“$”的$d中的第一个吗?为什么是“$”或“d”"? 我认为它可能来自另一个州,因为这是LALR,但我最终合并州1的州在前瞻中也没有d。有人能给我解释一下为什么在这个状态的前面有一个“d”和“$”配对吗?谢谢

S$->Y$->dX$在d之后的这个派生序列中,X后面的是{$}

S$->Y$->ydX$->dXdX$在这个推导中,在第一个d之后的X是{d}


在覆盖输入'd'中的第一个符号后,两个派生序列都处于相同的状态。

我仍然感到困惑。当我通过语法时,X后面的是{d},但是我一直被教导,当做E-闭包时,你取非终结符后面的第一个字符串。为什么在这种情况下不起作用呢?有两种情况:情况1:A->aBβ我们将取第一个(β),但如果第一个(β)包含null或A->aB,则应考虑A后面的任何内容。
$d
这里不是两个符号的前瞻;这是集合
{$,d}
的简写<集合的code>FIRST由集合元素的
FIRST
中的所有符号组成,因此
FIRST({$,d})
正是
{$,d}
y -> d.X, $d
X -> .e, $d
X -> .Zd, $d
Z -> .f, d
Z -> ., d