实验二--语法分析(算符优先)(共13页).doc

上传人:飞****2 文档编号:14474132 上传时间:2022-05-04 格式:DOC 页数:13 大小:76.50KB
返回 下载 相关 举报
实验二--语法分析(算符优先)(共13页).doc_第1页
第1页 / 共13页
实验二--语法分析(算符优先)(共13页).doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《实验二--语法分析(算符优先)(共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集合的了解也更加深入。虽说这次实验有点困难,在同学和上网查阅资料和对课本的了解中,最后解决了问题,尽管有很多问题,但通过自己的思考最终完成了本次实验,在今后的学习当中,自己还有不断的学习不断的进步。专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com