#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;

}

C语言词法分析器实现:识别关键字、标识符、常量和运算符

原文地址: https://www.cveoy.top/t/topic/SfW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录