ImageVerifierCode 换一换
格式:DOC , 页数:15 ,大小:92.42KB ,
资源ID:2726166      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-2726166.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理_网工0801_向前龙.doc)为本站会员(dreamzhangning)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

编译原理_网工0801_向前龙.doc

1、黄 冈 师 范 学 院提高型实验报告实验课题 编译器的实现(实验类型:综合性 设计性 应用性)实验课程 编译原理实验时间 2010 年 12 月 19 日学生姓名 向钱龙专业班级 网络 200801学 号 200826340121目录一、 课设要求 2二、 总体设计思想 3三、 详细算法设计 3四、 流程框图 4五、 函数相关说明 81. 所有函数一览 .82. void emit(char *res,char *num1,char *op,char *num2) 83. char *newTemp() .94. int merge(int p1,int p2) 95. void backpa

2、tch(int p,int t) 106. void fuzhi().107. void tiaojian(int *nChain) 118. void xunhuan() .12六、 编译器使用说明 14七、 心得与体会 14一、 课设要求用 C 语言对下述文法和单词表定义的语言设计编制一个编译器。(1)单词符号及种别表单词符号 种别编码 单词值main 1 int 2 float 3 double 4 char 5 if 6 else 7 do 8 while 9 l(l|d)* 10 内部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) dd*|) 20 二进制数

3、值表示= 21 + 22- 23 * 24 / 25 ( 26 ) 27 28 29 , 30 ; 31 32 = 33 := main() := /程序用括号括起来:=;:=|:=ID= /赋值语句用”=”号:=if /条件怎么没有括号,囧(自己加 1 个):=do while := /没有布尔运算,还算简单:= +|-:= *|/:=ID|num|()num:= ( +|-| ) 数字 *(.数字数字 * | )( e ( +|-| ) 数字数字 *|)ID:=字母 (字母|d 数字) *字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9:= |=|=|!=二、 总体设计思想采用

4、递归下降(自上而下)的语法制导翻译法。三、 详细算法设计在前两次试验的基础上改进。词法分析程序 语法分析程序 语义分析程序 编译器。不断完善,不断改进。渐变的过程。四、 流程框图图 I 主函数示意图是否为 main?调用 scanner是否为(?调用 scanner是否为)?调用 scanner调用语句块分析函数 staBlock 出错处理否否否是否为 ?调用 scanner调用语句串分析函数 staString调用 scanner是否为 ? 出错处理否否图 II 递归下降分析程序示意图图 III 语句块分析示意图调用语句分析函数 sta回溯,调用 backpatch是否为 ; ?调用 sca

5、nner调用语句分析函数 sta否出错处理图 IV 语句串分析示意图调用赋值语句分析函数 fuzhi是否为 字符串?是否为 if ?调用条件语句分析函数 tiaojian是否为 do ?调用循环语句分析函数 xunhuan图 V 语句分析示意图五、 函数相关说明1. 所有函数一览void scanner(); /扫描void lrparser(); void staBlock(int *nChain); /语句块void staString(int *nChain); /语句串void sta(int *nChain); /语句void fuzhi(); /赋值语句void tiaojian(

6、int *nChain); /条件语句void xunhuan(); /循环语句char* E(); /Expresiion 表达式char* T(); /Term 项char* F(); /Factor 因子char *newTemp(); /自动生成临时变量void backpatch(int p,int t); /回填int merge(int p1,int p2); /合并 p1 和 p2void emit(char *res,char *num1,char *op,char *num2); /生成四元式2. void emit(char *res,char *num1,char *o

7、p,char *num2)该函数的功能是生成一个三地址语句送到四元式表中。void emit(char *res,char *num1,char *op,char *num2)strcpy(fourComq.result,res);strcpy(fourComq.arg1,num1);strcpy(fourComq.opera,op);strcpy(fourComq.arg2,num2);q+;四元式表中的结构如下:structchar result10; /字符串(字符数组)char arg110; /操作数 1char opera10; /运算符char arg210; /操作数 2fou

