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



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

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( 解析表, 但我不完全了解如何解析它。你可以看看这里的表格。假设输入为:

a b z

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

符号是符号,右侧为空。就这么简单。

如果您正在减少一个空的右侧,则符号为零,因此您可以从堆栈中弹出零内容。

如果要减少具有三个符号的右侧,则有三个符号,并且需要从堆栈(以及关联的状态(中弹出三个符号。右侧的每个符号与多少令牌相关联无关紧要,因为它已减少为一个符号,并且该符号被 GOTO 操作推送到堆栈上。

最新更新