编译 - LL1语法
Compilation - LL1 Grammar
我正在研究编译器的魔法,结果我不明白。
这是语法:
S -> A #
A -> B G D E
B -> + | - | EPSILON
C -> c C | EPSILON
G -> c C
D -> . C | EPSILON
E -> e B G | EPSILON
当我尝试查找 "first" 和 "follow" 集时,我得到的结果与使用在线预测器时得到的结果不同。
给出的结果如下:
Non-terminal Symbol / Follow Set
S $
A #
B c
C e, ., #
G ., #
D e, #
E #
为什么不是 G {e, ., #} 的后续集合?
因为我的理解是根据A规则,D跟在G后面,所以我们加上.,但它也可能是EPSILON,所以我们移到E,它可以是e,但它也可能是EPSILON,所以我们根据 S 规则转到#。
我在这里错过了什么?
使用了该工具
您对 G 的 FOLLOW 集合的计算是正确的。
hackingoff 工具有问题。这是一个较短的语法,它表现出相同的错误:
S -> a B C a
B -> b
C -> EPSILON
很明显,a
在 B
的 FOLLOW 集合中,但工具报告该集合为空。
我正在研究编译器的魔法,结果我不明白。
这是语法:
S -> A #
A -> B G D E
B -> + | - | EPSILON
C -> c C | EPSILON
G -> c C
D -> . C | EPSILON
E -> e B G | EPSILON
当我尝试查找 "first" 和 "follow" 集时,我得到的结果与使用在线预测器时得到的结果不同。
给出的结果如下:
Non-terminal Symbol / Follow Set
S $
A #
B c
C e, ., #
G ., #
D e, #
E #
为什么不是 G {e, ., #} 的后续集合? 因为我的理解是根据A规则,D跟在G后面,所以我们加上.,但它也可能是EPSILON,所以我们移到E,它可以是e,但它也可能是EPSILON,所以我们根据 S 规则转到#。
我在这里错过了什么?
使用了该工具您对 G 的 FOLLOW 集合的计算是正确的。
hackingoff 工具有问题。这是一个较短的语法,它表现出相同的错误:
S -> a B C a
B -> b
C -> EPSILON
很明显,a
在 B
的 FOLLOW 集合中,但工具报告该集合为空。