用C编写一个自顶向下的语法分析程序 要求对数学表达式输出结果
时间: 2023-08-28 18:03:30 浏览: 206
好的,以下是一个用 C 语言编写的自顶向下的语法分析程序,可以对数学表达式进行解析并计算结果:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义全局变量
char *expression;
int index;
// 定义语法分析函数
double expr();
double term();
double factor();
// 定义错误处理函数
void error(char *msg) {
printf("%s\n", msg);
exit(1);
}
// 定义主函数
int main() {
// 读入表达式
printf("请输入一个数学表达式:");
expression = malloc(1024);
fgets(expression, 1024, stdin);
// 移除换行符
char *ptr = expression;
while (*ptr != '\0') {
if (*ptr == '\n') {
*ptr = '\0';
break;
}
ptr++;
}
// 解析表达式并计算结果
index = 0;
double result = expr();
printf("结果为:%.2f\n", result);
// 释放内存并结束程序
free(expression);
return 0;
}
double expr() {
double result = term();
while (expression[index] == '+' || expression[index] == '-') {
char op = expression[index];
index++;
double term_val = term();
if (op == '+') {
result += term_val;
} else {
result -= term_val;
}
}
return result;
}
double term() {
double result = factor();
while (expression[index] == '*' || expression[index] == '/') {
char op = expression[index];
index++;
double factor_val = factor();
if (op == '*') {
result *= factor_val;
} else {
result /= factor_val;
}
}
return result;
}
double factor() {
double result = 0;
if (isdigit(expression[index])) {
result = expression[index] - '0';
index++;
while (isdigit(expression[index])) {
result = result * 10 + expression[index] - '0';
index++;
}
} else if (expression[index] == '(') {
index++;
result = expr();
if (expression[index] != ')') {
error("未找到匹配的右括号");
}
index++;
} else {
error("无效的表达式");
}
return result;
}
```
这个程序使用了类似 Python 版本的递归下降的方法来实现语法分析,其中`expr()`函数用于解析加法和减法表达式,`term()`函数用于解析乘法和除法表达式,`factor()`函数用于解析数字和括号表达式。在语法分析过程中,我们使用了全局变量`index`来跟踪解析到的位置,以及`expression`来存储要解析的表达式。
程序使用了动态内存分配来存储输入的表达式,需要在程序结束时释放内存。如果解析过程中发现了错误,则会调用`error()`函数输出错误信息并退出程序。
程序的使用方法很简单,只需要输入一个数学表达式,如`2+3*4`,然后程序就会输出计算结果,如`14.00`。
阅读全文