用c语言实现一个算符优先分析程序
时间: 2024-02-03 16:13:24 浏览: 108
算符优先分析程序是一种用于语法分析的技术,通常用于编译器的实现。下面是一个使用C语言实现算符优先分析程序的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
#define MAX_INPUT_SIZE 100
typedef enum {
LEFT,
RIGHT
} Assoc;
typedef struct {
char symbol;
int precedence;
Assoc associativity;
} Operator;
Operator operators[] = {
{'+', 2, LEFT},
{'-', 2, LEFT},
{'*', 3, LEFT},
{'/', 3, LEFT},
{'%', 3, LEFT},
{'^', 4, RIGHT},
{'(', 0, LEFT},
{')', 0, LEFT}
};
int operator_count = sizeof(operators) / sizeof(Operator);
int stack[MAX_STACK_SIZE];
int top = -1;
void push(int value) {
if (top >= MAX_STACK_SIZE - 1) {
printf("Stack overflow.\n");
exit(1);
}
stack[++top] = value;
}
int pop() {
if (top < 0) {
printf("Stack underflow.\n");
exit(1);
}
return stack[top--];
}
int peek() {
if (top < 0) {
printf("Stack underflow.\n");
exit(1);
}
return stack[top];
}
Operator *get_operator(char symbol) {
for (int i = 0; i < operator_count; i++) {
if (operators[i].symbol == symbol) {
return &operators[i];
}
}
return NULL;
}
int precedence(char symbol) {
Operator *op = get_operator(symbol);
if (op != NULL) {
return op->precedence;
}
return -1;
}
Assoc associativity(char symbol) {
Operator *op = get_operator(symbol);
if (op != NULL) {
return op->associativity;
}
return LEFT;
}
int main() {
char input[MAX_INPUT_SIZE];
printf("Enter an expression: ");
scanf("%s", input);
int i = 0;
while (input[i] != '\0') {
if (isdigit(input[i])) {
printf("%c ", input[i]);
} else if (input[i] == '(') {
push(input[i]);
} else if (input[i] == ')') {
while (peek() != '(') {
printf("%c ", pop());
}
pop();
} else {
while (top >= 0 && precedence(input[i]) <= precedence(peek())) {
if (precedence(input[i]) == precedence(peek()) &&
associativity(input[i]) == LEFT) {
break;
}
printf("%c ", pop());
}
push(input[i]);
}
i++;
}
while (top >= 0) {
printf("%c ", pop());
}
printf("\n");
return 0;
}
```
该程序使用栈来实现算符优先分析,它的主要思路是遍历输入字符串中的每个字符,并根据其类型进行相应的处理:
- 如果是数字,直接输出;
- 如果是左括号,将其压入栈中;
- 如果是右括号,将栈中的元素出栈,直到遇到左括号为止,然后将左括号出栈;
- 如果是运算符,将其与栈顶元素进行比较。如果栈顶元素的优先级高于等于当前运算符,或者栈顶元素和当前运算符的优先级相等但栈顶元素是左结合的,则将栈顶元素出栈并输出,直到栈为空或者栈顶元素的优先级比当前运算符低或者栈顶元素和当前运算符的优先级相等但栈顶元素是右结合的。然后将当前运算符压入栈中。
最后,将栈中剩余的元素全部出栈并输出。
阅读全文