




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
黄冈师范学院提高型实验报告实验课题 编译器的实现(实验类型:综合性 设计性 应用性)实验课程编译原理实验时间 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 backpatch(int p,int t)106. void fuzhi()107. void tiaojian(int *nChain)118. void xunhuan()12六、 编译器使用说明14七、 心得与体会14一、 课设要求用C语言对下述文法和单词表定义的语言设计编制一个编译器。(1)单词符号及种别表单词符号种别编码单词值main1int 2float3double4char5if 6else 7do8while9l(l|d)*10内部字符串 ( +|-| ) d*(.dd* | )( e ( +|-| ) dd*|) 20二进制数值表示=21+22- 23* 24/ 25(26)272829,30;3132=3334=35=36!=37(2)语法结构定义 := main() := /程序用括号括起来:=;:=|:=ID= /赋值语句用”=”号:=if /条件怎么没有括号,囧(自己加1个):=do while := /没有布尔运算,还算简单 := +|- := *|/ :=ID|num|()num:= ( +|-| ) 数字*(.数字数字* | )( e ( +|-| ) 数字数字*|)ID:=字母(字母|d数字)*字母:=a|b|c|z|A|B|C|Z数字:=0|1|2|9 := |=|=|!=二、 总体设计思想采用递归下降(自上而下)的语法制导翻译法。三、 详细算法设计在前两次试验的基础上改进。词法分析程序 语法分析程序 语义分析程序 编译器。不断完善,不断改进。渐变的过程。四、 流程框图图 I 主函数示意图图 II 递归下降分析程序示意图是否为main?调用scanner是否为(?调用scanner是否为)?调用scanner调用语句块分析函数staBlock出错处理否否否图 III 语句块分析示意图是否为 ?调用scanner调用语句串分析函数staString调用scanner是否为 ?出错处理否否图 IV 语句串分析示意图调用语句分析函数sta回溯,调用backpatch是否为 ; ?调用scanner调用语句分析函数sta否出错处理图 V 语句分析示意图调用赋值语句分析函数fuzhi是否为 字符串?是否为 if ?调用条件语句分析函数tiaojian是否为 do ?调用循环语句分析函数xunhuan五、 函数相关说明1. 所有函数一览void scanner(); /扫描void lrparser(); void staBlock(int *nChain); /语句块void staString(int *nChain); /语句串void sta(int *nChain); /语句void fuzhi(); /赋值语句void tiaojian(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 *op,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; /操作数2fourCom20; /结构体数组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 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 backpatch(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记录的是链条上下一个四元式,移动!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)char 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,);break;case 35:strcpy(op,=);break;case 36:strcpy(op,=);break;case 37:strcpy(op,!=);break;default:printf(error);scanner();strcpy(num2,E();strcat(num1,op);strcat(num1,num2);/nfc=nextq+1;ntc=nextq; /记住if语句位置emit(0,if,num1,goto); nfc=nextq; /if中表达式为假emit(0,goto);/第一个0已回填backpatch(ntc,nextq); /ntc链接的所有四元式都回填nextqif(syn=27) /)scanner();staBlock(&nChainTemp); /语句块*nChain=merge(nChainTemp,nfc);8. void xunhuan()该函数的功能是对循环语句进行分析。/:=do while void xunhuan()char res10,num110,num210,op10;int nChainTemp;if(syn=8) /donnc=nextq; /记住if语句位置,emit之后nextq就变了/emit(0,if,num1,goto); scanner();staBlock(&nChainTemp); /语句块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;case 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 input your source string:”,用户输入字符串并以“#”号结束。回车后,程序显示运行结果。七、 心得与体会 试验设计过程中首先实现采用递归下降的语法制导翻译法,实现了对赋值表达式的语义分析,并生成四元式。程序语句有3种:赋值语句,条件语句,循环语句。而赋值语句的翻译,恰恰是最简单的。对于赋值语句的翻译,课本上有详细的讲解,有代码的简单举例。而对于条件语句(ifelse)和循环语句(dowhile),课本讲解不那么详细,没有代码举例,上课时候我也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城管执法专业试题及答案
- 河南省濮阳市华龙区濮阳第一高级中学2025-2026学年高二上学期开学摸底检测英语试卷(含答案)
- 河北省衡水市桃城区2025-2026学年高二上学期暑假开学考试化学试题(含答案)
- 安徽省九师联盟2026届高三9月开学联考英语(含答案)
- 河北省邯郸市第十中学2024-2025学年七年级上学期期末考试数学试卷(含答案)
- 广西钦州市第四中学2025-2026学年高三上学期开学考试数学试卷(含答案)
- 广东省深圳实验学校高中园2025-2026学年高三上学期9月统测(开学)物理试卷(含答案)
- 宁夏建筑消防方案设计资质
- 安徽省江淮名校2024-2025学年高二上学期期中考试化学试卷(含答案)
- 保险业数字化风险管理解决方案与应用技术案例研究
- 《测绘基础》课件(共八个任务)
- 物业轮岗活动方案
- 高一学生手册考试试题及答案
- 妊娠滋养细胞肿瘤护理查房
- 廉政参观活动方案
- 律师事务所客户数据安全管理制度
- 孕妇学校健康教育课件
- 中国大麻酚油(CBD油)行业发展监测及投资战略研究报告
- 医务人员艾滋病知识培训
- 《工业机器人技术与应用》高职人工智能技术应用专业全套教学课件
- 图书馆培训管理制度
评论
0/150
提交评论