您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译技术课程设计报告-词法分析、语法分析、中间代码生成
编译技术课程设计班级学号姓名指导老师年月第1页目录一、目的------------------------------------------------------------------------------------------2二、任务及要求---------------------------------------------------------------------------------2三、实验环境------------------------------------------------------------------------------------4四、实现过程说明------------------------------------------------------------------------------41.词法分析器------------------------------------------------------------------------------4(1)单词符号表------------------------------------------------------------------------4(2)数据结构---------------------------------------------------------------------------5(3)函数说明---------------------------------------------------------------------------5(4)流程图------------------------------------------------------------------------------62.语法分析器------------------------------------------------------------------------------6(1)分析方法说明---------------------------------------------------------------------6(2)文法---------------------------------------------------------------------------------6(3)数据结构---------------------------------------------------------------------------7(4)函数说明---------------------------------------------------------------------------73.中间代码生成器------------------------------------------------------------------------10(1)属性文法--------------------------------------------------------------------------10(2)数据结构--------------------------------------------------------------------------11(3)函数说明--------------------------------------------------------------------------11(4)流程图------------------------------------------------------------------------------11五、程序运行结果------------------------------------------------------------------------------12六、总结------------------------------------------------------------------------------------------16第2页一、目的编译技术是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1.词法分析器产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内码值如下表:单词符号种别编码助记符内码值while1whileif2ifelse3elseswitch4switchcase5case标识符6id符号表入口地址常数7num常数表入口地址=8=+9+*10***11**12/13/14relopMT=14relopME14relopLT=14relopLE==14relopEQ!=14relopUEQ;15;,16,(17(LB)17)RB对于这个小语言,有几点重要的限制:首先,所有的关键字(如if﹑while等)都是“保留字”。所谓的保留字的意思是,用第3页户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:if(5)=x其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为ifi0i=1;而绝对不要写成ifi0i=1;因为对于后者,我们的分析器将无条件地将ifi看成一个标识符。这个小语言的单词符号的状态转换图,如下图:2.语法分析器能识别由加+乘*乘方**括号()操作数所组成的算术表达式,其文法如下:第4页E→E+T|TT→T*F|FF→P**F|PP→(E)|i使用的算法可以是:预测分析法;递归下降分析法;LR分析法等。3.中间代码生成器产生上述算术表达式的中间代码(四元式序列)较高要求:1.扩充上述小语言的单词;2.增加语法分析器的功能,能识别条件语句和循环语句等;3.增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元式序列)4.报错基础上增加错误信息;5.将中间代码翻译成汇编语言。三、实验环境开发环境VC++;VisualStudio;Java开发环境语言C;C++;C#;Java说明:课程设计可以使用任何一种语言工具,课程设计报告中请按照自己实际采用的开发工具及技术来写。四、实现过程说明1.词法分析器(1)单词符号表单词符号种别编码助记符内码值while1whileif2ifelse3elseswitch4switchcase5case标识符6id符号表入口地址常数7num常数表入口地址=8=+9+++9+++=9+=*10***11**12/13/第5页/=13/=14relopMT=14relopME14relopLT=14relopLE==14relopEQ!=14relopUEQ;15;,16,(17(LB)17)RB!18!{20{}20}[21[]21]:22:''24''(2)数据结构用words[10]存放构成单词符号的字符串,并且用于判断是否为关键字。flags[500]存放单词符号的种别码。Number存放整数值,words[]存放标识符,关键字或者其他符号。cnt[num]按顺序存放读到的字符,为下面语义分析做准备。Status用于判断是否为关键字,1是,0不是。(3)函数说明在Scan()子函数中,先全部初始化,然后读一个字符,分析它是什么类型:如果是字母类型,则接着往下读,直到读到非字母的字符,存入words[10]中,依次对比关键字表中的元素,如果相同,则将flags[]置为相应的种别码,如果全都扫描后没发现相同的关键字,则为普通的标识符,返回主函数输出。如果是数字类型,首先分析第一个符号,接着读下一个字符串,直到读到一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字,使用辗转相乘法,每次都让number先自乘10,然后加上这个数字,这样就将字符串表示的数字转化成了相应的数,返回主函数输出。如果是其他单词表的符号,则将他们的flags[]置为相应的种别码,并将字符存到words[]中返回主函数输出。第6页(4)流程图2.语法分析器(1)分析方法说明采用递归下降分析法(2)文法E→E+T|E-T|TT→T*F|E/F|FF→P**F|PP→(E)|i改造后的文法E→TE’|TE’’E’→+TE’|εE’’→-TE’’|εT→FT’|FT’’T’→*FT’|ε第7页T’’→/FT’’|εF→PF’F’→**F|εP→(E)|i(3)数据结构与函数说明在main函数调用E()函数,如果调用之后返回时,如果((flags[temp]==0)&&is_right)为真,就输出“分析成功”,否则输出“分析失败”。其中is_right为设定的标志,初值为1,如果在调用子函数的过程中如果有错误,则置is_right为0。E函数:调用T函数,调用F函数,调用P函数,返回后看是否是’+’或’-’,如果是,则调用E1函数,再调用E2函数,如果不是,进行出错处理,置is_right为0。E1函数:判断是不是”+”或者“-”如果是,调用F函数,如果不是,进行出错处理,置is_right为0。代码:voidE(){coutE-TE''endl;T();E2();}voidE1(){if(flags[temp]==9)//加号{coutE'-+Tendl;temp++;T();}elseif(flags[temp]==12)//减号{coutE'--Tendl;temp++;T();}elseis_right=0;}voidE2(){if(flags[temp]==9||flags[temp]==12)//如果是加或减{coutE''-E'E''endl;E1();第8页E2();}elseif(flags[temp]!=0||flags[temp]!=17)//如果是非#或非{coutE''-εendl;return;}elseis_right=0;T函数:调用F函数,调用P函数,返回后看是否是’*’或’/’,如果是,则调用T1函数,再调用T2函数,如果不是,进行出错处理,置is_right为0。T1函数:判断是不是”*”或者“/”如果是,调用F函数,如果不是,进行出错处理,置is_right为0。代码:voidT(){coutT-FT''endl;F();T2();}voidT1(){if(flags[temp]==10)//乘号{coutT'-*Fendl;temp++;F();}elseif(flags[temp]==13)//除号{coutT'-/Fendl;temp++;F();}elseis_right=0;}voidT2(){if(flags[temp]==10||flags[temp]==13)//如果是乘或除第9页{coutT''-T'T''endl;T1();T2();}elseif(flags[temp]!=0||flags[temp]!=17)//如果是非#或非){cout
本文标题:编译技术课程设计报告-词法分析、语法分析、中间代码生成
链接地址:https://www.777doc.com/doc-5732037 .html