词法分析器c语言编写
时间: 2023-07-02 21:11:46 浏览: 66
好的,词法分析器是编译器的重要组成部分之一,它负责将源代码中的字符序列转化为有意义的词素序列。下面是一个简单的词法分析器的C语言实现示例:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_TOKEN_LEN 100
enum TokenType {
KEYWORD, IDENTIFIER, NUMBER, OPERATOR
};
struct Token {
enum TokenType type;
char lexeme[MAX_TOKEN_LEN];
};
int isKeyword(char* token) {
char* keywords[] = {"if", "else", "while", "for", "int", "float", "double", "char", "void"};
int numKeywords = sizeof(keywords) / sizeof(keywords[0]);
for (int i = 0; i < numKeywords; ++i) {
if (strcmp(token, keywords[i]) == 0) {
return 1;
}
}
return 0;
}
int isOperator(char c) {
char* operators[] = {"+", "-", "*", "/", "=", "<", ">", "<=", ">=", "==", "!="};
int numOperators = sizeof(operators) / sizeof(operators[0]);
for (int i = 0; i < numOperators; ++i) {
if (c == operators[i][0]) {
return 1;
}
}
return 0;
}
void getToken(char* input, struct Token* token) {
int i = 0;
while (isspace(input[i])) {
++i;
}
if (isalpha(input[i])) { // identifier or keyword
int j = i;
while (isalnum(input[j])) {
++j;
}
strncpy(token->lexeme, input + i, j - i);
token->lexeme[j - i] = '\0';
if (isKeyword(token->lexeme)) {
token->type = KEYWORD;
} else {
token->type = IDENTIFIER;
}
} else if (isdigit(input[i])) { // number
int j = i;
while (isdigit(input[j])) {
++j;
}
strncpy(token->lexeme, input + i, j - i);
token->lexeme[j - i] = '\0';
token->type = NUMBER;
} else if (isOperator(input[i])) {
token->lexeme[0] = input[i];
token->lexeme[1] = '\0';
token->type = OPERATOR;
} else {
token->lexeme[0] = input[i];
token->lexeme[1] = '\0';
token->type = -1; // error
}
}
int main() {
char input[] = "int main() {\n int a = 1 + 2;\n return a;\n}\n";
struct Token token;
char* p = input;
while (*p) {
getToken(p, &token);
if (token.type == -1) {
printf("Error: invalid token %s\n", token.lexeme);
break;
}
printf("%s ", token.lexeme);
p += strlen(token.lexeme);
}
return 0;
}
```
这个示例实现了一个简单的词法分析器,可以识别关键字、标识符、数字和操作符。在主函数中,我们将一个包含C代码的字符串作为输入,然后逐个获取词素并输出。