C++给定预测分析表,构造出相关预测分析程序,并返回一个符号串的分析结果,如果是一个合法的符号串则输出正确标志并返回True,否则输出错误标志并返回False。
时间: 2023-08-04 15:05:48 浏览: 109
判断回文字符串的c++程序
以下是一个简单的C++预测分析程序的实现,假设已经有了预测分析表和待分析的符号串:
```c++
#include <iostream>
#include <stack>
#include <vector>
#include <unordered_map>
using namespace std;
// 预测分析表,使用哈希表存储,键为终结符和非终结符的组合,值为产生式编号
unordered_map<string, int> analysisTable;
// 产生式,使用二维数组存储
int productions[3][4] = {
{1, 2, 0, 0},
{3, 4, 0, 0},
{2, 1, 0, 0}
};
// 终结符和非终结符,使用哈希表存储,键为符号,值为终结符或非终结符的编号
unordered_map<string, int> symbols = {
{"$", 0},
{"a", 1},
{"b", 2},
{"S", 3},
{"A", 4}
};
// 将输入符号串转换为符号编号的数组
vector<int> getSymbolIds(string input) {
vector<int> symbolIds;
for (char c : input) {
symbolIds.push_back(symbols[string(1, c)]); // 将每个字符转为字符串,再转为对应的符号编号
}
symbolIds.push_back(symbols["$"]); // 在末尾加上结束符
return symbolIds;
}
// 分析函数
bool analyze(string input) {
vector<int> symbolIds = getSymbolIds(input); // 将输入符号串转换为符号编号的数组
stack<int> analysisStack;
analysisStack.push(symbols["$"]); // 将结束符入栈
analysisStack.push(symbols["S"]); // 将起始符号入栈
int curPos = 0;
while (!analysisStack.empty()) {
int curSymbol = analysisStack.top();
analysisStack.pop();
if (curSymbol == symbolIds[curPos]) { // 终结符匹配成功
curPos++;
} else if (curSymbol < 1 || curSymbol > 4) { // 非法符号
return false;
} else { // 非终结符
string key = to_string(curSymbol) + "," + to_string(symbolIds[curPos]); // 构造哈希表键
if (analysisTable.count(key)) { // 如果能够找到对应的产生式
int productionNum = analysisTable[key];
for (int i = 3; i >= 0; i--) {
if (productions[productionNum - 1][i] > 0) { // 将产生式右侧的符号入栈
analysisStack.push(productions[productionNum - 1][i]);
}
}
} else { // 如果找不到对应的产生式
return false;
}
}
}
return true;
}
int main() {
// 构造预测分析表
analysisTable["3,1"] = 1;
analysisTable["4,2"] = 2;
analysisTable["2,1"] = 3;
analysisTable["3,2"] = 3;
analysisTable["4,1"] = 3;
// 测试符号串
string input = "aab";
// 进行分析
bool result = analyze(input);
// 输出分析结果
if (result) {
cout << "符号串合法" << endl;
} else {
cout << "符号串不合法" << endl;
}
return 0;
}
```
上述代码中,使用哈希表存储预测分析表和符号表,使用二维数组存储产生式。在分析时,使用栈来存储当前的符号序列,每次取出栈顶符号进行匹配,如果是终结符则匹配成功,如果是非终结符则在预测分析表中查找对应的产生式,并将产生式右侧的符号入栈。如果找不到对应的产生式或者遍历完符号串后栈不为空,则说明符号串不合法。
阅读全文