词法分析器c语言编写
时间: 2023-07-02 15:09:45 浏览: 45
词法分析器主要是将输入的程序代码转换成单词流,单词流中包含了程序中的各种关键字、变量名、符号等信息。下面是一个简单的词法分析器的C语言实现。
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_TOKEN_LEN 100
typedef enum {
IDENTIFIER,
KEYWORD,
NUMBER,
OPERATOR,
DELIMITER,
ERROR
} TokenType;
const char* keywords[] = {"auto", "break", "case", "char", "const", "continue",
"default", "do", "double", "else", "enum", "extern",
"float", "for", "goto", "if", "int", "long", "register",
"return", "short", "signed", "sizeof", "static", "struct",
"switch", "typedef", "union", "unsigned", "void", "volatile",
"while", NULL};
typedef struct {
char lexeme[MAX_TOKEN_LEN];
TokenType type;
} Token;
int isKeyword(char* token) {
int i = 0;
while(keywords[i] != NULL) {
if(strcmp(keywords[i], token) == 0)
return 1;
i++;
}
return 0;
}
TokenType getTokenType(char* token) {
if(isalpha(token[0])) {
if(isKeyword(token))
return KEYWORD;
else
return IDENTIFIER;
}
else if(isdigit(token[0]))
return NUMBER;
else if(token[0] == '+' || token[0] == '-' || token[0] == '*' || token[0] == '/' || token[0] == '=')
return OPERATOR;
else if(token[0] == '(' || token[0] == ')' || token[0] == '{' || token[0] == '}' || token[0] == ';')
return DELIMITER;
else
return ERROR;
}
Token getNextToken(char* program, int* pos) {
Token token;
token.lexeme[0] = '\0';
token.type = ERROR;
while(isspace(program[*pos]))
(*pos)++;
int i = 0;
while(isalnum(program[*pos]) || program[*pos] == '_') {
if(i >= MAX_TOKEN_LEN - 1) {
printf("Error: token too long\n");
return token;
}
token.lexeme[i++] = program[(*pos)++];
}
token.lexeme[i] = '\0';
token.type = getTokenType(token.lexeme);
return token;
}
int main() {
char program[] = "int main() { int x = 5 + 3; printf(\"%d\\n\", x); return 0; }";
int pos = 0;
Token token = getNextToken(program, &pos);
while(token.type != ERROR) {
printf("%s\t%d\n", token.lexeme, token.type);
token = getNextToken(program, &pos);
}
return 0;
}
```
这个词法分析器可以识别C语言中的关键字、标识符、数字、运算符和分隔符,并将它们输出到控制台。当识别到错误的时候,会输出一个错误提示。