编译技术课程设计报告

上传人:dus****log 文档编号:74314566 上传时间:2022-04-13 格式:DOC 页数:10 大小:79KB
收藏 版权申诉 举报 下载
编译技术课程设计报告_第1页
第1页 / 共10页
编译技术课程设计报告_第2页
第2页 / 共10页
编译技术课程设计报告_第3页
第3页 / 共10页
资源描述:

《编译技术课程设计报告》由会员分享,可在线阅读,更多相关《编译技术课程设计报告(10页珍藏版)》请在装配图网上搜索。

1、编译技术课程设计班 级 软件1001学 号 姓 名 指导老师 2013年 6 月目 录一、目的2二、任务及要求2三、实验环境4四、实现过程说明41.词法分析器4(1)单词符号表4(2)数据结构4(3)函数说明5(4)流程图52.语法分析器7(1)分析方法说明7(2)文法7(3)数据结构9(4)函数说明103.中间代码生成器10(1)属性文法10(2)数据结构10(3)函数说明11(4)流程图11五、程序运行结果12六、总结19一、目的是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报

2、错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1 词法分析器 产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内码值如下表:单词符号种别编码助记符内码值while1whileif2ifelse3elseswitch4switchcase5case标识符6id符号表入口地址常数7num常数表入口地址=8=+9+*10*11*-12-/13/14relopMT=14relopME14relopLT0 i= 1;而绝对不要写成 ifi0 i=1;因为对于后者,我们的分析器将无条件地将ifi看成一个标识

3、符。这个小语言的单词符号的状态转换图,如下图:2 语法分析器 能识别由加+ 乘* 乘方* 括号()操作数所组成的算术表达式,其文法如下:EE+T|TTT*F|FFP*F|PP(E)|i使用的算法可以是:预测分析法;递归下降分析法;LR分析法等。3 中间代码生成器 产生上述算术表达式的中间代码(四元式序列)较高要求:1 扩充上述小语言的单词;2 增加语法分析器的功能,能识别条件语句和循环语句等;3 增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元式序列)4 报错基础上增加错误信息;5 将中间代码翻译成汇编语言。三、实验环境 开发环境:VisualStadio2010 语言:C

4、+四、实现过程说明1.词法分析器(1)单词符号表&18Op-|19Op-/* 若对单词扩充需给出单词符号表 */(2) 数据结构词法分析程序主要通过使用scaner()函数对用户输入的语句进行单词符号的分析,然后以(单词符号,种别编码)的二元式形式输出,在函数中使用到的表主要有如下:符号表:list1;/存放标示符常数表:list2;/存放数字/* 单词的二元式、符号表、常数表等 */* 若定义类,给出类图及说明 */(3) 函数说明 Scaner函数从左到右依次对输入的语句进行分析,每次读员工字符,分析它是什么类型:如果是字母类型,则接着 往下读,如果是字母或数字,则把第一个和第二个字符连起

5、来放在token数组中,将他们依次对比关键字表中的元素,如果相同,把sny中置相应的种别编码,如果不同,则字符为标示符,则将标示符放入list1表中;若读到数字,首先分析第一个符号,接着读下一个字符串,直到读到一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字,使用辗转相乘法,每次都让number先自乘10,然后加上这个数字,这样就将字符串表示的数字转化成了相应的数,返回主函数输出,则将数字放入list2表中;如果是其他单词表的符号,则将他们的sny置为相应的种别码。(4) 流程图 开始 主流程图 定义关键字表请用户输入语句读入用户输入的字符串 调用扫描程序 调出单词二院组N

6、 输入串结束结束Y 变量初始化 读取下一个字符标识符词法分析流程图Y 是否为字母N 拼成标示符 Sny为6是否为关键字NNSny为对应关键字的种别编码 返回 变量初始化数字词法分析流程图 读取下一个字符拼成数字 是否为数字Sny置7返回开始其他符词法分析流程图 读取下一个字符Y是否需要继续读 入N返回将sny置相应的种别编码2.语法分析器(1)分析方法说明语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该语言的一个句子。程序采用的是递归下降分析法,这是一种自上而下的分析方法,文法的每个非终结符对应一个递归过程。分析过

7、程就是从文法开始符号出发执行一组递归过程,这样向下推导直到推出句子;或者从跟节点出发,自上而下输入串寻找一个最左匹配序列,建立一棵语法树。/* 预测分析法;递归下降分析法;LR分析法 */(2) 文法文法:EE+T|TTT*F|FFF-P|P*F|PP(E)|i改造后的文法:ETEE+TETFTT*FFFP*FFFPFF-PFP(E)Pi递归子程序:void match(int t)if(lookahead=t)lookahead=nexttoken();elseerror1();void E()T();E();void E()if(lookahead=+)match(+);T();E();v

