编译 - 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 规则转到#。

我在这里错过了什么?

我在 http://hackingoff.com/compilers/predict-first-follow-set

使用了该工具

您对 G 的 FOLLOW 集合的计算是正确的。

hackingoff 工具有问题。这是一个较短的语法,它表现出相同的错误:

S -> a B C a
B -> b
C -> EPSILON

很明显,aB 的 FOLLOW 集合中,但工具报告该集合为空。