所以我有这个语法(如下),我需要建立一个解析表。我需要让它适合于一个预测分析器。ε
S -> m G | m K p
G -> n G | n
K -> q K r | m n
Now, we have to ask - does this ε production introduce any FIRST Kp
S -> m A
A -> G | K p
G -> n G'
G' -> n G' | emptyString
K -> q K r | m n
G → nH
m
所以我有这个语法(如下),我需要建立一个解析表。我需要让这个表适合于一个预测分析器。我知道第一个想法是让它不含糊,但对我来说它已经......
你所拥有的看起来是正确的! 这里有一个一步一步的方法来看看如何达到这个目的,以及为什么每个转换是必要的。
首先,让我们看看我们的 S 非终端。这个非终结符有两个产品,以
,这意味着我们在这些积之间有一个firstfirst冲突。对积S→mG和S→mKp进行左因子处理,得到
S → mAn
A → Gq
A → Kpm
现在,这样做是否暴露了以前没有的问题?幸运的是,没有。非终端G只能产生以
,而非终端K只能产生以 n
或 n
. 这意味着我们在这里没有引入任何FIRSTFIRST冲突,所以没有必要再去触及任何东西--至少现在还没有。n
接下来,让我们看看G非终端,它有G → nG和G → n两种产物。换句话说,这产生了一个由一个或多个字母副本组成的字符串
. 就像现在写的那样,有一个FIRSTFIRST冲突。我们有很多方法可以重写这个。你提出的方法是把它分成两块--一块是产生一个单一的FIRSTFIRST冲突。
的后续作品,以及产生零份或更多份的。
. 我在这里效仿你的做法,这就引入了一个新的非终结符,我将其称为H,以区别于G。
G → nH
H → nH FOLLOW冲突?要回答这个问题,我们需要确定FOLLOW(H)是什么。我们看到,H只出现在H → nH(这并没有给我们带来任何新的东西)和G → nH这两个产物的最后,这就告诉我们,FOLLOW(G)中的所有东西也会出现在FOLLOW(H)中。而FOLLOW(G)中的内容是什么呢?G出现在A→G的末尾,这就告诉我们FOLLOW(A)中的一切都会在FOLLOW(H)中出现。而A只出现在S→mA中,也就是说FOLLOW(A)中唯一的标记是输入结束的标记$。Phew! 所以FOLLOW(H) = { $ }。这是个好消息,因为这与H → nH的生产并不冲突。
这就留下了K的生产规则,幸运的是,K的生产规则与它们没有任何问题。
把这一切放在一起,我们得到的净转换语法是
S &rarr mA
A → G