代码实现一个语法分析器
时间: 2024-02-23 07:02:20 浏览: 17
这里给出一个简单的语法分析器的代码实现,用来解析一个简单的表达式语言,包括加法和乘法操作符,以及括号:
```
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义 Token 类型
enum TokenType {
NUMBER,
PLUS,
TIMES,
LPAREN,
RPAREN,
END
};
// 定义 Token 结构体
struct Token {
enum TokenType type;
int value;
};
// 定义全局变量
struct Token current_token;
char *input;
// 函数声明
void error();
void next_token();
int parse_expression();
int parse_term();
int parse_factor();
int eval();
// 错误处理函数
void error() {
fprintf(stderr, "Syntax error.\n");
exit(1);
}
// 获取下一个 Token
void next_token() {
while (isspace(*input)) {
input++;
}
if (*input == '\0') {
current_token.type = END;
return;
}
if (*input == '+') {
current_token.type = PLUS;
input++;
return;
}
if (*input == '*') {
current_token.type = TIMES;
input++;
return;
}
if (*input == '(') {
current_token.type = LPAREN;
input++;
return;
}
if (*input == ')') {
current_token.type = RPAREN;
input++;
return;
}
if (isdigit(*input)) {
current_token.type = NUMBER;
current_token.value = 0;
while (isdigit(*input)) {
current_token.value = current_token.value * 10 + (*input - '0');
input++;
}
return;
}
error();
}
// 解析表达式
int parse_expression() {
int result = parse_term();
while (current_token.type == PLUS) {
next_token();
result += parse_term();
}
return result;
}
// 解析项
int parse_term() {
int result = parse_factor();
while (current_token.type == TIMES) {
next_token();
result *= parse_factor();
}
return result;
}
// 解析因子
int parse_factor() {
if (current_token.type == LPAREN) {
next_token();
int result = parse_expression();
if (current_token.type != RPAREN) {
error();
}
next_token();
return result;
} else if (current_token.type == NUMBER) {
int result = current_token.value;
next_token();
return result;
} else {
error();
}
}
// 计算表达式的值
int eval() {
next_token();
int result = parse_expression();
if (current_token.type != END) {
error();
}
return result;
}
// 主函数
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \"expression\"\n", argv[0]);
return 1;
}
input = argv[1];
printf("%d\n", eval());
return 0;
}
```
这个语法分析器使用一个简单的递归下降算法来解析表达式,它将输入的表达式字符串转换为一个 Token 序列,并使用一个全局变量 `current_token` 来表示当前处理的 Token。在解析过程中,它会根据 Token 的类型来调用不同的解析函数,递归地解析表达式的各个部分,并计算出最终的结果。