c++前提:给定预测分析表,见教材 P76 表 4.1(对应文法为文法 4.2) 要求:构造出相关预测分析程序,并返回一个符号串的分析结果,如果是一个合法的符号串输出正确标志并返回 True,否则输出错误标志并返回 False。 参考:教材 P76-78 4.5 预测分析程序。
时间: 2023-12-10 15:39:38 浏览: 20
以下是基于给定预测分析表和文法 4.2 的预测分析程序的 C++ 实现:
```c++
#include <iostream>
#include <stack>
#include <map>
#include <vector>
#include <string>
using namespace std;
// 定义终结符和非终结符
const vector<string> TERMINALS = {"i", "+", "*", "(", ")", "$"};
const vector<string> NON_TERMINALS = {"E", "E'", "T", "T'", "F"};
// 构造预测分析表
map<pair<string, string>, string> PREDICTIVE_TABLE = {
{{"E", "i"}, "ET'"},
{{"E", "("}, "ET'"},
{{"T", "i"}, "FT'"},
{{"T", "("}, "FT'"},
{{"E'", "+"}, "+ET'"},
{{"E'", ")"}, ""},
{{"E'", "$"}, ""},
{{"T'", "+"}, ""},
{{"T'", "*"}, "*FT'"},
{{"T'", ")"}, ""},
{{"T'", "$"}, ""},
{{"F", "i"}, "i"},
{{"F", "("}, "(E)"}
};
// 辅助函数:判断一个符号是否是终结符
bool is_terminal(string symbol) {
for (string terminal : TERMINALS) {
if (terminal == symbol) {
return true;
}
}
return false;
}
// 分析函数
bool predictive_parse(string input) {
stack<string> stack;
stack.push("$");
stack.push("E");
int i = 0;
while (!stack.empty()) {
string top = stack.top();
stack.pop();
string current = string(1, input[i]);
if (is_terminal(top)) {
if (top == current) {
i++;
} else {
return false;
}
} else {
string production = PREDICTIVE_TABLE[{top, current}];
if (production == "") {
continue;
}
for (int j = production.length() - 1; j >= 0; j--) {
stack.push(string(1, production[j]));
}
}
}
return true;
}
int main() {
string input;
cout << "请输入待分析的符号串:";
cin >> input;
if (predictive_parse(input)) {
cout << "符号串合法!" << endl;
return 0;
} else {
cout << "符号串不合法!" << endl;
return 1;
}
}
```
程序首先定义了终结符和非终结符,以及预测分析表。然后,定义了一个辅助函数 `is_terminal`,用于判断一个符号是否是终结符。
接下来,定义了主要的分析函数 `predictive_parse`。该函数使用了一个栈来模拟分析过程。首先,将 `$` 和文法符号 `E` 压入栈中。然后,从输入符号串中取出第一个符号,逐个取出栈顶符号进行分析。
如果栈顶符号是终结符,则判断它是否与当前输入符号相等。如果相等,则将输入符号串的指针向右移动一位;否则,说明分析失败。
如果栈顶符号是非终结符,则查找预测分析表得到对应的产生式,并将其反向压入栈中。如果查找到的产生式是空串,则说明该非终结符不能推导出当前输入符号,因此直接跳过。
在分析完整个输入符号串后,如果栈为空,则说明符号串合法;否则,说明分析失败。
最后,在 `main` 函数中,读入待分析的符号串,并调用 `predictive_parse` 函数进行分析。如果返回值为 `true`,则输出符号串合法的提示;否则,输出符号串不合法的提示。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)