产生式为L→En E→E1+T E→T T→T1F T→F F→E F→1 F→2 F→3 F→4 F→5利用LR分析法和语法制导翻译法实现简单算术表达式求值。例如:输入35+4+2n 输出29。生成完整c语言代码编写正确的代码能通过编译器验证结果错误重新生成
以下是完整的C语言代码:
#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
``
原文地址: https://www.cveoy.top/t/topic/g6Xl 著作权归作者所有。请勿转载和采集!