C语言词法分析器实现:识别关键字、标识符、常量和运算符
#include <stdio.h> #include <string.h>
#define MAXLENGTH 255
// 单词符号的内容 union WORDCONTENT { char T1[MAXLENGTH]; int T2; char T3; };
// 单词符号二元式 typedef struct WORD { int code; union WORDCONTENT value; } WORD;
// 输出单词符号的二元式 void printToken(WORD token) { printf("(%d,", token.code); if (token.code == 1) { printf("%s)", token.value.T1); } else if (token.code == 20 || token.code == 21) { printf("%d)", token.value.T2); } else { printf("%c)", token.value.T3); } }
// 词法分析器 void scaner(char *sourceCode) { int length = strlen(sourceCode); int currentIndex = 0;
while (currentIndex < length) {
char currentChar = sourceCode[currentIndex];
// 判断是否为关键字或标识符
if (isalpha(currentChar)) {
char identifier[MAXLENGTH];
int i = 0;
while (isalnum(currentChar) || currentChar == '_') {
identifier[i++] = currentChar;
currentIndex++;
currentChar = sourceCode[currentIndex];
}
identifier[i] = '\0';
// 判断是否为关键字
if (strcmp(identifier, "main") == 0) {
WORD token;
token.code = 1;
strcpy(token.value.T1, identifier);
printToken(token);
} else if (strcmp(identifier, "int") == 0) {
WORD token;
token.code = 2;
strcpy(token.value.T1, identifier);
printToken(token);
} else if (strcmp(identifier, "while") == 0) {
WORD token;
token.code = 7;
strcpy(token.value.T1, identifier);
printToken(token);
} else {
// 若不是关键字,则为标识符
WORD token;
token.code = 10;
strcpy(token.value.T1, identifier);
printToken(token);
}
}
// 判断是否为整型常数
else if (isdigit(currentChar)) {
int number = 0;
while (isdigit(currentChar)) {
number = number * 10 + (currentChar - '0');
currentIndex++;
currentChar = sourceCode[currentIndex];
}
WORD token;
token.code = 20;
token.value.T2 = number;
printToken(token);
}
// 判断是否为运算符或其他符号
else {
switch (currentChar) {
case '(':
WORD token;
token.code = 26;
token.value.T3 = '(';
printToken(token);
break;
case ')':
token.code = 27;
token.value.T3 = ')';
printToken(token);
break;
case '{':
token.code = 30;
token.value.T3 = '{';
printToken(token);
break;
case '=':
token.code = 21;
token.value.T3 = '=';
printToken(token);
break;
case ';':
token.code = 34;
token.value.T3 = ';';
printToken(token);
break;
case '-':
token.code = 23;
token.value.T3 = '-';
printToken(token);
break;
default:
// 错误处理:输出错误信息、位置,并继续扫描
printf("Error: Invalid character '%c' at position %d\n", currentChar, currentIndex);
currentIndex++;
break;
}
}
currentIndex++;
}
}
int main() { char sourceCode[] = "main()\n" "{\n" "int i = 10;\n" "while(i) i = i - 1;\n" "}"; scaner(sourceCode);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/SfW 著作权归作者所有。请勿转载和采集!