#include<bits/stdc++.h>
using namespace std;
//保存左右部的字符串和标记
struct STR{
string s;
int flag[100];
};
//判断终结符和非终结符
int Norterminal(char c)
{
if(c>='A'&&c<='Z')
return 1;
else if(c!=':'&&c!='='&&c!='<'&&c!='>'&&c!=' ')
return 0;
else
return -1;
}
int main()
{
int num,len;
std::vector<string> strN;//保存文法规则
string gram;//文法规则
string start;//开始符
STR strL[100];//左部规则的个数
STR strR[100];//右部规则的个数
string left;
//保存输入规则
for(len=0;len<100;len++)
{
cin>>gram;
if(gram=="#")
break;
else
{
strN.push_back(gram);
}
}
num=len;
//得到所有的输入规则的左部和右部
for(unsigned i=0;i<strN.size();i++)
{
strL[i].s=strN[i][0];
strL[i].flag[i]=0;
//cout<<strN[i].length()<<endl;
int len=strN[i].length();
//得到右部
strR[i].s=strN[i].substr(4,len-1);
for(int i=0;i<len;i++)
{
strR[i].flag[i]=0;
}
}
//取得第一个规则
string strFront= strN.front();
//保存开始符
for(int i=0;i<strFront.length();i++)
{
start=strFront[0];
}
/*判断条件1*/
//起始符加标记
strL[0].flag[0]=1;
for(int i=0;i<strN.size();i++)
{
for(int j=0;j<strR[i].s.length();j++)
{
if(strL[i].flag[0]==1)
{
if(Norterminal(strR[i].s[j]))
{
strR[i].flag[j]=1;
for(int k=0;k<strN.size();k++)
{
if(strL[k].s[0]==strR[i].s[j]&&Norterminal(strR[i].s[j]))
{
strL[k].flag[0]=1;
}
}
}
}
}
}
//删除不满足条件一的结果
for(int i=0;i<strN.size();i++)
{
if(strL[i].flag[0]==0)
{
strN.erase(strN.begin()+i);
// cout<<i+1;
}
}
cout<<"循环条件一后的结果:"<<endl;
//条件二的初始化
for(unsigned i=0;i<strN.size();i++)
{
cout<<strN[i]<<endl;//结果
strL[i].flag[0]=0;
for(int j=0;j<strN[i].size();j++)
{
strR[i].flag[j]=0;
}
}
for(int i=0;i<strN.size();i++)
{
if(Norterminal(strR[i].s[0])==0&&strR[i].s.length()==1)
{
strL[i].flag[0]=1;
}
}
for(int i=0;i<strN.size();i++)
{
if(strL[i].flag[0]==1)
{
for(int j=0;j<strN.size();j++)
{
for(int k=0;k<strN[j].length();k++)
{
if(strL[i].s[0]==strR[j].s[k])
{
strR[j].flag[k]=1;
strL[j].flag[0]=1;
}
}
}
}
}
cout<<"循环条件二后的结果:"<<endl;
//删除不满足条件二的结果
for(int i=0;i<strN.size();i++)
{
if(strL[i].flag[0]==0)
{
strN.erase(strN.begin()+i);
}
}
for(unsigned i=0;i<strN.size();i++)
{
cout<<strN[i]<<endl;
}
}
编译原理加标记法(压缩文法等价变换)
最新推荐文章于 2023-10-17 20:36:37 发布