c++前提:给定预测分析表,见教材 P76 表 4.1(对应文法为文法 4.2) 要求:构造出相关预测分析程序,并返回一个符号串的分析结果,如果是一个合法的符号串输出正确标志并返回 True,否则输出错误标志并返回 False。 参考:教材 P76-78 4.5 预测分析程序
时间: 2023-12-14 13:40:20 浏览: 81
台电p76h升级教程
这里是一个简单的C++预测分析程序,用于分析输入的符号串是否属于给定文法。
```c++
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
const int MAXN = 100;
const int MAXM = 100;
char M[MAXN][MAXM][MAXM]; // 预测分析表
char inputStr[MAXM]; // 待分析符号串
// 判断终结符
bool isTerminal(char ch) {
return (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9');
}
// 获取非终结符在预测分析表中的列数
int getNonterminalCol(char ch) {
return ch - 'A' + 1;
}
// 获取终结符在预测分析表中的行数
int getTerminalRow(char ch) {
if (ch == '+') return 1;
if (ch == '-') return 2;
if (ch == '*') return 3;
if (ch == '/') return 4;
if (ch == '(') return 5;
if (ch == ')') return 6;
if (ch >= '0' && ch <= '9') return 7;
if (ch == '#') return 8;
return -1;
}
// 预测分析程序
bool predictAnalysis() {
stack<char> S;
S.push('#');
S.push('E'); // E 为文法的起始符号
int i = 0;
char X, Y;
while (!S.empty()) {
X = S.top();
S.pop();
Y = inputStr[i];
if (X == '#') {
if (X == Y) {
return true; // 输入符号串合法
} else {
return false; // 输入符号串不合法
}
} else if (isTerminal(X)) {
if (X == Y) {
i++;
} else {
return false; // 输入符号串不合法
}
} else { // X 为非终结符
int row = getTerminalRow(Y);
int col = getNonterminalCol(X);
if (row == -1 || col == -1) {
return false; // 输入符号串不合法
}
char* production = M[col][row];
if (strcmp(production, "error") == 0) {
return false; // 输入符号串不合法
} else {
// 将产生式逆序入栈
for (int j = strlen(production) - 1; j >= 0; j--) {
S.push(production[j]);
}
}
}
}
return false; // 输入符号串不合法
}
int main() {
// 初始化预测分析表
strcpy(M[1][7], "TG");
strcpy(M[1][8], "TG");
strcpy(M[2][7], "-TG");
strcpy(M[2][8], "");
strcpy(M[3][7], "FR");
strcpy(M[3][8], "FR");
strcpy(M[4][7], "");
strcpy(M[4][8], "/FR");
strcpy(M[5][7], "(E)");
strcpy(M[5][8], "i");
strcpy(M[6][7], "error");
strcpy(M[6][8], "error");
// 输入待分析符号串
cin >> inputStr;
// 进行预测分析
if (predictAnalysis()) {
cout << "输入符号串合法" << endl;
} else {
cout << "输入符号串不合法" << endl;
}
return 0;
}
```
该程序首先读入预测分析表和待分析符号串,然后使用栈来模拟预测分析过程。具体地,程序从栈顶取出一个符号,如果该符号是终结符,则与输入符号串对应位置的符号进行匹配;否则,程序根据当前输入符号串的位置和栈顶非终结符在预测分析表中的位置,查找预测分析表并取出对应的产生式,将产生式逆序入栈。如果输入符号串合法,则最终栈内只剩下结束符号 '#'; 否则,输入符号串不合法。
需要注意的是,上述程序只是给出了一个简单的预测分析程序实现,实际应用中可能需要考虑更加复杂的情况,如错误处理、错误恢复等。
阅读全文