对下列文法编写C++语言程序,用LL(1)分析法C对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FM (5)M->*FM|/FM (6)M->ε (7)F->(E) (8)F->i 输出过程如下: 步骤 分析栈 剩余输入串 所用产生式 1 E i+i*i# E->TG 输入符号串为非法符号串(或者为合法符号串) 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息; 输出如下:测试用的表达式可以事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串
时间: 2024-01-18 07:04:36 浏览: 167
LL(1)语法分析 任意输入一个文法符号串,并判断它是否为文法的一个句子
5星 · 资源好评率100%
好的,下面是对下列文法编写的C++程序,使用LL(1)分析法对任意输入的符号串进行分析:
```c++
#include <iostream>
#include <string>
#include <stack>
using namespace std;
// 预测分析表
string table[5][8] = {
{"TG", "", "", "", "TG", "", "TG", ""},
{"", "ε", "+TG", "-TG", "", "", "", "ε"},
{"FM", "", "", "", "FM", "", "FM", ""},
{"", "ε", "", "", "ε", "*FM", "/FM", "ε"},
{"(E)", "", "", "", "i", "", "i", ""}
};
// 判断非终结符
bool isNonTerminal(char c) {
return c == 'E' || c == 'G' || c == 'T' || c == 'M' || c == 'F';
}
// 获取预测分析表中的产生式
string getProduction(char X, char a) {
int row, col;
switch(X) {
case 'E': row = 0; break;
case 'G': row = 1; break;
case 'T': row = 2; break;
case 'M': row = 3; break;
case 'F': row = 4; break;
}
switch(a) {
case '(': col = 0; break;
case ')': col = 1; break;
case '+': col = 2; break;
case '-': col = 3; break;
case '*': col = 4; break;
case '/': col = 5; break;
case 'i': col = 6; break;
case '#': col = 7; break;
}
return table[row][col];
}
// LL(1)分析过程
bool LL(string str) {
stack<char> stk;
stk.push('#');
stk.push('E');
int i = 0;
char X = stk.top();
while(X != '#' && i < str.length()) {
char a = str[i];
if(X == a) {
stk.pop();
i++;
} else if(isNonTerminal(X)) {
string prod = getProduction(X, a);
if(prod == "") {
// 无法推导出该符号串,分析失败
return false;
}
stk.pop();
if(prod != "ε") {
for(int j = prod.length() - 1; j >= 0; j--) {
stk.push(prod[j]);
}
}
} else {
// 栈顶符号是终结符,但与输入符号不匹配,分析失败
return false;
}
X = stk.top();
}
if(X == '#' && i == str.length()) {
// 分析成功
return true;
} else {
// 栈为空但输入符号串未被完全处理,或者栈不为空但输入符号串已被处理完,分析失败
return false;
}
}
int main() {
string str;
cout << "请输入以#结束的符号串:";
cin >> str;
if(LL(str)) {
cout << "该符号串是该文法的句子" << endl;
} else {
cout << "该符号串不是该文法的句子" << endl;
}
return 0;
}
```
该程序会从标准输入读取一个符号串,并使用LL(1)分析法对该符号串进行分析。如果分析成功,则输出“该符号串是该文法的句子”,否则输出“该符号串不是该文法的句子”。
注意:该程序中的预测分析表是根据题目中的文法手动构造的,如果文法发生改变,则需要相应地修改预测分析表。
阅读全文