资源描述:
《编译原理课程设计报告——表达式的小型编译器》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、专业:计算机1201学生姓名:贺茂纯指导教师:年轶完成时间:2021年8月31日编译技术课程设计——表达式的小型编译器一、目的1二、题目1三、要求11.词法分析12.语法分析13.代码生成24.错误处理2四、实验环境2五、系统实现21.词法分析22.语法分析43.中间代码64.错误处理8六、程序运行结果91.准确的语句分析92.错误的算术表达式13七、总结16表达式的小型编译器3120602018一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语
2、义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、题目表达式的小型编译器三、要求1.词法分析产生语言的单词序列2.语法分析能识别由加+,乘*,括号(),操作数(变量或常数)所组成的算术表达式,其文法如下:E→E+T
3、TT→T*F
4、FF→(E)
5、i使用的分析方法是:LR分析法。15表达式的小型编译器31206020183.代码生成产生上述算术表达式的中间代码4.错误处理针对整个需要分析的语句,可能出现的错误,进行错误的分析指出四、实验环境1.开发环境:VisualStudio20082.程序
6、语言:C++五、系统实现1.词法分析(1)单词符号表15表达式的小型编译器3120602018(2)状态转换图(3)数据结构(4)函数说明voidgetonechar()/*从输入的算数表达式中读取一个字符*/voidconcatenation()/*将token中的字符串与character中的字符并作为token中新的字符串*/boolletter()/*判断character中的字符是否为字母的布尔函数,是则返回true,否侧返回false*/booldigit()/*判断character中的字符是否为数字15表达式的小型编译器3120602018的布
7、尔函数,是则返回true,否侧返回false*/voidretract()/*扫描指针回退一个字符,同时将character置为空白*/intreserve()/*将token中的字符查找保留字数组,若是保留字就返回它的种别编码,否则返回0*/voidbuildlist1()/*将标识符登录到符号表中(value2[])*/voidbuildlist2()/*将常数登录到常数表中(value1[])*/voidresolve()/*词法分析的主要函数,每次识别一个单词,将种别编码放入cf[]中,填入对应的value1[]和value[]*/voidcffx()
8、/*词法分析,读入在a.txt输入的语句,循环执行resolve(),直到所有单词识别完毕*/2.语法分析(1)分析方法说明本程序采用LR分析法,存在4种动作:①移进:使(s,a)的下一个状态s’=ACTION[s,a]和输入符号a进栈,下一输入符号变成现行输入符号。②规约:指用某一产生式A→β进行规约,假若β的长度为γ,则规约动作是去掉栈顶的γ个栈,即是状态Sm-γ变成栈顶状态,15表达式的小型编译器3120602018然后使(Sm-γ,A)的下一状态s’=GOTO[Sm-γ,A]和文法符号A进栈。规约的动作不改变现行输入符号,执行规约的动作意味着呈现于栈顶
9、的符号串Xm-γ+1…Xm是一个相对于A的句柄。③接受:宣布分析成功,停止分析器工作.④报错:报告发现源程序含有错误,调用错误处理程序.(2)文法(3)数据结构15表达式的小型编译器3120602018#include/*引入c++标准库*/stackstatus;/*状态栈*/stacksign;/*符号栈*/(4)函数说明VoidinitYffx()/*语法分析初始化,状态栈放0,符号栈放#,语义栈放_*/VoidshowLR()/*遍历状态栈,符号栈,语义栈,并显示出来*/VoidyffxSolve()/*查actio
10、n二维数组,进行移进,规约处理*/Voidyyfx()/*循环执行yffxSolve(),直到分析成功或出现错误*/VoidshowBlm()/*显示变量名表*/VoidshowCsb()/*显示常数表*/3.中间代码(1)属性文法①移进时:如果输入的是终结符,语义栈就移进”_”,如果是非终结符,则语义栈移进对应的常数或变量名.②规约时:如果规约对应的文法是(4)E→i时语义栈不变,对应其他文法时,先pop出栈顶3个元素,再如果是(15表达式的小型编译器31206020183)E→(E)文法时,语义栈push刚才出栈的第二个元素,如果是(1)E→E+E文法时,
11、判断刚才出栈的第一个和第三个元素是否是