判断下面哪些文法是LL(1)的,哪些能改写成LL(1)文法,并对每个LL(1)文法设计相应的递归下降识别器。 (2)S→AB A→Ba|ε B→Db|D D→d|ε (1)S→aAaB|bAbB A→A|d b B→b B|a (2)S→i|(E) E→E+S|E-S|S
时间: 2024-01-23 20:02:45 浏览: 148
(2)是LL(1)文法,可以直接设计递归下降识别器。
(1)不是LL(1)文法,可以改写如下:
S→aAaB|bAbB
A→dA'|ε
A'→aA'|ε
B→bB'|aB'
B'→Db'|D
D→d|ε
改写后是LL(1)文法,可以设计相应的递归下降识别器。
对于(2),递归下降识别器如下:
void S() {
if (lookahead == 'i') {
match('i');
} else {
match('(');
E();
match(')');
}
}
void E() {
S();
while (lookahead == '-') {
match('-');
S();
}
}
其中,match(ch)表示匹配字符ch并读入下一个字符,lookahead表示当前读入的字符。
相关问题
判断下面的文法是否为LL(1)文法 1. 0) A-›a N 1) N-›AB e 2) N->€ 3) B-›d N1 4) N1-›b N1 5) N1-›e
### 回答1:
首,LL(1)文法需要满足以下两个条件:
1. 对于任何非终结符 A,如果有两个产生式 A → α | β,则 FIRST(α) ∩ FIRST(β) = ∅。也就是说,A 的两个产生式的 FIRST 集合不能有交集。
2. 对于任何非终结符 A,如果有两个产生式 A → α | β,且 ε∈FIRST(α),则FIRST(β)∩FOLLOW(A)=∅。也就是说,如果 A 的某个产生式的 FIRST 集合包含空串,那么另一个产生式的 FIRST 集合和 A 的 FOLLOW 集合不能有交集。
对于给出的文法:
0) A-›a N
1) N-›AB e
2) N-›€
3) B-›d N1
4) N1-›b N1
5) N1-›e
我们可以先求出每个非终结符的 FIRST 集合和 FOLLOW 集合:
- FIRST(A) = {a}
- FIRST(N) = {a, ε}
- FIRST(B) = {d}
- FIRST(N1) = {b, ε}
- FOLLOW(A) = {$}
- FOLLOW(N) = {b, $}
- FOLLOW(B) = {b, $}
- FOLLOW(N1) = {b, $}
接下来,我们检查每个非终结符的产生式是否满足 LL(1)文法的条件:
- 对于 A,它的两个产生式的 FIRST 集合没有交集,因此满足条件 1。
- 对于 N,它的两个产生式的 FIRST 集合有交集 {ε},但是只有第二个产生式的 FIRST 集合和 N 的 FOLLOW 集合有交集,因此满足条件 2。
- 对于 B,它的唯一产生式没有问题。
- 对于 N1,它的两个产生式的 FIRST 集合有交集 {ε},但是只有第二个产生式的 FIRST 集合和 N1 的 FOLLOW 集合有交集,因此满足条件 2。
因此,我们可以得出结论:这个文法是 LL(1)文法。
### 回答2:
该文法不是LL(1)文法。
为了判断一个文法是否是LL(1)文法,需要满足以下条件:
1. 每个产生式左部只能对应一个预测符号。
2. 对于每个非终结符A的两个产生式A -> α和A -> β,首符集(α)∩首符集(β)为空集。
3. 若存在产生式A -> α,其中ε∈首符集(α),则首符集(α)必须与A的FOLLOW集相交为空集。
观察给出的文法,首先可以看出产生式2)和产生式5)都是ε产生式,由于产生式2)中的N和产生式5)中的N1产生ε的条件不一样,所以这里不满足条件3)。
其次,在产生式3)和产生式4)中,首符集(N)与首符集(N1)有交集{b},因此不满足条件2)。所以该文法不是LL(1)文法。
### 回答3:
给定的文法为:
1) A → aN
2) N → AB
3) N → ε
4) B → dN1
5) N1 → bN1
6) N1 → e
首先,对于LL(1)文法,不能存在两个产生式有相同的左部。根据产生式3和产生式2,我们发现N有两个不同的产生式,因此该文法不是LL(1)文法。
在产生式2和产生式4中,A的直接后继是AB和aN,而根据后继的首符号,我们无法通过选择正确的产生式来确定正确的推导。因此,该文法不能满足LL(1)分析的条件。
综上所述,该文法不是LL(1)文法。
阅读全文