E→T|E+T|E-T T→F|T*F|T/F F→i|(E) 2、消去上面文法的左递归 3. 按消去左递归的文法,使用C语言,写出对应的递归下降语法分析器。
时间: 2023-09-22 15:08:31 浏览: 104
2. 消去左递归后的文法:
```
E → TE'
E' → +TE' | -TE' | ε
T → FT'
T' → *FT' | /FT' | ε
F → i | (E)
```
3. 对应的递归下降语法分析器的C语言代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char lookahead;
void error() {
printf("Error\n");
exit(1);
}
void match(char t) {
if (lookahead == t) {
lookahead = getchar();
} else {
error();
}
}
void E();
void E_prime();
void T();
void T_prime();
void F();
void E() {
T();
E_prime();
}
void E_prime() {
if (lookahead == '+') {
match('+');
T();
E_prime();
} else if (lookahead == '-') {
match('-');
T();
E_prime();
}
}
void T() {
F();
T_prime();
}
void T_prime() {
if (lookahead == '*') {
match('*');
F();
T_prime();
} else if (lookahead == '/') {
match('/');
F();
T_prime();
}
}
void F() {
if (isdigit(lookahead)) {
match(lookahead);
} else if (lookahead == '(') {
match('(');
E();
match(')');
} else {
error();
}
}
int main() {
lookahead = getchar();
E();
if (lookahead == '\n') {
printf("Success\n");
} else {
error();
}
return 0;
}
```
这个分析器的实现使用了递归下降的方法来对输入的字符串进行语法分析。其中,`match()` 函数用于判断当前的字符是否符合预期,如果不符合预期,则调用 `error()` 函数输出错误信息。`E()`、`E_prime()`、`T()`、`T_prime()`、`F()` 函数分别对应文法中的非终结符,用于递归地进行语法分析。`main()` 函数则是分析器的入口,它首先读入第一个字符,然后调用 `E()` 函数开始分析。如果分析成功,则输出 `Success`,否则输出 `Error`。
阅读全文