📄 消除左递归.cpp
字号:
#include<iostream>
#include<fstream>
#include<string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::fstream;
const int size=10;
string gene[size],temp[size];
int main()
{
int i=0,count=0;
cout<<"\t\t输入1表示直接输入文法\n\t\t输入2表示从文件输入!\n\t\t输入表示其他退出!"<<endl;
cin>>i;
if(i==2)
{
fstream fin("C:\\Documents and Settings\\piao\\桌面\\test1\\s.txt");
i=0;
while(fin>>gene[i])i++;
count=i;
}
else if(i==1)
{
cout<<"请输入文法的行数:"<<endl;
cin>>count;
cout<<"请输入文法:"<<endl;
for(i=0;i<count;i++)
cin>>gene[i];
}
else
return 0;
cout<<"原文法为:"<<endl;
for(i=0;cout<<gene[i]<<endl,i<3;i++);
int j=0;
size_t start=0, end=0;
int count2=0;
for(i=0;i<count;i++)
{
for(j=0;j<i;j++)
{
start=2;
char qj=gene[j][0];
//修改每一条满足条件的产生式
bool rgt=false;
int count1=0;
string tt[size];
size_t s=0;
size_t e=0;
do
{
start++;
if(gene[i][start]==qj)//如果满足pi->qj*;
{
size_t es=gene[i].find_first_of("|",start+1);
if(es==string::npos)
es=gene[i].length();
string te=gene[i].substr(start+1,es-start-1);
if(!rgt)
{
s=gene[j].find_first_not_of("|",3);
while(s!=string::npos)
{
e=gene[j].find_first_of("|",s+1);
if(e==string::npos)
e=gene[j].length();
tt[count1]=gene[j].substr(s,e-s);
count1++;
s=gene[j].find_first_not_of("|",e+1);
}
rgt=true;
}
int k=0;
string ttl="\0";
for(;k<count1-1;k++)
ttl+=tt[k]+te+"|";
ttl+=tt[k]+te;
//cout<<ttl<<endl;
gene[i].replace(start,es-start,ttl);
//cout<<gene[i]<<endl;
//cout<<gene[i]<<endl;
}
start=gene[i].find_first_of("|",start+1);
}while(start!=string::npos);
}
//消除直接左递归
string p1="",p2="";
size_t sss=3,eee=0;
char ch=gene[i][0];
bool rg=false;
while(sss!=string::npos)
{
eee=gene[i].find_first_of("|",sss+1);
if(eee==string::npos)eee=gene[i].length();
if(gene[i][sss]==ch)
{
rg=true;
p1+=gene[i].substr(sss+1,eee-sss-1)+ch+"\'|";
}
else
{
p2+=gene[i].substr(sss,eee-sss)+ch+"\'|";
}
sss=gene[i].find_first_not_of("|",eee+1);
}
p2[p2.length()-1]='\0';
if(rg)
{
temp[count2]=ch+("\'->"+p1+"#");
count2++;
gene[i].replace(3,gene[i].length()-3,p2);
}
}
cout<<"消除递归后的文法为:"<<endl;
for(i=0;cout<<gene[i]<<endl,i<count-1;i++);
for(i=0;cout<<temp[i]<<endl,i<count2-1;i++);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -