c++前提:给定预测分析表,见教材 P76 表 4.1(对应文法为文法 4.2) 要求:构造出相关预测分析程序,并返回一个符号串的分析结果,如果是一个合法的符号串输出正确标志并返回 True,否则输出错误标志并返回 False。 参考:教材 P76-78 4.5 预测分析程序
时间: 2023-12-14 07:39:28 浏览: 115
根据教材 P76-78 4.5 预测分析程序的方法,我们可以按照以下步骤构造相关预测分析程序:
1. 构造预测分析表
根据教材 P76 表 4.1,我们可以构造出预测分析表如下:
| | id | + | * | ( | ) | # | E | T | F |
| -- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| 0 | S | | | S->E | | | 1 | 2 | 3 |
| 1 | | S->E+T| | | err | acc | | | |
| 2 | | R3 | S->T | | R3 | R3 | | | |
| 3 | | R6 | R6 | | R6 | R6 | | | |
其中,S 表示起始符号,# 表示输入串的结束符号,err 表示出错,acc 表示成功接受。
2. 编写预测分析程序
根据预测分析表,我们可以编写一个预测分析程序,程序的基本框架如下:
```
bool analyze(string input) {
stack<int> stk;
stk.push(0); // 初始状态为 0
int i = 0; // 输入串的指针
char X; // 栈顶符号
int state; // 状态编号
while (true) {
X = stk.top(); // 取出栈顶符号
state = X - '0'; // 获取状态编号
char ch = input[i]; // 获取输入串的下一个字符
int col = getColumn(ch); // 获取输入字符对应的列号
char action = table[state][col]; // 查表获取动作
if (action == ' ') { // 出错
cout << "Error!" << endl;
return false;
} else if (action == 'acc') { // 成功接受
cout << "Accepted!" << endl;
return true;
} else if (action == 'S') { // 移进
stk.push(ch); // 将字符压入栈中
stk.push(action - '0'); // 将新状态压入栈中
i++; // 输入串指针后移
} else { // 规约
int len = getLength(action); // 获取规约所需弹出的符号数
for (int j = 0; j < 2 * len; j++) { // 弹出符号
stk.pop();
}
X = stk.top(); // 取出新的栈顶符号
state = X - '0'; // 获取新的状态编号
int row = getRow(X); // 获取新的行号
char newSymbol = table[row][getColumn(X)]; // 查表获取新的动作
stk.push(X); // 将新符号压入栈中
stk.push(newSymbol - '0'); // 将新状态压入栈中
}
}
}
```
其中,getColumn 和 getRow 函数分别用于获取输入字符对应的列号和栈顶符号对应的行号,getLength 函数用于获取规约所需弹出的符号数。这些函数的具体实现可以参考教材 P77-78。
3. 测试程序
我们可以编写一个简单的测试程序来测试预测分析程序,代码如下:
```
int main() {
string input;
cout << "Please enter a string: ";
cin >> input;
input += '#'; // 在输入串末尾加上结束符号 #
bool result = analyze(input);
return 0;
}
```
在运行测试程序时,我们需要手动输入一个待分析的符号串。例如,如果我们输入符号串 "id+id*id",程序应该输出 "Accepted!",表示该符号串是一个合法的符号串。如果输入不合法的符号串,程序会输出 "Error!"。
阅读全文