用C语言写一个简单的词法分析程序
时间: 2024-10-09 10:09:59 浏览: 33
在C语言中编写一个简单的词法分析程序通常涉及以下几个步骤,我们这里以处理基本的算术表达式为例:
```c
#include <stdio.h>
#include <ctype.h>
// 定义一些基础的令牌类型
typedef enum {
TOKEN_EOF, // 结束符
TOKEN_NUMBER, // 数字
TOKEN_PLUS, // 加号
TOKEN_MINUS, // 减号
TOKEN_MUL, // 乘号
TOKEN_DIV, // 除号
} TokenType;
struct Token {
TokenType type;
union {
int number;
char op; // 运算符
};
};
// 读取并解析输入流
Token read_token(char *input) {
while (isspace(*input)) input++; // 跳过空格
if (isdigit(*input)) { // 检测数字
int num = 0;
while (isdigit(*input)) {
num = num * 10 + (*input - '0');
input++;
}
return (Token){TOKEN_NUMBER, .number = num};
} else if (*input == '+' || *input == '-') { // 检测加减号
input++;
return (Token){*input == '+' ? TOKEN_PLUS : TOKEN_MINUS, .op = *input};
} else if (*input == '*' || *input == '/') { // 检测乘除号
input++;
return (Token){*input == '*' ? TOKEN_MUL : TOKEN_DIV, .op = *input};
}
return (Token){TOKEN_EOF, .op = '\0'};
}
int main() {
char input[] = "5+3*2";
Token token;
while ((token = read_token(input)) != (Token){TOKEN_EOF}) {
switch (token.type) {
case TOKEN_NUMBER:
printf("Number: %d\n", token.number);
break;
case TOKEN_PLUS:
case TOKEN_MINUS:
case TOKEN_MUL:
case TOKEN_DIV:
printf("Operator: %c\n", token.op);
break;
}
}
return 0;
}
```
这个程序首先定义了几个基本的令牌类型,然后创建了一个`Token`结构体来存储它们。接着,`read_token`函数会逐个字符遍历输入字符串,识别数字、运算符,并返回对应的令牌。主函数`main`中测试了一些算术表达式的例子。
阅读全文