《实验二--语法分析(算符优先)(共13页).doc》由会员分享,可在线阅读,更多相关《实验二--语法分析(算符优先)(共13页).doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上 华北水利水电大学 North China Institute of Water Conservancy and Hydroelectric Power 编译原理实验二 词法分析院 系 信息工程 专 业 计算机科学与技术 姓 名 学 号 指导教师 实验二 语法分析算符优先分析程序1实验要求 选择最有代表性的语法分析方法算符优先法; 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 实习时间为4学时。2实验内容及要求(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关
2、系表 输出到显示器或者输出到文件);(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)(3)给定表达式文法为: G(E): E#E#EE+T | TTT*F |FF(E)|i(4)分析的句子为: (i+i)*i和i+i)*i实验源码: #include#include#include#define MAX 100char *SR;char SYMAX;char SMAX;char grammer1030;char chanshengshi2010;char feizhongjie10;char zhongjie15;int numf=0;int nu
3、m=0;int M=0;char Relation66;int FIRSTVT36;int LASTVT36;void fristvt();int type(char s)int 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;v
4、oid 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;/获取终结符符
5、号 zhongjienum=#;zhongjienum+1=0; x=1;for(i=0;i;else chanshengshixy=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+) coutchan
6、shengshijendl; cout产生式包含的终结符有:;for(i=0;i=num;i+) coutzhongjiei ; coutendl; cout产生式包含的非终结符有:; for(i=0;inumf;i+) coutfeizhongjiei ; coutendl;void fristvt() 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;else if(y=0) FIRSTVTr1y=1; for(i=M;i=1;i-)int y=type(
7、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()int d=0,
8、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非终结符的
9、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(
10、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; cou
11、t请输入产生式:endl; for(int i=0;igrammeri; transproduct(numP);fristvt(); lastvt(); creatRelation(); cout产生式的终结符对应的优先关系如下:endl;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); whil
12、e(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; else j=k-1; B=charcomplete(Sj,a); while(B=) do Q=Sj; if(type(Sj-1)=0) j-; else j=j-2;B=charco
13、mplete(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; else if(type(Sw)=0)if(Sw=chanshengshiRn) N=chanshengshiR0; break; k=j+1; Sk=N; step
14、+;/步骤数加1 coutstept;for(int t=1;t=k;t+)coutSt; coutttSYtt规约endl;if(B=|B=) k=k+1; step+; deelSY(); Sk=a; if(a=#) coutstept;for(int t=1;t=k;t+)coutSt;coutttSYtt接受endl;else coutstept;for(int t=1;t=k;t+)coutSt;coutttSYtt移进endl; else cout错误!endl;while(a!=#);cout语法分析结束!endl;实验截图:输入产生式规则:实验心得: 通过本次实验我对算符优先分析有了初步的了解,同时也对编译原理这门课程有了更深的认识,所谓算符优先分析其实就是定义算符之间确切的说总结符之间的某种优先关系,借助这种关系我们可以找出可归约串和进行规约;同时对过first和last集合的了解也更加深入。虽说这次实验有点困难,在同学和上网查阅资料和对课本的了解中,最后解决了问题,尽管有很多问题,但通过自己的思考最终完成了本次实验,在今后的学习当中,自己还有不断的学习不断的进步。专心-专注-专业