#include<bits/stdc++.h>
using namespace std;
struct GRAM //定义一个产生式结构体
{
string left; //定义产生式的左部
string right; //定义产生式的右部
};
int main()
{
GRAM *p=new GRAM[50];
char str[80];
const char *ch = "|";
char *result;
vector<string> strN;
cout<<"请输入规则:"<<endl;
gets(str);//注意用的是gets()可以连带空格都扫描进去
result = strtok(str,ch);
while(result!=NULL)
{
strN.push_back(result);
result = strtok(NULL,ch);
}
//得到左部
p[0].left=strN[0][0];
int len=strN[0].length();
p[0].right=strN[0].substr(4,len-1);
for(unsigned i=1;i<strN.size();i++)
{
p[i].left=strN[0][0];
//得到右部
len=strN[i].length();
p[i].right=strN[i].substr(0,len-1);
}
for(int i=0;i<strN.size();i++)
{
if(p[i].left[0]==p[i].right[0])
{
string str;
str=p[i].right.substr(1,int (p[i].right.length()));//取右部第二位开始的字串赋给str
string temp=p[i].left; //有形如E->E+T之后变为E'->+TE'
string temp1="'";
p[i].left=temp+temp1;
p[i].right=str+p[i].left;
}
else
{
string temp=p[i].left; //有形如E->T之后变为E->TE'
string temp1="'";
temp=temp+temp1;
p[i].right=p[i].right+temp;
}
}
string str1="'";
p[strN.size()].left=p[0].left[0]+str1;
p[strN.size()].right="ε";
for(int i=0;i<=strN.size();i++)
{
cout<<p[i].left<<"::="<<p[i].right<<endl;
}
}
编译原理消去规则左递归
猜你喜欢
转载自blog.csdn.net/yangyangcome/article/details/80313410
今日推荐
周排行