Compiler construction 我能在哪里找到好的LR(1)和LALR(1)状态生成示例或阅读材料?

Compiler construction 我能在哪里找到好的LR(1)和LALR(1)状态生成示例或阅读材料?,compiler-construction,compiler-theory,Compiler Construction,Compiler Theory,我使用的是Kenneth Louden的编译器构造书,但它缺少示例,说明如何进行的规则很难遵循。我不知道如何去LR(1)州。此外,不知道如何从LR(1)状态转到LALR(1)状态 例如,这些LR(1)表示: 我理解“S->.XX,$”是如何到达那里的,但请看一看“X->.aX,a/b”。为什么美元不是它的一部分?它不是由一个有$的规则生成的,所以它不是必须有$吗?a/b是如何出现的?根据这本书,如果A->alpha.Bgama,A和B是一个非终端,那么B->.beta,B被添加到每个B->b

我使用的是Kenneth Louden的编译器构造书,但它缺少示例,说明如何进行的规则很难遵循。我不知道如何去LR(1)州。此外,不知道如何从LR(1)状态转到LALR(1)状态

例如,这些LR(1)表示:

我理解“S->.XX,$”是如何到达那里的,但请看一看“X->.aX,a/b”。为什么美元不是它的一部分?它不是由一个有$的规则生成的,所以它不是必须有$吗?a/b是如何出现的?根据这本书,如果A->alpha.Bgama,A和B是一个非终端,那么B->.beta,B被添加到每个B->beta中,其中B位于第一位(gamaalpha)。因此,根据我的理解:

S->.XX$和X->aX和X->b=>X->aX$和X->b,$
X->.aX$和X->b,$=>什么都没有发生
A->.A,$=>什么都没发生

但考虑到上面的例子,这似乎是完全错误的。

我理解“S->.XX,$”是如何到达那里的,但请看一看“X->.aX,a/b”。为什么美元不是它的一部分

您指的是项目集I0中的第2项和第3项吗

$表示输入符号为空字符串。a/b表示输入符号为a/b

您的终端集是{a,b,$},非终端集是{S',S,X}

需要注意的是,LR(n)、SLR、LALR(1)都是自底向上的解析器。它们从终端开始,一直工作到开始符号S。

第一个(X)是{a,b}
,因此,例如在状态I0
S->.XX,$
中,我们将在
X->aX | a
第一个(X)中添加一个先行符号

A→ αBγ,Χ,X
是前瞻 象征


我最近就这个问题写了一篇博文。基本上,它与第一个集合有关,以及点右侧的符号是否可以为空。我试着用尽可能多的非数学术语来表达自己


是的,我意识到终端符号和非终端符号之间的区别。但我想知道a/b是怎么做到的,因为派生规则很模糊,根据我的理解,它们不应该存在
Y = FIRST(γ) if epsilon ∈ FIRST(γ), ή Y = (FIRST(γ)-{epsilon}) ∪ X αν epsilon ∈ FIRST(γ)
B → •β ,Y