C++给定预测分析表,构造出相关预测分析程序,并返回一个符号串的分析结果,如果是一个合法的符号串则输出正确标志并返回True,否则输出错误标志并返回False。
时间: 2023-12-03 10:42:54 浏览: 135
判断回文字符串的c++程序
预测分析表是一种自动机,可以用程序来实现。下面是一个简单的C++代码实现:
```cpp
#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;
// 预测分析表
unordered_map<char, unordered_map<char, string>> predict_table = {
{'E', {{'(', "TD"}, {'i', "TD"}}},
{'D', {{'+', "+TD"}, {'-', "-TD"}, {')', ""}, {'#', ""}}},
{'T', {{'(', "FS"}, {'i', "FS"}}},
{'S', {{'*', "*FS"}, {'/', "/FS"}, {')', ""}, {'+', ""}, {'-', ""}, {'#', ""}}}
};
// 分析函数
bool analyze(string s) {
stack<char> stk;
stk.push('#');
stk.push('E');
int i = 0;
while (!stk.empty()) {
char top = stk.top();
stk.pop();
char ch = s[i];
if (top == ch) {
i++;
} else if (top >= 'A' && top <= 'Z') {
string prod = predict_table[top][ch];
if (prod == "") {
return false; // 非法输入
}
for (int j = prod.size() - 1; j >= 0; j--) {
stk.push(prod[j]);
}
} else {
return false; // 非法输入
}
}
return true;
}
int main() {
string s;
while (cin >> s) {
if (analyze(s)) {
cout << "Correct" << endl;
} else {
cout << "Error" << endl;
}
}
return 0;
}
```
该程序实现了对一个给定符号串的预测分析,首先将起始符号 `E` 和结束符号 `#` 压入栈中。每次从栈顶取出一个符号 `top` 和输入串中的一个字符 `ch` 进行比较。如果相等,则输入串中的位置往后移一位。如果 `top` 是一个非终结符,则根据预测分析表中对应的产生式将新的符号压入栈中。如果 `top` 是一个终结符,则要求它和输入串中的字符 `ch` 相等。如果遍历完输入串后栈为空,则说明输入串是合法的;否则说明输入串是非法的。
阅读全文