假设我有这个简单的语法(标记(:
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 操作推送到堆栈上。