用C语言编写递归下降法分析算术表达式
时间: 2024-05-11 17:18:41 浏览: 107
编译原理_递归下降分析语法分析_C语言版
下面是一个简单的例子,用递归下降法分析算术表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char lookahead; // 当前的查看字符
// 获取下一个字符
void next_token() {
lookahead = getchar();
}
// 匹配一个数字
int match_number() {
int value = 0;
while (isdigit(lookahead)) {
value = 10 * value + lookahead - '0';
next_token();
}
return value;
}
// 匹配一个加号
void match_plus() {
if (lookahead == '+') {
next_token();
} else {
fprintf(stderr, "Syntax error: expected '+'\n");
exit(1);
}
}
// 匹配一个乘号
void match_times() {
if (lookahead == '*') {
next_token();
} else {
fprintf(stderr, "Syntax error: expected '*'\n");
exit(1);
}
}
// 分析一个表达式(递归下降法)
int expr() {
int value = term();
while (lookahead == '+' || lookahead == '-') {
if (lookahead == '+') {
match_plus();
value += term();
} else {
next_token();
value -= term();
}
}
return value;
}
// 分析一个项
int term() {
int value = factor();
while (lookahead == '*' || lookahead == '/') {
if (lookahead == '*') {
match_times();
value *= factor();
} else {
next_token();
value /= factor();
}
}
return value;
}
// 分析一个因子
int factor() {
int value;
if (lookahead == '(') {
next_token();
value = expr();
if (lookahead == ')') {
next_token();
} else {
fprintf(stderr, "Syntax error: expected ')'\n");
exit(1);
}
} else if (isdigit(lookahead)) {
value = match_number();
} else {
fprintf(stderr, "Syntax error: expected number or '('\n");
exit(1);
}
return value;
}
int main() {
printf("Please enter an arithmetic expression: ");
next_token();
int value = expr();
if (lookahead != '\n') {
fprintf(stderr, "Syntax error: unexpected input after expression\n");
exit(1);
}
printf("Result: %d\n", value);
return 0;
}
```
上面的代码实现了一个简单的四则运算表达式的解析器,可以处理加减乘除运算,以及括号的嵌套。用户输入一个表达式后,程序会计算出表达式的值,并输出结果。
阅读全文