8、oid T()F();T();void T()if(lookahead=*)match(*);F();F();else error();void F()P();if(lookahead=*)if(lookahead=*)F();F();elseF();void F()if(lookahead=-)P();F();else error();void P()if(lookahead=()match();E();if(lookahead=)match();else if(lookahead=i)match(i);else error();(3) 数据结构语法分析是在词法分析的基础上加上判断是否符合语

9、法规则的语句。语法分析的基本任务是使用词法分析的结果,使用递归下降算法分析是否符合语法规则,如果符合,则输出“分析成功”,若果不符合,则输出“分析失败”。(4) 函数说明S()函数:判断语句第一个标示符是否为关键字while或者if,即语句为while型或if型语句;A()函数:判断是否有逻辑关系表达式,并调Op()和B()函数;Op()函数:判断逻辑关系为& 还是|;B()函数:若右边产生式为一个大小判断语句,调用E()函数、relop()函数、E()函数;relop()函数:识别是六种大小判断符号的哪一种;E()函数:调用T()函数和E1()函数;E1()函数:识别左边有+号的表达式,并调

10、用T()函数和E1()函数,这里有递归调用;T()函数:调用F()函数和T1()函数;T1()函数:识别左边有*号的表达式,并调用F()函数和T1()函数,这里有递归调用;F()函数:主要用来识别*运算的表达式,并调用P()函数;P()函数:识别含终结i的产生式,识别含()的产生式;error1()函数:输出语法分析错误;3.中间代码生成器(1)属性文法 产生式 语义规则 SE print(E.val)EE(1)+T E.val=E(1).val+T.val ET E.val=T.valTT(1)*F T.val=T(1).valTF T.val=F.valFF(1)-P F.val=F(1)

11、.val-P.valFP*F(1) F.val=P.val*F(1).valFP F.val=P.valP(E) P.val=E.valPi P.val=i.lexval(2) 数据结构 二位数组(第二维有四个区段,分别存放对应字符在符号表中的下标)int e204; (3) 函数说明递归子程序:S1()函数:语义分析主函数,主要用来分析是while型语句还是if型语句A1()函数:Op1()函数:B1()函数:Relop1()函数:E2()函数:T2()函数:F1()函数:P1()函数:Error2()函数:Scaner1()函数:扫描数组中存放的下一个字符;Emit(a,b,c,d)函数:

12、产生四元式;Newtemp()函数:新建员工参数;Merge(p1,p2)函数:把以p1,和p2为链首的两条链合并为以p2为首的链(返回链首值p2);Backpatch(p,t)函数:把链首p所链接的每个四元式的第四区段都改写为地址t;Show()函数:输入对应的四元式序列;(4) 流程图输出分析成功 调用语义分析函数表达式中是否有括号NY 处理括号内的 处理乘方、加减乘 产生四元式五、程序运行结果 将关键字定义为标示符,报错;如 if=3;# ifi0 i=1;分析器将无条件地将ifi看成一个标识符。 能识别条件语句和循环语句,如if else和while,增加了新单词&,能识别由加+ 乘*

13、 乘方* 括号()操作数所组成的算术表达式,生成四元式序列;如while(a0&b0) if(xy) m=m+m*2; else m=m*2;# 新加了单词|, If(ab|cd) m=m+1; else m=m+2;#报错基础上增加错误信息;If(x0) m=m+1#六、 总结本次课设的内容涵盖了词法分析、语法分析、语义分析、中间代码的生成和目标代码生成五个部分。可以说涵盖了编译原理这学期所学的绝大部分内容。没有平时认真学习、经验总结的前提,是无法胜任本次的课设的。它也更巩固了我们平时所学的知识,加深我们对编译原理的认识。编译原理是一门很抽象的学科,它的入门很难。我也记得我在本书的第二章花了

14、大量的时间自己看书学习才最终理解。如果平时上课不好好听老师将,在临考前才抱佛脚是不可能考出好成绩的,而且,你还得花大量的时间。虽然本次实验做完了,但 我还是对某些东西认识很模糊。在课上学习的是一些理论的知识,只有去实践了才能把知识变为自己的;在实践中不断发现问题,发现自己的不足,然后去解决问题,完善自己的不足,使自己对知识的把捉更加自信。本次实验的代码因为之前做过俩次实验了,词法分析和语法分析都是之前的,而这次多出的语义分析我是参考了同学的 ,但自己也都理解了每个函数的意思。比较遗憾自己没有把主要的函数编写出来,我想自己在编程方面还是有待好好的提高的。老师不反对“拿来主义”,但必须自己要完全理解,不然做这个课设也就没有了意义,课设就是为了锻炼我们的编程能力,我想,个人的编程能力以后能在很大的程度上决定我们工作的薪酬。所以在这个暑假也要 好好的练练编程。毕竟自己的短期目标还是要考研的,而考研的学校还是要求复试要上机的;而从长远来看,以后工作的头几年也就只能当个程序员之类的,没有很好的编程能力如何养家糊口。最后在这里感谢任课老师对我们的教导。 注意:1.课程设计报告着重说明个人所做工作、成果和体会,报告不得与他人雷同,否则影响成绩,严重者无成绩。2.课程设计报告无须加入完整的程序源代码。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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