实验二--语法分析(算符优先)_第1页
实验二--语法分析(算符优先)_第2页
实验二--语法分析(算符优先)_第3页
实验二--语法分析(算符优先)_第4页
实验二--语法分析(算符优先)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二 语法分析算符优先分析程序一实验要求 选择最有代表性的语法分析方法,如算符优先法、递归子程序法或LR分析法 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 实习时间为6学时二实验内容及要求(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表 输出到屏幕或者输出到文件);(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)(3)给定表达式文法为: G(E): E#E#EE+T | TTT*F |FF(E)|i(4)分析的句子为: (i+i)*i和i+i)*i三、实验主要代码# define MAX 100char *SR;/输入串char SYMAX;/移近或规约后剩余串char SMAX;/堆栈char grammer1030;/保存输入的语法规则char chanshengshi2010;char feizhongjie10;/存放非终结符char zhongjie15;/存放终结符int numf=0;/非终结符个数int num=0;/终结符个数int M=0;/转换后产生式个数char Relation66;/存放优先关系int FIRSTVT36;/存放firstvt集int LASTVT36;/存放lastvt集int type(char s)/在终结符串里查找字符a若a在其中返回下标,否则返回-1int len=strlen(zhongjie);int tp=-1;for(int i=0;ilen;i+)if(s=zhongjiei)tp=i;break;return tp;int type_fei(char s)int len=strlen(feizhongjie);int tp=-1;for(int i=0;ilen;i+)if(s=feizhongjiei)tp=i;break;return tp;void transproduct(int n)/原始产生式处理int x=0,y=0;for(int i=0;in;i+)for(int j=0;grammerij!=0;j+)if(grammeri0Z)cout该文法不是算符文发!endl;return;elseif(type_fei(grammeri0)=A&grammerij=A&grammerij+1=Z)cout该文法不是算符文发!endl; return;for(i=0;iZ|grammerij&grammerij!=|)if(type(grammerij)0)zhongjienum+=grammerij;/获取终结符符号zhongjienum=#;zhongjienum+1=0;x=1;for(i=0;i;elsechanshengshixy=grammerij;y+;chanshengshixy=0;x+;y=0;chanshengshi00=feizhongjie0;/将开始符号以#_#形式存入第一行产生式数组,以便优先关系构造时使用chanshengshi01=-;chanshengshi02=;chanshengshi03=#;chanshengshi04=feizhongjie0;chanshengshi05=#;chanshengshi06=0;M=x;cout转换后产生式如下:endl;for(int j=0;jx;j+)coutchanshengshijendl;cout产生式包含的终结符有:;for(i=0;i=num;i+)coutzhongjiei ;coutendl;cout产生式包含的非终结符有:;for(i=0;inumf;i+)coutfeizhongjiei ;coutendl;void fristvt()/计算firstvt集并填入FIRSTVT中int r1,x,y;for(int i=0;inumf;i+)for(int j=0;jnum;j+)FIRSTVTij=0;for(i=1;i=0)FIRSTVTr1x=1;elseif(y=0)FIRSTVTr1y=1;for(i=M;i=1;i-)int y=type(chanshengshii3);if(y0)int m=type_fei(chanshengshii0);int m1=type_fei(chanshengshii3);if(m!=m1)for(int t=0;tnum;t+)if(FIRSTVTm1t!=0)FIRSTVTmt=FIRSTVTm1t;cout非终结符的firstvt集:endl;for(i=0;inumf;i+)coutfeizhongjiei ;for(int j=0;jnum;j+)if(FIRSTVTij!=0)coutzhongjiej ;coutendl;void lastvt()/求非终结符的lastvt集int d=0, r1,x,y;for(int i=0;inumf;i+)for(int j=0;jnum;j+)LASTVTij=0;for(i=1;i=0)LASTVTr1x=1;elseif(y=0)LASTVTr1y=1;for(i=M;i=1;i-)int y=type(chanshengshii3);if(y0)int m=type_fei(chanshengshii0);int m1=type_fei(chanshengshii3);if(m!=m1)for(int t=0;tnum;t+)if(LASTVTm1t!=0)LASTVTmt=LASTVTm1t;cout非终结符的lastvt集:endl;for(i=0;inumf;i+)coutfeizhongjiei ;for(int j=0;jnum;j+)if(LASTVTij!=0)coutzhongjiej ;coutendl;void creatRelation()/创建优先关系表int a=strlen(feizhongjie),b=strlen(zhongjie),c=strlen(*chanshengshi),x,x1,y,y1,f;for(int i=0;i=c;i+)int j=strlen(chanshengshii);for(int v=3;v=0)&(y=0)Relationxy=;if(v=0&f=0&y=0&y0)for(int h=0;hb;h+) if(FIRSTVTy1h=1)Relationxh=;if(x=0)for(int g=0;g;char charcomplete(char a,char b)/优先关系比较,返回优先关系,若无返回$char ret=$;int x=type(a),y=type(b);if(x=0&y=0)ret=Relationxy;return ret;void deelSY()/剩余串向前移一位int i,j;i=strlen(SY);for(j=0;ji;j+)SYj=SYj+1;SYi-1=0;void main()int numP=0;coutnumP;cout请输入产生式:endl;for(int i=0;igrammeri;transproduct(numP);fristvt();lastvt();creatRelation();cout产生式的终结符对应的优先关系如下:endl;printRelent();/输出优先关系FILE*fp;char str20;coutstr;if(fp=fopen(str,r)=NULL;cout输入错误,请检查文件名endl;else break;fseek(fp,0,SEEK_END);int n=ftell(fp),p=0;char ch;SR=new char n;fseek(fp,0,SEEK_SET);while(ch!=EOF)ch=fgetc(fp);SRp=ch;SYp=ch;p+;char a,Q,N,B;int step=0;cout步骤t符号栈tt输入串ttt动作endl;int k=1,j=0,m=1,R,r=strlen(*chanshengshi);Sk=#;a=SRk;B=charcomplete(Sk,a);deelSY();coutsteptSkttSYtt预备=0)j=k;elsej=k-1;B=charcomplete(Sj,a);while(B=)doQ=Sj;if(type(Sj-1)=0)j-;else j=j-2;B=charcomplete(Sj,Q);while(B!=);for(int w=j+1;w=k;w+)/将Sj+1。Sk规约for(R=0;R=r;R+)for(n=3;chanshengshiRn!=0;n+)if(type(Sw)0)&type(chanshengshiRn)=0)&(type(chanshengshiRn+1)=0)&(Sw+1=chanshengshiRn+1)/(次字符为终结符)N=chanshengshiR0;/并且非终结符对应相同则用产生式的首个非终结符规约break;elseif(type(Sw)=0)/若为非终结符规约条件为栈中内容和产生式右部相同则规约if(Sw=chanshengshiRn)N=chanshengshiR0;break;k=j+1;Sk=N;step+;/步骤数加1coutstept;for(int t=1;t=k;t+)coutSt;coutttSYtt规约endl;B=charcomplete(Sj,a);if(B=|B=)k=k+1;step+;deelSY();Sk=a;if(a=#)coutstept;for(int t=1;t=k;t+)coutSt;coutttSYtt接受endl;elsecoutstept;for(int t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论