C++ 词法分析程序实现:识别关键词、运算符、分界符、标识符和无符号整数
C++ 词法分析程序实现:识别关键词、运算符、分界符、标识符和无符号整数
本程序使用 C++ 语言实现了一个简单的词法分析器,能够识别关键词、运算符、分界符、标识符和无符号整数。代码清晰易懂,适合初学者学习理解词法分析的基本原理。
程序清单:
- 定义关键词、运算符、分界符、标识符、无符号整数的结构体,分别记录数量和字符串数组。
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}; //无符号整数
- 定义词法分析函数,输入为待分析的字符串。
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++;
}
}
}
- 主函数调用词法分析函数,读入待分析的字符串。
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>
注意:
- 该词法分析程序只实现了基本的词法分析功能,对于更复杂的语言,可能需要更多的识别规则和处理逻辑。
- 程序中的代码注释和输出格式可以根据需要进行调整。
- 程序使用了
iostream和string库,需要在编译时包含相应的头文件。
本程序仅供参考,可根据实际需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/oHGd 著作权归作者所有。请勿转载和采集!