上下无关文法的存储,用了两个结构体来存储左部和右部
右部里面又定义的有next指针是为了调用下一个,因为可能存在右部有两个甚至多个式子
通过输入一个非终结符,找到相应的产生式
#include
using namespace std;
const int MaxVnNum = 20;
const int MaxVtNum = 20;
const int Max = 20;
struct Vt {
int num;
char right[Max];
struct Vt *next;
};
struct Vn {
char vn;
struct Vt vt;
};
struct Vn grammar[MaxVnNum];
void enter(int n)
{
//struct Vn grammar[MaxVnNum];
int rcount = 0;
char left;
for (int i = 0; i < n; i++)
{
cout << "输入左部:" ;
cin >> left;
string exper;
grammar[i].vn = left;
cout << "输入右部文法个数:" ;
cin >> rcount;
for (int j = 0; j < rcount; j++)
{
grammar[i].vt.num = j + 1;
cout << "输入第j+1个表达式:";
cin >> exper;
for (int m = 0; m < exper.length(); m++)
{
grammar[i].vt.right[m] = exper[m];
}
grammar[i].vt.next;
}
}
}
void search(char L,int n)
{
int x;
bool a = false;
for (int i = 0; i < n; i++)
{
if (L == grammar[i].vn)
{
cout << "找到对应非终结符" << endl;
cout << "输入查找的第几个式子:";
cin >> x;
for (int j = 0; j < x; j++)
{
if (grammar[i].vt.num == x)
{
a = true;
cout << L << "->";
cout << grammar[i].vt.right << endl;
}
grammar[i].vt.next;
}
}
}
if (!a)
{
cout << "没有找到对应的产生式";
}
}
int main()
{
//输入产生式个数
cout << "输入产生式个数"<int n;
cin >> n;
//输入产生式,进行存储
enter(n);
//输入要寻找的产生式
char w;
cout << "输入要寻找的非终结符的产生式" << endl;
cin >> w;
search(w,n);
}
图片里面输出了两遍,而且不是想要的结果,不知道问题出在哪里,是没有存储进去嘛,帮忙看看代码,应该修改哪里?
struct Vn {
char vn;
struct Vt vt;
};
这里的 vt也应该是数组才行啊 。不然你只是存储了最后一个