S→Ab A→a|B|e B→b|e为什么是LL(1)的
时间: 2024-01-05 18:56:55 浏览: 99
这是一个文法,假设终结符号集为{a,b},非终结符号集为{S,A,B},开始符号为S。要证明这个文法是LL(1)的,需要满足以下条件:
1. 对于任何的非终结符号A,对于任何的终结符号a,都有最多一个产生式以a开头。这个文法满足这个条件。
2. 对于任何的非终结符号A,如果有两个产生式A→α1和A→α2,那么FIRST(α1)和FIRST(α2)不相交。这个文法也满足这个条件。
3. 对于任何的非终结符号A,如果有一个产生式A→α,其中α可以推出ε(空串),那么对于任何的终结符号a∈FOLLOW(A),都有A→ε是一个产生式。这个文法也满足这个条件。
因此,这个文法是LL(1)的。
相关问题
下面文法中哪个是LL(1)的,说明理由。 (1) S→Abc A→a|e B→ble (2)S→Ab A→a|B|e B→b|e
第二个文法是LL(1)的,因为它满足LL(1)文法的三个条件:
1. 没有左递归:该文法中没有左递归。
2. 没有公共左缀:该文法中没有公共左缀。
3. 可以用一个表来处理所有的FIRST集和FOLLOW集,并且没有冲突:对于该文法,可以构造出FIRST和FOLLOW集合,并且它们不会产生冲突,因此可以用一个表来处理它们。
判断下面哪些文法是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
(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表示当前读入的字符。
阅读全文