8、rCom20; /结构体数组3. char *newTemp()该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是 T1,T2,T3,.char *newTemp()char *p;char varTemp10;p=(char *)malloc(10);kk+;itoa(kk,varTemp,10); /整数转换为字符串strcpy(p+1,varTemp);p0=T; /字符串前加 T,便于识别return p;4. int merge(int p1,int p2)该函数的功能是将以 P1,P2 为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。int merge(int

9、p1,int p2) /合并 p1 和 p2char circle,nResult;if(p2=0)nResult=p1;elsenResult=circle=p2;while(atoi(fourComcircle.result) /四元式第四个分量不为 0circle=atoi(fourComcircle.result); /strcpy(fourComcircle.result,p1);sprintf(fourComcircle.result,“%s“,p1);/目的是用 p1 的值覆盖 0return nResult; /p2 是头,p1 覆盖 0,接在 p2 后边5. void bac

10、kpatch(int p,int t)该函数的功能是把 P 所链接的每个四元式的第四区段(result 段)都回填 t。void backpatch(int p,int t) int w,circle=p;while(circle) /circle 不为 0 的时候w=atoi(fourComcircle.result); /四元式 circle 第四分量内容/strcpy(fourComcircle.result,t); /把 t 填进四元式 circle 的第四分量sprintf(fourComcircle.result,“%d“,t);circle=w; /w 记录的是链条上下一个四元式

11、,移动!return;6. void fuzhi()该函数的功能是对赋值语句进行分析。void fuzhi() /赋值语句只有 1 个操作数char res10,num10; /num 操作数if(syn=10) /字符串strcpy(res,token); /结果scanner();if(syn=21) /=scanner();strcpy(num,E();emit(res,num,“=“,“);elseprintf(“缺少=号n“);7. void tiaojian(int *nChain)该函数的功能是对条件语句进行分析。/-if()void tiaojian(int *nChain)c

12、har res10,num110,num210,op10;int nChainTemp;/-if(syn=6) /ifscanner();/strcpy(num1,E();if(syn=26) /(scanner();strcpy(num1,E();if(syn=32) switch(syn)case 32:strcpy(op,“);break;case 33:strcpy(op,“=“);break;case 34:strcpy(op,“:=do while void xunhuan()char res10,num110,num210,op10;int nChainTemp;if(syn=8

13、) /donnc=nextq; /记住 if 语句位置,emit 之后 nextq 就变了/emit(“0“,“if“,num1,“goto“); scanner();staBlock( /语句块if(syn=9) /whilescanner();if(syn=26) /(scanner();strcpy(num1,E();if(syn=32) switch(syn)case 32:strcpy(op,“);break;case 33:strcpy(op,“=“);break;case 34:strcpy(op,“);break;case 35:strcpy(op,“=“);break;cas

14、e 36:strcpy(op,“=“);break;case 37:strcpy(op,“!=“);break;default:printf(“error“);scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);nnb=nextq;emit(“0“,“if“,num1,“goto“); backpatch(nnb,nnc);nna=nextq;emit(“0“,“,“,“goto“);backpatch(nna,nextq);if(syn=27) /)scanner();六、 编译器使用说明程序提示用户输入字符串“Please

15、 input your source string:”,用户输入字符串并以“#”号结束。回车后,程序显示运行结果。七、 心得与体会试验设计过程中首先实现采用递归下降的语法制导翻译法,实现了对赋值表达式的语义分析,并生成四元式。程序语句有 3 种:赋值语句,条件语句,循环语句。而赋值语句的翻译,恰恰是最简单的。对于赋值语句的翻译,课本上有详细的讲解,有代码的简单举例。而对于条件语句(ifelse)和循环语句(dowhile ) ,课本讲解不那么详细,没有代码举例,上课时候我也没太理解老师所讲解的。然后实现了对条件语句(if 语句)的分析,并生成四元式。再次迎来了课设的第 3 个里程碑。实现了对循环语句(while 语句)的分析,并生成四元式。而且好像没有预期中困难,可能是有条件语句的铺垫吧。他们的处理方法其实很类似,也是 emit+backpatch+merge最后一步就是整合,系统测试,个人认为这次课设的机会非常宝贵,加深了我对编译器处理语言的过程的理解.而且让我体会到一门高级语言其实学起来是很容易的,而在校期间,这些计算机基础课程一定要学好!才能为将来打好基础。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报