在 LR(1) 解析中向前看

Look ahead in LR(1) parsing

我在理解如何在 LR(1) 中向前看时遇到一些问题。我已经找到关于同一问题的问题 LR(1) - Items, Look Ahead 但这对我没有帮助。

S'->.S,$
S->.L=R,$
S->.R,$
L->.*R,=/$
L->.id,=/$
R->.L,$

我了解 S' 和 S 产品的前瞻性,但不了解 L 和 R 产品... 你能帮我吗?提前谢谢你。

为了更好地处理 LR/SLR/LALR 解析,我推荐 The Dragon Book

构造 LR(1) 项集在第 4.7.2 节中,过程 CLOSURE

对于您的示例,考虑执行 "expanding"(在 CLOSURE 期间)LR(1) 项 S->.L=R,$:结果是 LR(1) 项

L->.*R,=
L->.id,=

先行是FIRST("=R$")中的每个终结符号,即点前非终结符后面的所有内容,加上先行,新项的先行就是=点.

接下来,考虑 S->.R,$ 的 "expansion"。同样,新项目中的前瞻是 FIRST("$" 中的所有终端符号):R 之后没有任何内容,因此只有前瞻。这会产生项目

R ->.L,$

进一步扩展此项,使用 FIRST("$") 中的所有非终结符作为前瞻给我们

L->.*R,$
L->.id,$

因此,您可以看到原始示例中的 L->.*R,=/$ 只是两个单独项目 L->.*R,=L->.*R,$ 的 shorthand 符号,它们中的每一个沿着单独的 "expansion" 链获得。