编译原理词法分析器-扫描器的设计与实现的代码
时间: 2023-10-21 16:07:13 浏览: 54
这是一个简单的词法分析器的示例代码,使用C语言编写:
```c
#include <stdio.h>
#include <ctype.h>
// 定义Token的类型
enum TokenType {
TOK_INT, // 整数
TOK_OP, // 运算符
TOK_EOF, // 文件结束
};
// 定义Token的结构体
struct Token {
enum TokenType type; // Token类型
int value; // Token的值
};
// 词法分析器的函数
struct Token getNextToken(FILE *fp) {
struct Token token = {0};
int c = fgetc(fp);
// 跳过空格和换行
while (isspace(c)) {
c = fgetc(fp);
}
// 判断文件结束
if (c == EOF) {
token.type = TOK_EOF;
return token;
}
// 判断整数
if (isdigit(c)) {
token.type = TOK_INT;
token.value = c - '0';
c = fgetc(fp);
while (isdigit(c)) {
token.value = token.value * 10 + (c - '0');
c = fgetc(fp);
}
ungetc(c, fp); // 将多读的一个字符放回
return token;
}
// 判断运算符
if (c == '+' || c == '-' || c == '*' || c == '/') {
token.type = TOK_OP;
token.value = c;
return token;
}
// 不支持的字符
printf("Unknown character: %c\n", c);
return token;
}
// 测试词法分析器
int main() {
FILE *fp = fopen("input.txt", "r");
if (!fp) {
printf("Failed to open file!\n");
return 1;
}
while (1) {
struct Token token = getNextToken(fp);
if (token.type == TOK_EOF) {
break;
} else if (token.type == TOK_INT) {
printf("Integer: %d\n", token.value);
} else if (token.type == TOK_OP) {
printf("Operator: %c\n", token.value);
}
}
fclose(fp);
return 0;
}
```
该词法分析器可以识别整数和四种基本运算符(加、减、乘、除)。它从文件中读取字符并逐个处理,将字符序列转换为一系列Token。