C++写完成以下正则文法所描述的Pascal语言子集单词符号的词法分析程序。 <标识符>→字母︱ <标识符>字母︱ <标识符>数字 <无符号整数>→数字︱ <无符号整数>数字 <单字符分界符>
时间: 2023-11-06 11:04:37 浏览: 49
以下是使用C++编写的Pascal语言子集单词符号的词法分析程序:
```cpp
#include<iostream>
#include<string>
using namespace std;
bool is_digit(char c) {
return c >= '0' && c <= '9';
}
bool is_alpha(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
bool is_single_delimiter(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '='
|| c == '<' || c == '>' || c == '(' || c == ')' || c == ';' || c == ':');
}
bool is_identifier(string s) {
if (!is_alpha(s[0])) {
return false;
}
for (int i = 1; i < s.length(); i++) {
if (!is_alpha(s[i]) && !is_digit(s[i])) {
return false;
}
}
return true;
}
bool is_unsigned_integer(string s) {
if (s.length() == 0 || !is_digit(s[0])) {
return false;
}
for (int i = 1; i < s.length(); i++) {
if (!is_digit(s[i])) {
return false;
}
}
return true;
}
int main() {
string input;
cout << "请输入Pascal语言子集代码: ";
getline(cin, input);
input += " "; // 为了方便处理最后一个单词
string current_word = "";
for (int i = 0; i < input.length(); i++) {
if (is_single_delimiter(input[i])) {
if (current_word != "") {
if (is_identifier(current_word)) {
cout << current_word << " 是标识符" << endl;
} else if (is_unsigned_integer(current_word)) {
cout << current_word << " 是无符号整数" << endl;
} else {
cout << current_word << " 无法识别为任何一种单词符号" << endl;
}
current_word = "";
}
cout << input[i] << " 是单字符分界符" << endl;
} else if (input[i] == ' ') {
if (current_word != "") {
if (is_identifier(current_word)) {
cout << current_word << " 是标识符" << endl;
} else if (is_unsigned_integer(current_word)) {
cout << current_word << " 是无符号整数" << endl;
} else {
cout << current_word << " 无法识别为任何一种单词符号" << endl;
}
current_word = "";
}
} else {
current_word += input[i];
}
}
return 0;
}
```
这个程序可以读入Pascal语言子集的代码,然后对其中的单词符号进行识别和分类。它使用了一些辅助函数,如 `is_digit` 和 `is_alpha` 来判断一个字符是否是数字或字母,以及 `is_single_delimiter` 来判断一个字符是否是单字符分界符。对于标识符和无符号整数,它分别使用了 `is_identifier` 和 `is_unsigned_integer` 函数来判断。最后,程序输出每个单词符号的类型。