给定文法G[S]:S→(L)| a 以及 L→L,S | S 1.观察该文法是否有左公共因子和左递归,若有清消除文法中的左公共因子和左递归 2、给出新文法的预测分析表 3、根据新文法的预测分析表判断新文法是否是LL(1)的?
时间: 2023-12-06 16:42:51 浏览: 320
1. 该文法存在左递归,需要进行消除。具体步骤如下:
首先消除L的左递归,得到如下文法:
L → S L'
L' → , S L' | ε
然后消除S的左递归,得到如下文法:
S → a S'
S' → ( L ) S'' | ε
L → S L'
L' → , S L' | ε
再消除左公共因子,得到如下文法:
S → a S'
S' → ( L ) S'' | ε
L → S L'
L' → , S L' | ε
2. 新文法的预测分析表如下:
| | ( | ) | , | a | $ |
|----|----|----|----|----|----|
| S | S→(L) | | | S→aS' | |
| S' | | S'→)S'' | S'→,SL' | S'→ε | S'→ε |
| L | L→S L' | | | L→S L' | |
| L' | | L'→ε | L'→,SL' | L'→ε | L'→ε |
3. 根据新文法的预测分析表可以看出,每个非终结符的预测符号集合都没有交集,因此该文法是LL(1)的。
相关问题
给定文法G:s→Aa | Ab| cA→Ad | Se | f
这是一个上下文无关文法。其中,非终结符号为s和A,终结符号为a、b、c、d、e和f,开始符号为s。
产生式如下:
s → Aa | Ab | c
A → Ad | Se | f
解释:
1. 产生式s → Aa表示在s的推导过程中可以先推导出A,然后跟上一个a。
2. 产生式s → Ab表示在s的推导过程中可以先推导出A,然后跟上一个b。
3. 产生式s → c表示在s的推导过程中可以直接推导出c。
4. 产生式A → Ad表示在A的推导过程中可以先推导出d。
5. 产生式A → Se表示在A的推导过程中可以先推导出S,然后跟上一个e。
6. 产生式A → f表示在A的推导过程中可以直接推导出f。
例如,可以按照以下方式进行推导:
s → Aa → Ada
s → Ab → Sea → f ea
s → c
其中,第一个推导以A为中间符号,先推导出d,然后跟上一个a,得到Ada。第二个推导以A为中间符号,先推导出S,然后跟上一个e,得到Sea,再根据S的产生式推导出f ea。第三个推导直接推导出c。
给定文法G:1. S→(L)|a 2.L→L, S|S 请消除文法G的左递归,并写出递归下降分析的相应递归过程。
消除文法G的左递归:
1. S→aS'
S'→ε|(LS')
2. L→SA
A→,SA|ε
递归下降分析的相应递归过程:
首先,定义一个全局变量pos,表示当前扫描到的字符串位置。
1. 对于S→aS',递归函数为:
void S() {
if (str[pos] == 'a') {
pos++;
Sprime();
}
}
2. 对于S'→ε,递归函数为:
void Sprime() {
// do nothing
}
3. 对于S'→(LS'),递归函数为:
void Sprime() {
if (str[pos] == '(') {
pos++;
L();
if (str[pos] == ')') {
pos++;
Sprime();
}
}
}
4. 对于L→SA,递归函数为:
void L() {
S();
Aprime();
}
5. 对于A→,SA,递归函数为:
void Aprime() {
if (str[pos] == ',') {
pos++;
S();
Aprime();
}
}
6. 对于A→ε,递归函数为:
void Aprime() {
// do nothing
}
阅读全文