用c语言根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
时间: 2024-02-12 19:05:40 浏览: 78
下面以一个简单的文法为例,编写递归下降分析程序。
文法如下:
```
E -> T E'
E' -> + T E' | ε
T -> F T'
T' -> * F T' | ε
F -> ( E ) | id
```
其中,`E`、`E'`、`T`、`T'`、`F` 是非终结符,`+`、`*`、`(`、`)`、`id` 是终结符。
下面是相应的程序:
```c
#include <stdio.h>
#include <string.h>
// 定义终结符和非终结符的枚举值
enum {
TERMINAL_PLUS,
TERMINAL_STAR,
TERMINAL_LEFT_PAREN,
TERMINAL_RIGHT_PAREN,
TERMINAL_ID,
NONTERMINAL_E,
NONTERMINAL_E_PRIME,
NONTERMINAL_T,
NONTERMINAL_T_PRIME,
NONTERMINAL_F
};
// 定义输入符号串和指向符号的指针
char input_str[100];
int ptr = 0;
// 读取下一个符号
int next_symbol() {
if (ptr >= strlen(input_str)) {
return -1;
}
switch (input_str[ptr++]) {
case '+':
return TERMINAL_PLUS;
case '*':
return TERMINAL_STAR;
case '(':
return TERMINAL_LEFT_PAREN;
case ')':
return TERMINAL_RIGHT_PAREN;
default:
return TERMINAL_ID;
}
}
// 报错函数
void error() {
printf("Syntax error!\n");
exit(1);
}
// 实现 E -> T E' 的产生式
void E() {
T();
E_PRIME();
}
// 实现 E' -> + T E' | ε 的产生式
void E_PRIME() {
int symbol = next_symbol();
if (symbol == TERMINAL_PLUS) {
T();
E_PRIME();
} else {
ptr--;
}
}
// 实现 T -> F T' 的产生式
void T() {
F();
T_PRIME();
}
// 实现 T' -> * F T' | ε 的产生式
void T_PRIME() {
int symbol = next_symbol();
if (symbol == TERMINAL_STAR) {
F();
T_PRIME();
} else {
ptr--;
}
}
// 实现 F -> ( E ) | id 的产生式
void F() {
int symbol = next_symbol();
if (symbol == TERMINAL_LEFT_PAREN) {
E();
if (next_symbol() != TERMINAL_RIGHT_PAREN) {
error();
}
} else if (symbol == TERMINAL_ID) {
// do nothing
} else {
error();
}
}
int main() {
printf("请输入要分析的符号串:");
scanf("%s", input_str);
E();
if (next_symbol() != -1) {
error();
} else {
printf("Syntax analysis successful!\n");
}
return 0;
}
```
在上述程序中,我们首先定义了终结符和非终结符的枚举值。`next_symbol()` 函数用来读取下一个符号,并将指针向后移动一位。在各个产生式函数中,我们按照文法的定义对相应的产生式进行实现。在 `main()` 函数中,我们读取输入符号串,并进行语法分析。如果分析成功,则输出相应的提示信息;否则,报错并退出程序。
阅读全文