C++ 词法分析程序实现:识别关键词、运算符、分界符、标识符和无符号整数

本程序使用 C++ 语言实现了一个简单的词法分析器,能够识别关键词、运算符、分界符、标识符和无符号整数。代码清晰易懂,适合初学者学习理解词法分析的基本原理。

程序清单:

  1. 定义关键词、运算符、分界符、标识符、无符号整数的结构体,分别记录数量和字符串数组。
struct {
    int number;
    string str[10];
} keywords = {3, "int", "main", "return"}; //关键词

struct {
    int number;
    string str[5];
} operators = {5, "+", "*", "=", "+", "*="}; //运算符

struct {
    int number;
    string str[6];
} boundaries = {6, "(", ")", "{", "}", ",", ";"}; //分界符

struct {
    int number;
    string str[100];
} identifieres = {0}; //标识符

struct {
    int number;
    string str[100];
} Unsigned_integer = {0}; //无符号整数
  1. 定义词法分析函数,输入为待分析的字符串。
void lexicalAnalysis(string str) {
    // 定义变量
    string temp = "";
    int len = str.length();
    int i = 0;
    // 循环扫描字符串
    while (i < len) {
        // 判断是否为字母
        if (isalpha(str[i])) {
            temp += str[i];
            i++;
            // 判断是否为标识符
            while (isalnum(str[i])) {
                temp += str[i];
                i++;
            }
            bool flag = true;
            // 判断是否为关键词
            for (int j = 0; j < keywords.number; j++) {
                if (temp == keywords.str[j]) {
                    flag = false;
                    cout << "<1," << j << ">" << endl;
                    break;
                }
            }
            // 不是关键词则为标识符
            if (flag) {
                identifieres.str[identifieres.number++] = temp;
                cout << "<2," << identifieres.number - 1 << ">" << endl;
            }
            temp = "";
        }
        // 判断是否为数字
        else if (isdigit(str[i])) {
            temp += str[i];
            i++;
            // 判断是否为无符号整数
            while (isdigit(str[i])) {
                temp += str[i];
                i++;
            }
            Unsigned_integer.str[Unsigned_integer.number++] = temp;
            cout << "<3," << Unsigned_integer.number - 1 << ">" << endl;
            temp = "";
        }
        // 判断是否为运算符或分界符
        else if (str[i] == '+' || str[i] == '*' || str[i] == '=' || str[i] == ';' || str[i] == '(' || str[i] == ')' || str[i] == '{' || str[i] == '}' || str[i] == ',') {
            temp += str[i];
            i++;
            // 判断是否为运算符
            for (int j = 0; j < operators.number; j++) {
                if (temp == operators.str[j]) {
                    cout << "<4," << j << ">" << endl;
                    break;
                }
            }
            // 判断是否为分界符
            for (int j = 0; j < boundaries.number; j++) {
                if (temp == boundaries.str[j]) {
                    cout << "<5," << j << ">" << endl;
                    break;
                }
            }
            temp = "";
        }
        else {
            i++;
        }
    }
}
  1. 主函数调用词法分析函数,读入待分析的字符串。
int main() {
    string str;
    getline(cin, str);
    lexicalAnalysis(str);
    return 0;
}

程序说明:

  • 程序首先定义了五个结构体,分别用来存储关键词、运算符、分界符、标识符和无符号整数的信息。每个结构体包含一个 number 成员变量,用来记录该类型单词的数量,以及一个字符串数组 str,用来存储每个单词。
  • 词法分析函数 lexicalAnalysis 接收一个待分析的字符串作为参数,并逐个字符地扫描字符串。
  • 对于每个字符,程序首先判断其是否为字母。如果是,则将其加入到 temp 字符串中,并继续扫描后续字符,直到遇到非字母或数字的字符。然后,程序判断 temp 是否为关键词,如果是,则输出其类别和序号。否则,程序将其识别为标识符,并将其存储到 identifieres 结构体中。
  • 如果当前字符为数字,则将其加入到 temp 字符串中,并继续扫描后续字符,直到遇到非数字的字符。然后,程序将其识别为无符号整数,并将其存储到 Unsigned_integer 结构体中。
  • 如果当前字符为运算符或分界符,则程序将其识别为相应的类别,并输出其类别和序号。
  • 最后,主函数从控制台读入一个待分析的字符串,并调用词法分析函数进行分析。

程序运行示例:

假设输入字符串为:int main() { return 0; }

则程序输出结果为:

<1,0>
<1,1>
<5,0>
<5,1>
<5,2>
<1,2>
<3,0>
<5,3>
<5,4>

注意:

  • 该词法分析程序只实现了基本的词法分析功能,对于更复杂的语言,可能需要更多的识别规则和处理逻辑。
  • 程序中的代码注释和输出格式可以根据需要进行调整。
  • 程序使用了 iostreamstring 库,需要在编译时包含相应的头文件。

本程序仅供参考,可根据实际需求进行修改和扩展。

C++ 词法分析程序实现:识别关键词、运算符、分界符、标识符和无符号整数

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

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