语法的左因子

问题描述 投票:4回答:1

所以我有这个语法(如下),我需要建立一个解析表。我需要让它适合于一个预测分析器。ε

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
parsing context-free-grammar ll ambiguous-grammar
1个回答
0
投票

m所以我有这个语法(如下),我需要建立一个解析表。我需要让这个表适合于一个预测分析器。我知道第一个想法是让它不含糊,但对我来说它已经......

你所拥有的看起来是正确的! 这里有一个一步一步的方法来看看如何达到这个目的,以及为什么每个转换是必要的。

首先,让我们看看我们的 S 非终端。这个非终结符有两个产品,以

,这意味着我们在这些积之间有一个firstfirst冲突。对积S→mG和S→mKp进行左因子处理,得到

S → mAnA → GqA → Kpm现在,这样做是否暴露了以前没有的问题?幸运的是,没有。非终端G只能产生以

,而非终端K只能产生以 nn. 这意味着我们在这里没有引入任何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

© www.soinside.com 2019 - 2024. All rights reserved.