语法分析器c语言代码实现
时间: 2023-10-21 12:05:45 浏览: 127
这里给出一个简单的语法分析器的C语言代码实现,可以用来解析一个简单的四则运算表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义token的类型
enum {
TK_NUM = 256, // 数字
TK_EOF, // 文件结束
};
// 定义token的结构体
typedef struct {
int ty; // token的类型
int val; // token的值(对于数字类型的token,这里存储具体的数值)
char* input; // token对应的输入字符串
} Token;
// 存储当前解析到的token
Token tokens[100];
// 解析输入字符串生成token
void tokenize(char* p) {
int i = 0;
while (*p) {
// 跳过空白字符
if (isspace(*p)) {
p++;
continue;
}
// 处理数字类型的token
if (isdigit(*p)) {
tokens[i].ty = TK_NUM;
tokens[i].val = strtol(p, &p, 10);
i++;
continue;
}
// 处理加减乘除等运算符
if (*p == '+' || *p == '-' || *p == '*' || *p == '/') {
tokens[i].ty = *p;
tokens[i].input = p;
i++;
p++;
continue;
}
fprintf(stderr, "无法识别的字符:'%c'\n", *p);
exit(1);
}
tokens[i].ty = TK_EOF;
}
// 递归下降解析器
int expr(int i);
// 处理数字类型的token
int num(int i) {
if (tokens[i].ty != TK_NUM) {
fprintf(stderr, "不是数字类型的token:'%s'\n", tokens[i].input);
exit(1);
}
return tokens[i].val;
}
// 处理加法和减法
int add(int i) {
if (tokens[i].ty == '+') {
return num(i + 1) + add(i + 2);
}
if (tokens[i].ty == '-') {
return num(i + 1) - add(i + 2);
}
return num(i);
}
// 处理乘法和除法
int mul(int i) {
if (tokens[i].ty == '*') {
return add(i + 1) * mul(i + 2);
}
if (tokens[i].ty == '/') {
return add(i + 1) / mul(i + 2);
}
return add(i);
}
// 解析表达式
int expr(int i) {
return mul(i);
}
int main(int argc, char** argv) {
if (argc != 2) {
fprintf(stderr, "用法:./parser <表达式>\n");
return 1;
}
// 解析输入字符串生成token
tokenize(argv[1]);
// 解析表达式
printf("%d\n", expr(0));
return 0;
}
```
这个语法分析器实现了一个递归下降解析器,可以解析一个简单的四则运算表达式。首先,将输入字符串解析成一系列token,然后根据token序列生成语法树,最后计算语法树的值。
这里的语法分析器只支持加、减、乘、除四种运算符和数字类型的token,如果输入字符串中包含无法识别的字符,程序会报错并退出。如果输入的表达式不符合语法规则(例如缺少操作数或操作符),程序可能会产生错误的结果。
阅读全文