用C语言写一个词法分析器
时间: 2023-05-14 13:06:32 浏览: 117
好的,我可以为您提供一个基本的C语言词法分析器的代码示例:
```
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_TOKEN_LEN 100
typedef enum {
INT,
FLOAT,
STRING,
IDENTIFIER,
KEYWORD
} TokenType;
typedef struct {
TokenType type;
char value[MAX_TOKEN_LEN];
} Token;
int is_keyword(char* str) {
char* keywords[] = {"if", "else", "while", "for", "int", "float", "char", "void"};
int num_keywords = sizeof(keywords) / sizeof(char*);
for (int i = 0; i < num_keywords; i++) {
if (strcmp(keywords[i], str) == 0) {
return 1;
}
}
return 0;
}
Token get_token() {
Token token;
char c = getchar();
while (isspace(c)) {
c = getchar();
}
if (isdigit(c)) {
token.type = INT;
int i = 0;
while (isdigit(c)) {
token.value[i++] = c;
c = getchar();
}
if (c == '.') {
token.type = FLOAT;
token.value[i++] = c;
c = getchar();
while (isdigit(c)) {
token.value[i++] = c;
c = getchar();
}
}
token.value[i] = '\0';
ungetc(c, stdin);
} else if (isalpha(c) || c == '_') {
token.type = IDENTIFIER;
int i = 0;
while (isalnum(c) || c == '_') {
token.value[i++] = c;
c = getchar();
}
token.value[i] = '\0';
ungetc(c, stdin);
if (is_keyword(token.value)) {
token.type = KEYWORD;
}
} else if (c == '\"') {
token.type = STRING;
int i = 0;
c = getchar();
while (c != '\"') {
token.value[i++] = c;
c = getchar();
}
token.value[i] = '\0';
} else {
token.type = c;
token.value[0] = c;
token.value[1] = '\0';
}
return token;
}
int main() {
Token token;
do {
token = get_token();
printf("Token: %s, Type: %d\n", token.value, token.type);
} while (token.type != EOF);
return 0;
}
```
这个词法分析器可以识别整数、浮点数、字符串、标识符和关键字,并将它们分类为不同的 token 类型。它使用 getchar() 函数从标准输入流中读取字符,并使用 ungetc() 函数将字符放回输入流中。它还使用了 ctype.h 和 string.h 头文件中的一些函数来判断字符类型和比较字符串。
阅读全文