您好,欢迎访问三七文档
编译技术课程设计班级学号姓名指导老师2015年6月第1页目录一、目的...........................................................................................................................................2二、题目...........................................................................................................................................2三、要求...........................................................................................................................................21.词法分析........................................................................................................................22.语法分析........................................................................................................................23.代码生成........................................................................................................................24.错误处理........................................................................................................................2四、实验环境...................................................................................................................................31.开发环境:.......................................................................................................................32.程序语言:.......................................................................................................................3五、系统实现...................................................................................................................................31.词法分析........................................................................................................................32.语法分析........................................................................................................................53.中间代码........................................................................................................................64.错误处理......................................................................................................................11六、程序运行结果.........................................................................................................................121.连乘..............................................................................................................................122.连加..............................................................................................................................123.加乘混合......................................................................................................................134.带括号..........................................................................................................................135.常数..............................................................................................................................146.错误的算术表达式......................................................................................................14七、总结.........................................................................................................................................16第2页一、目的编译技术是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、题目题目1表达式的小型编译器三、要求1.词法分析产生语言的单词序列2.语法分析能识别由加+乘*括号()操作数(变量或常数)所组成的算术表达式,其文法如下:E→E+T|TT→T*F|FF→(E)|i使用的分析方法可以是:递归下降分析法或LR分析法。3.代码生成产生上述算术表达式的中间代码4.错误处理给出错误信息输入:算术表达式输出:符号表,常数表。归下降分析法:递归调用过程/LR分析法:语义栈和符号栈四元式序列第3页四、实验环境1.开发环境:VisualStudio20132.程序语言:C++五、系统实现1.词法分析(1)单词符号表单词符号种别编码内码值标识符6标识符本身的字符串常数7常数本身的值+8+*10*(14()15)#16#第4页(2)状态转换图0开始字母1空白字母或数字非字母或数字2数字3数字非数字4567+*#(3)数据结构intcf[]词法分析后的种别编码intvalue1[]若种别编码为常数,此数组存放常数值,其他为空stringvalue2[]若种别编码为标识符,此数组存放标识符名,其他为空(4)函数说明voidgetonechar()/*从输入的算数表达式中读取一个字符*/voidconcatenation()/*将token中的字符串与character中的字符并作为token中新的字符串*/boolletter()/*判断character中的字符是否为字母的布尔函数,是则返回true,否侧返回false*/booldigit()/*判断character中的字符是否为数字的布尔函数,是则返回true,否侧返回false*/voidretract()/*扫描指针回退一个字符,同时将character置为空白*/intreserve()/*将token中的字符查找保留字数组,若是保留字就返回它的种别编码,否则返回0*/voidbuildlist1()/*将标识符登录到符号表中(value2[])*/voidbuildlist2()/*将常数登录到常数表中(value1[])*/voidresolve()/*词法分析的主要函数,每次识别一个单词,将种别编码放入cf[]中,填入对应的value1[]和value[]*/voidcffx()/*词法分析,读入输入的算数表达式,循环执行resolve(),第5页直到所有单词识别完毕*/2.语法分析(1)分析方法说明本程序采用LR分析法,存在4种动作:①移进:使(s,a)的下一个状态s’=ACTION[s,a]和输入符号a进栈,下一输入符号变成现行输入符号.②规约:指用某一产生式A→β进行规约,假若β的长度为γ,则规约动作是去掉栈顶的γ个栈,即是状态Sm-γ变成栈顶状态,然后使(Sm-γ,A)的下一状态s’=GOTO[Sm-γ,A]和文法符号A进栈.规约的动作不改变现行输入符号,执行规约的动作意味着呈现于栈顶的符号串Xm-γ+1…Xm是一个相对于A的句柄.③接受:宣布分析成功,停止分析器工作.④报错:报告发现源程序含有错误,调用错误处理程序.(2)文法GOTOi+*()#E0S3S211S4S5acc2S3S263r4r4r4r44S3S275S3S286S4S5S97r1S5r1r18r2r2r2r29r3r3r3r3状态ACTION第6页I0:S·EE·E+EE·E*EE·(E)E·iI1:SE·EE·+EEE·*EEI4:EE+·EE·E+EE·E*EE·(E)E·i+I7:EE+E·EE·*EEE·+EEI2:E(·E)E·E+EE·E*EE·(E)E·i(I5:EE*·EE·E+EE·E*EE·(E)E·iI8:EE*E·EE·*EEE·+EE(*(*I6:E(E·)EE·*EEE·+EEI9:E(E)·I3:Ei·iii)i**(3)数据结构#includestack/*引入c++标准库*/stackintstatus;/*状态栈*/stackcharsign;/*符号栈*/(4)函数说明VoidinitYffx()/*语法分析初始化,状态栈放0,符号栈放#,语义栈放_*/VoidshowLR()/*遍历状态栈,符号栈,语义栈,并显示出来*/VoidyffxSolve()/*查action二维数组
本文标题:编译原理课设
链接地址:https://www.777doc.com/doc-6029007 .html