编译原理c语言程序:一个简单的词法分析器。写出代码
时间: 2024-12-18 16:26:22 浏览: 41
词法分析器是编译过程的第一步,它将源代码分解成一系列的"令牌",如关键字、标识符、常量、运算符等。这里是一个非常基础的C语言词法分析器的简单实现,使用的是字符数组和循环:
```c
#include <stdio.h>
#include <ctype.h>
// 定义枚举类型的词法类别
typedef enum {
TOKEN_EOF = -1,
TOKEN_IDENTIFIER, // 标识符
TOKEN_NUMBER, // 数字
TOKEN_PLUS, // 加号
TOKEN_MINUS, // 减号
// ... 可以添加更多关键词和运算符
} TokenType;
// 词法单元结构体
typedef struct {
TokenType type;
char value[256];
} Lexeme;
// 读取并解析下一个词法单元
Lexeme lexeme_tokenize(const char *input) {
Lexeme token;
int i = 0;
while (input[i] != '\0') {
if (isalnum(input[i])) { // 字母或数字
token.type = TOKEN_IDENTIFIER;
token.value[i] = input[i]; // 保存字符
++i;
} else if (isdigit(input[i])) { // 整数
token.type = TOKEN_NUMBER;
token.value[i] = input[i];
while (isdigit(input[i + 1])) {
++i; // 继续读直到遇到非数字字符
}
} else if (input[i] == '+') { // 运算符
token.type = TOKEN_PLUS;
token.value[i] = input[i];
++i;
} else if (input[i] == '-') { // 运算符
token.type = TOKEN_MINUS;
token.value[i] = input[i];
++i;
} else { // 非法字符或结束标志
token.type = TOKEN_EOF;
break;
}
// 将字符串结尾的'\0'替换为空格,便于处理后续的词法单元
token.value[i] = ' ';
}
token.value[i] = '\0'; // 结束字符串
return token;
}
int main() {
const char *input = "int a = 10 + 20;"; // 示例输入
Lexeme token = lexeme_tokenize(input);
switch (token.type) {
case TOKEN_IDENTIFIER:
printf("Identifier: %s\n", token.value);
break;
case TOKEN_NUMBER:
printf("Number: %s\n", token.value);
break;
// ... 处理其他词法类别
default:
printf("Unknown token: %s\n", token.value);
}
return 0;
}
```
这只是一个基本的示例,实际词法分析器可能会更复杂,包括处理注释、特殊字符、空格等因素,并且通常会配合状态机来识别更复杂的模式。
阅读全文