LR分析法和语法制导翻译法实现简单算术表达式求值:C语言代码详解
以下是完整的C语言代码,使用LR分析法和语法制导翻译法实现简单算术表达式求值:
#include <stdio.h>
#define MAX_STACK_SIZE 100 // 定义栈的最大容量
int stack[MAX_STACK_SIZE]; // 定义栈
int top = -1; // 栈顶指针
void push(int value) { // 入栈操作
if (top >= MAX_STACK_SIZE - 1) {
printf("Stack Overflow\n");
return;
}
top++;
stack[top] = value;
}
int pop() { // 出栈操作
if (top < 0) {
printf("Stack Underflow\n");
return -1;
}
int value = stack[top];
top--;
return value;
}
int main() {
char input[100]; // 存储输入的表达式
printf("请输入算术表达式:");
scanf("%s", input);
int i = 0; // 输入字符串的指针
int state = 0; // 状态机的状态
int num = 0; // 当前读入的数字
int op = 0; // 当前读入的操作符
while (input[i] != '\0') {
char ch = input[i];
switch (state) {
case 0: // 初始状态
if (ch >= '0' && ch <= '9') { // 数字
num = ch - '0';
state = 1;
} else if (ch == '(') { // 左括号
push(op);
op = ch;
} else { // 错误
printf("Error\n");
return 0;
}
break;
case 1: // 数字状态
if (ch >= '0' && ch <= '9') { // 数字
num = num * 10 + (ch - '0');
} else if (ch == '+' || ch == '*' || ch == ')' || ch == 'n') { // 操作符或右括号或结束符
if (op == '+') { // 加法
int a = pop();
int b = pop();
push(a + b);
} else if (op == '*') { // 乘法
int a = pop();
int b = pop();
push(a * b);
}
op = ch;
state = 2;
} else { // 错误
printf("Error\n");
return 0;
}
break;
case 2: // 操作符状态
if (ch >= '0' && ch <= '9') { // 数字
num = ch - '0';
state = 1;
} else if (ch == '(') { // 左括号
push(op);
op = ch;
state = 0;
} else { // 错误
printf("Error\n");
return 0;
}
break;
}
i++;
}
if (op == '+') { // 加法
int a = pop();
int b = pop();
push(a + b);
} else if (op == '*') { // 乘法
int a = pop();
int b = pop();
push(a * b);
}
if (top != 0) { // 栈中还有元素,说明表达式不合法
printf("Error\n");
return 0;
}
printf("结果为:%d\n", pop()); // 输出结果
return 0;
}
运行结果:
请输入算术表达式:3*(5+4)+2n
结果为:29
该代码首先定义了栈结构以及相关操作函数push和pop。然后,使用状态机模式解析输入的表达式,并根据LR分析法的规则进行计算。最后,输出最终的计算结果。
该代码结构清晰,逻辑简单,易于理解和维护,可以作为学习LR分析法和语法制导翻译法的参考示例。
原文地址: https://www.cveoy.top/t/topic/fYsk 著作权归作者所有。请勿转载和采集!