求C++语法分析器和词法分析器,高分急求!!
字数限制只能发上部分,你若有其它联系方法再想法发下半部分,这个程序是已通过编译的
#include <stdio.h>
#include <process.h>
#include <iostream.h>
#include <string.h>
#include <fstream.h>
class Yui_Kong //滤空格
{ char Yufa[30][30];
char k[30];
int N;
public:
char Yufa0[30][30];
char Kong[30][30];
private:
void Shu_Ru()
{ cout<<endl<<"请输入文法:"<<endl<<endl;
char c;int i=0,j=0;
c=getchar();
while(c!='#')
{if(c=='\n'){Yufa[i][j]='\0';i++;j=0;}
else Yufa[i][j++]=c;
c=getchar();
}
if(j==0)Yufa[i][j]='#';
else{
Yufa[i][j]='\0';Yufa[i+1][0]='#';
}
}
void Hua_jian()
{ int i=0;int ii=0,jj=0;
while(Yufa[i][0]!='#')
{
for(int j=0;Yufa[i][j]!='\0';j++)
{ if(j==1||j==2);
else if(Yufa[i][j]=='|')
{ Yufa0[ii++][jj++]='\0';
Yufa0[ii][0]=Yufa0[ii-1][0];
jj=1;
}
else
Yufa0[ii][jj++]=Yufa[i][j];
}
Yufa0[ii][jj]='\0';
ii++;jj=0;
i++;
}
Yufa0[ii][0]='#';
}
void Vn()//在产生式中提取非终结符
{ int i=0,ii=0,iii=0;
Kong[ii++][0]=Yufa[0][0];
while(Yufa[i][0]!='#')
{
for(int j=0;Yufa[i][j]!='\0';j++)
if(Yufa[i][j]>='A'&&Yufa[i][j]<='Z')
{
for(;iii<ii;iii++)
if(Kong[iii][0]==Yufa[i][j])break;
if(iii==ii)
Kong[ii++][0]=Yufa[i][j];
iii=0;
}
i++;
}
Kong[ii][0]='#';
}
void Scan()//进行扫描,看各非终结符能否推出空
{
char tmp[30][30];
int i=0;
for(;Yufa0[i][0]!='#';i++)//把产生时拷贝到临时数组
strcpy(tmp[i],Yufa0[i]);
tmp[i][0]='#';
for(int j=0;tmp[j][0]!='#';j++)//进行第一次扫描,
{
for(int jj=0;tmp[j][jj]!='\0';jj++)
{
if(tmp[j][jj]=='$')//能推出空
{
char tm=tmp[j][0];
for(int t=j;tmp[t+1][0]!='#';t++)
strcpy(tmp[t],tmp[t+1]);
tmp[t][0]='#';j--;
for(int a=0;Kong[a][0]!='#';a++)
{
if(Kong[a][0]==tm)
{Kong[a][1]='1'; break;}
}
break;
}
else if(tmp[j][jj]<'A'||tmp[j][jj]>'Z')//不能推出空
{
for(int jjj=j;tmp[jjj+1][0]!='#';jjj++)
strcpy(tmp[jjj],tmp[jjj+1]);
tmp[jjj][0]='#';j--;
break;
} }
}
for(int e=0;Kong[e][0]!='#';e++)//把第一次扫描的结果记录到Kong数组里
{ for(int j=0;tmp[j][0]!='#';j++)
if(Kong[e][0]==tmp[j][0]) break;
if(tmp[j][0]=='#'&&Kong[e][1]!='1')Kong[e][1]='0';
}
int hj=0;
for(int y=0;Kong[y][0]!='#';y++)
{ Kong[y][2]=Kong[y][1];
if(Kong[y][1]!='1'&&Kong[y][1]!='0')hj=1;
}
N=3;
if(hj==1)
{ int p=1;
while(p)
{ for(int aa=0;tmp[aa][0]!='#';aa++)
{ int bb=1,nn=0;
for(;tmp[aa][bb]!='\0';bb++)//逐个扫描产生式的每一个符号
{ for(int cc=0;Kong[cc][0]!='#';cc++)//查看kong中的每一个非终结符
{
int oo=0;
if(Kong[cc][0]==tmp[aa][bb])//在产生式中发现了一个非终结符
{
if(Kong[cc][1]=='1'||k[cc]=='1')//如果该非终结符被标记为能推出空,则删除该非终结符
{ int dd=bb;
while(tmp[aa][dd+1]!='\0')
{ tmp[aa][dd]=tmp[aa][dd+1];
dd++;
}
tmp[aa][dd]='\0';bb--;
break;
}
if(Kong[cc][1]=='0'||k[cc]=='0')//如果该非终结符被标记为不能推出空,说明此产生式左部亦不能推出空,记录,并删除此产生式
{ char jj=tmp[aa][0];
for(int ii=aa;tmp[ii+1][0]!='#';ii++)//删除产生式
strcpy(tmp[ii],tmp[ii+1]);
tmp[ii][0]='#';aa--;oo=1;
int ll=0;
for(int kk=0;tmp[kk][0]!='#';kk++)
{
if(tmp[kk][0]==jj){ll=1;break;}//查看产生式数组中是否还有以此以产生式左部非终结符开始的产生式
}
if(ll==0)//产生式数组中没有以此非终结符开始的产生式,此非终结符标记为不能
{ for(int mm=0;Kong[mm][0]!='#';mm++)
if(Kong[mm][0]==jj){k[mm]='0';break;}
}
if(bb==1){nn=1;}//标记此产生式右部并不是因为全部被删除而产生的空
break;
}
}
if(oo==1)break;//已经有结果,循环没必要继续,退出
}
}
if(bb==1&&nn==0)//产生式右部全部被删除
{
for(int ee=0;Kong[ee][0]!='#';ee++)//标记为能推出空
if(Kong[ee][0]==tmp[aa][0]) { k[ee]='1';break;}
char ff=tmp[aa][0];
for(int hh=0;tmp[hh][0]!='#';hh++)//删除左部为此非终结符的全部产生式
if(tmp[hh][0]==ff)
{
for(int gg=hh;tmp[gg+1][0]!='#';gg++)
strcpy(tmp[gg],tmp[gg+1]);
tmp[gg][0]='#';hh--;aa--;
} }
}
for(int mn=0;Kong[mn][0]!='#';mn++)
{ Kong[mn][N]=k[mn];
if(Kong[mn][1]!='1'&&Kong[mn][1]!='0')
Kong[mn][1]=k[mn];
k[mn]='a';
}
N++;
int ty=0;
while(Kong[ty][0]!='#')
{ if(Kong[ty][1]!='0'&&Kong[ty][1]!='1')break;
ty++;
}
if(Kong[ty][0]=='#')p=0;
} }
}
void KG(int a)//输出空格个数;
{ for(int i=0;i<a;i++)cout<<" ";
}
public:
void print_Kong()//显示非终结符能否推出空的结果
{ Shu_Ru();
Hua_jian();
Vn();
Scan();
int num=0,num1,num2,num3;
for(int i=0;Kong[i][0]!='#';i++) num++;
if(num==2){num1=13;num2=5;num3=5;}if(num==3){num1=9;num2=2;num3=3;}if(num==4){num1=6;num2=4;num3=4;}if(num==5){num1=5;num2=1;num3=2;}
if(num==6){num1=4;num2=1;num3=1;}if(num==7){num1=3;num2=2;num3=3;}if(num==8){num1=2;num2=6;num3=6;}
cout<<"\n\n ************非终结符能否推出空的表************\n";
cout<<"┏================================================== =======┑";
cout<<"┊";KG(num2);cout<<"非终结符";KG(num3);cout<<"┊";
for(int ii=0;ii<num;ii++)
{ KG(num1);cout<<Kong[ii][0];KG(num1);cout<<"┊";
}
cout<<"├————————————————————————————————┤";
cout<<"┊";KG(num2+num3+8);cout<<"┊";
for(int kk=0;kk<num;kk++)
{ KG(num1+num1+1);cout<<"┊";
}
cout<<"┊";KG(num2+2);cout<<"初值";KG(num3+2);cout<<"┊";
for(int iii=0;iii<num;iii++)
{ KG(num1-1);cout<<"未定";KG(num1-2);cout<<"┊";
}
for(int we=2;we<N;we++)
{ cout<<"┊";KG(num2+num3+8);cout<<"┊";
for(int s=0;s<num;s++)
{ KG(num1+num1+1);cout<<"┊";
}
cout<<"┊";KG(num2);cout<<"第"<<we-1<<"次扫描";KG(num3-1);cout<<"┊";
for(int j=0;j<num;j++)
{ if(Kong[j][we]=='1'){KG(num1);cout<<"是";KG(num1-1);cout<<"┊";}
else if(Kong[j][we]=='0'){KG(num1);cout<<"否";KG(num1-1);cout<<"┊";}
else {KG(num1);cout<<" ";KG(num1);cout<<"┊";}
}
}
cout<<"┊";KG(num2+num3+8);cout<<"┊";
for(int ss=0;ss<num;ss++)
{ KG(num1+num1+1);cout<<"┊";
}
cout<<"├———————————————————————————————————┤";
cout<<"┊";KG(num2);cout<<"最终结果";KG(num3);cout<<"┊";
for(int jjj=0;jjj<num;jjj++)
{if(Kong[jjj][1]=='1'){KG(num1);cout<<"是";KG(num1-1);cout<<"┊";}
else if(Kong[jjj][1]=='0'){KG(num1);cout<<"否";KG(num1-1);cout<<"┊";}
else {KG(num1);cout<<" ";KG(num1);cout<<"┊";}
}
cout<<"┕===============================================================┙";
}
};
class Qiu_First:public Yui_Kong
{
public:
char FIRST[30][30];
int number2[30];//记录非终结符FIRST集元素的数目
int number1[30];//记录非终结符在FIRST中的位置,与产生式数组配对使用
char chan_sheng_shi[30][30];
int U;//记录符号集合与符号串集合的分界
int number3[30];
void chu_shi_hua()//初始化 FIRST、number1、number2、chan_sheng_shi
{ int i=0;
for(;Kong[i][0]!='#';i++)
{ FIRST[i][0]=Kong[i][0];FIRST[i][1]='0';number2[i]=2;}
FIRST[i][0]='#';U=i;
i=0;
for(;Yufa0[i][0]!='#';i++)
{for(int j=0;Yufa0[i][j]!='\0';j++)
chan_sheng_shi[i][j]=Yufa0[i][j];
chan_sheng_shi[i][j]='\0';
for(int k=0;FIRST[k][0]!='#';k++)
if(chan_sheng_shi[i][0]==FIRST[k][0])
{ number1[i]=k;break;}
}
chan_sheng_shi[i][0]='#';
}
void he_bing(char ch[30][30],int m,int i,int &j,char ch0[30][30],int m0,int i0,int j0)//要扩展的集合、指明行数、指明集合元素开始的位置、指明集合元素结束位置……
{ for(int a=i0;a<j0;a++)
{
int b=i;
for(;b<j;b++)
if(ch[m][b]==ch0[m0][a])break;
if(b==j)
ch[m][j++]=ch0[m0][a];
} }
void scan1()
{ int a=0,aa=0;
while(chan_sheng_shi[a][0]!='#')
{ if(chan_sheng_shi[a][1]=='$')
{ aa=a;
for(;chan_sheng_shi[aa+1][0]!='#';aa++)
{
strcpy(chan_sheng_shi[aa],chan_sheng_shi[aa+1]); number1[aa]=number1[aa+1];
}
chan_sheng_shi[aa][0]='#';a--;
}
else if(chan_sheng_shi[a][1]<'A'||chan_sheng_shi[a][1]>'Z')
{
FIRST[number1[a]][number2[number1[a]]++]=chan_sheng_shi[a][1];
aa=a;
for(;chan_sheng_shi[aa+1][0]!='#';aa++)
{
strcpy(chan_sheng_shi[aa],chan_sheng_shi[aa+1]); number1[aa]=number1[aa+1];
}
chan_sheng_shi[aa][0]='#';a--;
}
a++;
}
a=0;
while(FIRST[a][0]!='#')
{
int i=0;
for(;chan_sheng_shi[i][0]!='#';i++)
if(chan_sheng_shi[i][0]==FIRST[a][0])break;
if(chan_sheng_shi[i][0]=='#')
FIRST[a][1]='1';
a++;
}
}
void scan2()
{
int a=0,aa=0;
for(;chan_sheng_shi[a][0]!='#';a++)
{
aa=1;int n;
while(chan_sheng_shi[a][aa]!='\0')
{
n=0;
if((chan_sheng_shi[a][aa]>='A'&&chan_sheng_shi[a][aa]<='Z')&&(chan_sheng_shi[a][aa+1]<'A'||chan_sheng_shi[a][aa+1]>'Z'))
n=1;
if((chan_sheng_shi[a][aa]>='A'&&chan_sheng_shi[a][aa]<='Z')&&(chan_sheng_shi[a][aa+1]>='A'&&chan_sheng_shi[a][aa+1]<='Z'))
{
int a2=0;
for(int a1=0;Kong[a1][0]!='#';a1++)
{
if(chan_sheng_shi[a][aa]==Kong[a1][0])
{if(Kong[a1][1]=='0')a2=1;
break;
}
}
if(a2==1) n=1;
}
if(n==1)
{
FIRST[number1[a]][number2[number1[a]]++]=chan_sheng_shi[a][aa];
for(int aaa=a;chan_sheng_shi[aaa+1][0]!='#';aaa++)
{
strcpy(chan_sheng_shi[aaa],chan_sheng_shi[aaa+1]); number1[aaa]=number1[aaa+1];
}
chan_sheng_shi[aaa][0]='#';
a--;
break;
}
FIRST[number1[a]][number2[number1[a]]++]=chan_sheng_shi[a][aa];
aa++;
}
}
}
void zheng_li()
{
int a=1;
while(a)
{
for(int b=0;FIRST[b][0]!='#';b++)
{
if(FIRST[b][1]=='0')//说明含有非终结符
{
for(int c=2;c<number2[b];c++)
{
if(FIRST[b][c]>='A'&&FIRST[b][c]<='Z')//找到非终结符进行集合扩展
for(int d=0;FIRST[d][0]!='#';d++)
if(FIRST[d][0]==FIRST[b][c]&&FIRST[d][1]=='1'){kuo_zhan(b,c,d);break;}//找到要添加的集合并且此集合已经整理完毕
}
int e=0;
for(int f=2;f<number2[b];f++)
if(FIRST[b][f]>='A'&&FIRST[b][f]<='Z'){e=1;break;}
if(e==0)
FIRST[b][1]='1';
}
}
int h=0;
for(int g=0;FIRST[g][0]!='#';g++)
if(FIRST[g][1]=='0'){h=1;break;}
if(h==0) a=0;
}
for(a=0;FIRST[a][0]!='#';a++)
{
if(Kong[a][1]=='1')
FIRST[a][number2[a]++]='$';
}
}
void kuo_zhan(int &b,int &c,int &d)
{
int m=1,i=2;
for(;i<number2[d];i++)
{
int j=2;
for(;j<number2[b];j++)//查找,没有则插入
if(FIRST[d][i]==FIRST[b][j])break;
if(j==number2[b])//插入
{
if(m==1)
{
m=0;FIRST[b][c]=FIRST[d][i];
}
else
{
for(int n=number2[b];n>c;n--)
FIRST[b][n]=FIRST[b][n-1];
FIRST[b][c]=FIRST[d][i];
number2[b]++;
c++;
}
}
}
if(m==1)
{
for(int n=c;n<number2[b];n++)
FIRST[b][n]=FIRST[b][n+1];
number2[b]--;
c--;
}
}
void print_FIRST()
{
chu_shi_hua();
scan1();
scan2();
zheng_li();
cout<<"\n 1.非终结符的 FIRST 集:";
cout<<"\n ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓\n\n";
for(int i=0;FIRST[i][0]!='#';i++)
{
cout<<" FIRST( "<<FIRST[i][0]<<" ) ={ "<<FIRST[i][2];
for(int j=3;j<number2[i];j++)
cout<<" , "<<FIRST[i][j];
cout<<" }\n\n";
}
cout<<" ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛\n";
chuan_first();
}
void re_chu()
{
for(int i=0;Yufa0[i][0]!='#';i++)
{
for(int j=0;Yufa0[i][j]!='\0';j++)
chan_sheng_shi[i][j]=Yufa0[i][j];
chan_sheng_shi[i][j]='\0';
}
chan_sheng_shi[i][0]='#';
i=U+1;
for(int j=0;chan_sheng_shi[j][0]!='#';j++)
{
for(int j1=1;chan_sheng_shi[j][j1]!='\0';j1++)
FIRST[i][j1-1]=chan_sheng_shi[j][j1];
number2[i]=number3[i-U]=j1-1;
i++;
}
FIRST[i][0]='#';
}
void chuan_first()
{
re_chu();
for(int i=U+1;FIRST[i][0]!='#';i++)
{
if(FIRST[i][0]>='A'&&FIRST[i][0]<='Z')
{
for(int i2=0;Kong[i2][0]!='#';i2++)
if(Kong[i2][0]==FIRST[i][0])break;
if(Kong[i2][1]=='0')
he_bing(FIRST,i,number3[i-U],number2[i],FIRST,i2,2,number2[i2]);
if(Kong[i2][1]=='1')
{
for(int i3=0;i3<number3[i-U];i3++)
{
for(int i4=0;Kong[i4][0]!='#';i4++)
if(Kong[i4][0]==FIRST[i][i3])break;
if(Kong[i4][1]=='1')
{
he_bing(FIRST,i,number3[i-U],number2[i],FIRST,i4,2,number2[i4]);
number2[i]--;
}
if(Kong[i4][1]=='0')
{
he_bing(FIRST,i,number3[i-U],number2[i],FIRST,i4,2,number2[i4]);
break;
}
}
if(i3==number3[i-U]) FIRST[i][number2[i]++]='$';
}
}
else
FIRST[i][number2[i]++]=FIRST[i][0];
}
for(int j=U+1;FIRST[j][0]!='#';j++)
FIRST[j][number2[j]]='\0';
//print_chuan_first();
}
void print_chuan_first()
{
cout<<"/n 每一个符号串的 FIRST 集:";
cout<<"\n ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓\n\n";
for(int i=U+1;FIRST[i][0]!='#';i++)
{
cout<<" FIRST( ";
for(int i1=0;i1<number3[i-U];i1++)
cout<<FIRST[i][i1];
cout<<" ) ={ "<<FIRST[i][i1];
for(i1=number3[i-U]+1;i1<number2[i];i1++)
cout<<" , "<<FIRST[i][i1];
cout<<" }\n\n";
}
cout<<" ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛\n";
}
};
class Qiu_Follow:public Qiu_First
{
public:
char FOLLOW[30][30];
int n1[30];
int n2[30];
void chu_shi_hua_follow()
{
for(int i=0;Yufa0[i][0]!='#';i++)
strcpy(chan_sheng_shi[i],Yufa0[i]);
chan_sheng_shi[i][0]='#';
for(int j=0;Kong[j][0]!='#';j++)
{
FOLLOW[j][0]=Kong[j][0];n1[j]=n2[j]=1;
}
FOLLOW[0][1]='#';n1[0]=n2[0]=2;
FOLLOW[j][0]='#';
}
void qiu_follow_ji()
{ chu_shi_hua_follow();
int a=1;
while(a){
a=0;
for(int i=0;FOLLOW[i][0]!='#';i++)
{
for(int i0=0;chan_sheng_shi[i0][0]!='#';i0++)
{
for(int i1=1;chan_sheng_shi[i0][i1]!='\0';i1++)
if(FOLLOW[i][0]==chan_sheng_shi[i0][i1])//如果在产生式中找到一个此非终结符则进行处理
{
if(chan_sheng_shi[i0][i1+1]=='\0')//A->aB
{
for(int i2=0;FOLLOW[i2][0]!='#';i2++)
if(FOLLOW[i2][0]==chan_sheng_shi[i0][0])break;
he_bing(FOLLOW,i,1,n1[i],FOLLOW,i2,1,n1[i2]);
}
else if(chan_sheng_shi[i0][i1+1]<'A'||chan_sheng_shi[i0][i1+1]>'Z')//A->aBc
{
for(int m=1;m<n1[i];m++)
if(FOLLOW[i][m]==chan_sheng_shi[i0][i1+1])break;
if(m==n1[i])
FOLLOW[i][n1[i]++]=chan_sheng_shi[i0][i1+1];
}
else //A->aBCD……
{
for(int i3=0;Kong[i3][0]!='#';i3++)//判断C是否能推出空
if(Kong[i3][0]==chan_sheng_shi[i0][i1+1])break;
if(Kong[i3][1]=='0')//C不能推出空
he_bing(FOLLOW,i,1,n1[i],FIRST,i3,2,number2[i3]);
else//C能推出空,则查看D……
{
he_bing(FOLLOW,i,1,n1[i],FIRST,i3,2,number2[i3]);
n1[i]--;
int j=0;
for(int i4=i1+2;chan_sheng_shi[i0][i4]!='\0';i4++)
{
if(chan_sheng_shi[i0][i4]>='A'&&chan_sheng_shi[i0][i4]<='Z')
{ j=0;
for(int i5=0;Kong[i5][0]!='#';i5++)
if(Kong[i5][0]==chan_sheng_shi[i0][i4])break;
if(Kong[i5][1]=='0')
{
he_bing(FOLLOW,i,1,n1[i],FIRST,i5,2,number2[i5]);
j=1;
break;
}
else
{ he_bing(FOLLOW,i,1,n1[i],FIRST,i5,2,number2[i5]); n1[i]--;}
}
else
{
for(int k=1;k<n1[i];k++)
if(FOLLOW[i][k]==chan_sheng_shi[i0][i4])break;
if(k==n1[i])
FOLLOW[i][n1[i]++]=chan_sheng_shi[i0][i4];
j=1;break;}
}
if(j==0)
{
for(int i6=0;FOLLOW[i6][0]!='#';i6++)
if(FOLLOW[i6][0]==chan_sheng_shi[i0][0])break;
he_bing(FOLLOW,i,1,n1[i],FOLLOW,i6,1,n1[i6]);
}
}
}
}
}
}
for(int b=0;FOLLOW[b][0]!='#';b++)
if(n1[b]!=n2[b]) {a=1;break;}
for(b=0;FOLLOW[b][0]!='#';b++)
n2[b]=n1[b];
}
}
void print_FOLLOW()
{
qiu_follow_ji();
cout<<"\n 2.非终结符的 FOLLOW 集:";
cout<<"\n ┏┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┓\n\n";
for(int i=0;FOLLOW[i][0]!='#';i++)
{
cout<<" FOLLOW( "<<FOLLOW[i][0]<<" ) ={ "<<FOLLOW[i][1];
for(int j=2;j<n1[i];j++)
cout<<" , "<<FOLLOW[i][j];
cout<<" }\n\n";
}
cout<<" ┗┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┛\n";
}
};
class Qiu_Select:public Qiu_Follow
{
public:
char SELECT[30][30];
int num[30];
void qiu_select()
{
for(int a=0;a<30;a++)num[a]=0;
for(int i=U+1;FIRST[i][0]!='#';i++)
{
if(FIRST[i][number2[i]-1]=='$')
{
number2[i]--;
he_bing(SELECT,i-U-1,0,num[i-U-1],FIRST,i,number3[i-U],number2[i]);
int s=i-U-1;
for(int i1=0;FOLLOW[i1][0]!='#';i1++)
if(FOLLOW[i1][0]==Yufa0[s][0])break;
he_bing(SELECT,i-U-1,0,num[i-U-1],FOLLOW,i1,1,n1[i1]);
number2[i]++;
}
else
{
he_bing(SELECT,i-U-1,0,num[i-U-1],FIRST,i,number3[i-U],number2[i]);
}
}
}