LR(1) - 当有 epsilon 产生式时,我如何知道要从节点堆栈弹出多少项?

LR(1) - How do I know how many items to pop of the node stack when there are epsilon productions?

假设我有这个简单的语法(已标记):

1 ||  S' -> A;
2 ||  A -> a B C D z;
3 ||  B -> b E;
4 ||  E -> e | ;
5 ||  C -> c | ;
6 ||  D -> d | ;

我可以构造 LR(1) 解析 table,但我不完全理解如何解析它。你可以看看tablehere。假设输入是:

a b z

如果您查看生产 #2,您将匹配 a,然后在生产 #3 中匹配 b,但是,在生产 #3 的末尾,有一个可为 null 的生产。这同样适用于生产#2 的结尾(z 除外)。在构建节点堆栈时,我必须弹出我正在减少的生产的 rhs 中的符号数量,但是当某些符号可以为 null 时我怎么知道有多少?

一个符号就是一个符号,空的右边是空的。就这么简单。

如果你减少一个空的右边,有零个符号,所以你从堆栈中弹出零个东西。

如果您要减少具有三个符号的右侧,则有三个符号,您需要从堆栈(和关联状态)中弹出三个符号。右侧的每个符号与多少标记相关联是无关紧要的,因为它已减少为一个符号,并且该符号已通过 GOTO 操作推入堆栈。