词法分析器c语言编写
时间: 2023-07-03 07:21:36 浏览: 61
词法分析器 c语言编写
5星 · 资源好评率100%
词法分析器是编译器中的一部分,它的主要作用是将源代码转换成标记流(Token Stream),然后将标记流交给语法分析器进行处理。下面是一个简单的词法分析器的C语言实现示例:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_TOKEN_LEN 100
enum token_type {
IDENTIFIER,
NUMBER,
OPERATOR,
DELIMITER,
KEYWORD
};
struct token {
enum token_type type;
char value[MAX_TOKEN_LEN + 1];
};
int is_operator(char c) {
return strchr("+-*/%=", c) != NULL;
}
int is_delimiter(char c) {
return strchr(",;(){}[]", c) != NULL;
}
int is_keyword(char *token) {
char *keywords[] = {"if", "else", "while", "for", "switch", "case", "break", "default", "return"};
int num_keywords = sizeof(keywords) / sizeof(keywords[0]);
for (int i = 0; i < num_keywords; i++) {
if (strcmp(keywords[i], token) == 0) {
return 1;
}
}
return 0;
}
struct token get_next_token(char *expr) {
struct token t = {0};
int i = 0;
while (isspace(expr[i])) {
i++;
}
if (expr[i] == '\0') {
t.type = DELIMITER;
t.value[0] = '\0';
return t;
}
if (isalpha(expr[i])) {
while (isalnum(expr[i])) {
t.value[i] = expr[i];
i++;
}
t.type = is_keyword(t.value) ? KEYWORD : IDENTIFIER;
return t;
}
if (isdigit(expr[i])) {
while (isdigit(expr[i])) {
t.value[i] = expr[i];
i++;
}
t.type = NUMBER;
return t;
}
if (is_operator(expr[i])) {
t.type = OPERATOR;
t.value[0] = expr[i];
t.value[1] = '\0';
return t;
}
if (is_delimiter(expr[i])) {
t.type = DELIMITER;
t.value[0] = expr[i];
t.value[1] = '\0';
return t;
}
t.type = DELIMITER;
t.value[0] = '\0';
return t;
}
int main() {
char expr[] = "x = 10 + y*(2 - 3)";
struct token t;
while ((t = get_next_token(expr)).type != DELIMITER) {
printf("type: %d, value: %s\n", t.type, t.value);
}
return 0;
}
```
在上面的代码中,我们定义了一个`token`结构体类型,用来表示标记的类型和值。我们还定义了一个`enum`类型,用来枚举不同的标记类型。
在`get_next_token`函数中,我们首先跳过所有的空格。然后根据当前字符的类型,读取并返回下一个标记。如果当前字符是字母,则读取整个单词并判断它是否是关键字;如果当前字符是数字,则读取整个数字;如果当前字符是操作符,则读取一个字符;如果当前字符是分隔符,则读取一个字符;否则返回一个空标记。
在`main`函数中,我们调用`get_next_token`函数来逐个读取输入字符串中的所有标记,并打印它们的类型和值。
阅读全文