免费预览已结束,剩余2页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
燕山大学里仁学院计算机课程设计编译原理课程设计一、设计要求可根据自己实际情况,选择以下一项作为分析算法的输入:(1)直接输入根据己知文法构造的LR(0)分析表。(2)输入已知文法的项目集规范族和转换函数,由程序自动生成LR(0)分析表。(3)输入已知文法,由程序自动生成LR(0)分析表。二、设计目的设计、编制和调试一个具体的LR(0)语法分析程序,加深对语法分析的理解。三、算法描述直接输入根据已知文法构造的LR(0)分析表。文法如下: (0)S-E(1)E-aA(2)E-bB(3)A-c(4)B-cB(5)B-d#include #include #include #define stack_size 20#define stackincrement 10int p=0,q=0,zh,sh,x;char Vn3=E,A,B; /非终结符char Vt6=a,b,c,d,#; /终结符typedef struct char *bottom; char *top; int size;/char datastack_size;stack;int Initstack(stack &s) /初始化栈 s.bottom=(char *)malloc(stack_size*sizeof(char); if(!s.bottom) exit(-1); s.top=s.bottom; s.size=stack_size; return(1);int push(stack &s,char e) /入栈/int i; if(s.top-s.bottom=s.size) s.bottom=(char *)realloc(s.bottom,(stack_size+stackincrement)*sizeof(char); if(!s.bottom) exit(-1); s.top=s.bottom+s.size; s.size+=stackincrement; *s.top+=e; coute进s栈; / s.datax=e; / /x+;/输出所有元素/ for(i=0;ix;i+)cout=s.size) s.bottom=(char *)realloc(s.bottom,(stack_size+stackincrement)*sizeof(char); if(!s.bottom) exit(-1); s.top=s.bottom+s.size; s.size+=stackincrement; *s.top+=e; coute进t栈; return(1);int pop(stack &s,char *e) /出栈 if(s.top=s.bottom) return(0); *e=*-s.top; cout*e出s栈 ; return(1);int pop2(stack &s,int *e) /出栈 if(s.top=s.bottom) return(0); *e=*-s.top; cout*e出t栈 ; return(1);int action(int m,int n,char a) /ACTION表 int i; int act105=2,3,0,0,0,0,0,0,0,20, 0,0,5,0,0,0,0,7,8,0,11,11,11,11,11, 13,13,13,13,13,12,12,12,12,12,0,0,7,0,0, 15,15,15,15,15,14,14,14,14,14 ; for(i=0; in; i+) if(a=Vti) break; if(i=n&a!=Vtn-1)return(0); else zh=actmi; /if(zh=0)cout出错endl; /else return(zh); return(zh); int go(int m,int n,char a) /goto表int i;int go103=1,0,0,0,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0 ; for(i=0; in; i+) if(a=Vni) break; if(i=n&a!=Vnn-1)return(0); else sh=gomi; /if(sh=0)cout出错; /else return(sh); return(sh); void main() char ch,y; int x,v,e,u,ok=1; int i=0,index=0,k; char st20; stack s; stack t; cout 输入要分析的字符串(end by ;):st0; while(sti!=;) i+; cinsti; Initstack(s); Initstack(t); push(s,#); push2(t,0); coutt; while(ok=1) ch=stindex; index+; coutendlch分析; if(ch=;) ok=0;break; y=ch; couty=yt; /y是终结符 pop2(t,&q); /这两句主要是为了得到当前的q值 push2(t,q); coutq=qt; /q是09的数字 u=action(q,6,y); coutu=u0&action(q,6,y)10&action(q,6,y)20) switch(zh) case 11: for(i=0;i5;i+)pop(s,&y);pop2(t,&x); push(s,S); pop2(t,&e); push2(t,e); go(e,3,S); /查询GOTO表 push2(t,sh); /替换后的数字 index-; break; case 12: pop(s,&y);pop2(t,&x); push(s,A); pop2(t,&e); push2(t,e); go(e,3,A); push2(t,sh); index-; break; case 13: pop(s,&y); pop(s,&y); pop2(t,&x); pop2(t,&x); push(s,A); pop2(t,&e); push2(t,e); go(e,3,A); push2(t,sh); index-; break; case 14: pop(s,&y);pop2(t,&x); push(s,B); pop2(t,&e); push2(t,e); go(e,3,B); push2(t,sh); index-; break; if(action(q,6,y)=20)cout分析成功endl;ok=0;else if(u=0)cout出错endl;break; 四、程序结构 先设计直接输入LR(0)分析表,即ACTION和GOTO表。最后主程序中输入要分析的字符串,利用直接输入的分析表对字符串进行分析。五、心得和体会通过这次课程设计,使我对编译原理这门课程有了更深一步的了解,尤其是基于LR(0)方法的语法分析这部分知识。知
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 悬挑卸料平台安装方案
- 具身智能+工业制造自适应装配流程研究报告
- 物业社区安全提升方案可行性报告
- 地铁隧道与地面建筑交叉作业协调方案
- 具身智能+老年人认知能力退化早期筛查方案可行性报告
- 施工方案审批流程操作手册
- 现浇梁板施工方案设计
- 机场航站楼模块化建造方案
- 施工方案设计里一般方案与专项方案的构成差异
- 烟囱爬梯施工组织管理方案
- 2025浙江绍兴北站站区综合管理服务中心招聘辅助人员92人考试笔试备考试题及答案解析
- 2025年人工智能发展态势报告:智能体、创新与转型
- 杂志代理授权协议书模板
- 公司内部控制制度及操作流程手册
- 医院与药企合作战略框架协议书模板
- 安徽省A10联盟2024-2025学年高二上学期11月期中考试生物试题含答案
- 手术麻醉入科教育
- 计算与人工智能概论(湖南大学信息科学与工程学院)学习通网课章节测试答案
- 西游记第4回课件
- 《3-6岁儿童学习与发展指南》附全文
- 品管圈PDCA改善案例-降低住院患者跌倒发生率
评论
0/150
提交评论