编译原理课程设计报告.docx
- 文档编号:5128649
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:15
- 大小:722.64KB
编译原理课程设计报告.docx
《编译原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
编译原理课程设计报告
专业:
计算机1201
学生姓名:
贺茂纯
指导教师:
年轶
完成时间:
2018年10月31日
编译技术课程设计
——表达式的小型编译器
一、目的1
二、题目1
三、要求1
1.词法分析1
2.语法分析1
3.代码生成2
4.错误处理2
四、实验环境2
五、系统实现2
1.词法分析2
2.语法分析4
3.中间代码6
4.错误处理8
六、程序运行结果9
1.准确的语句分析9
2.错误的算术表达式13
七、总结16
一、目的
<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
二、题目
表达式的小型编译器
三、要求
1.词法分析
产生语言的单词序列
2.语法分析
能识别由加+,乘*,括号(),操作数(变量或常数)所组成的算术表达式,其文法如下:
E→E+T|T
T→T*F|F
F→(E)|i
使用的分析方法是:
LR分析法。
3.代码生成
产生上述算术表达式的中间代码
4.错误处理
针对整个需要分析的语句,可能出现的错误,进行错误的分析指出
四、实验环境
1.开发环境:
VisualStudio2008
2.程序语言:
C++
五、系统实现
1.词法分析
(1)单词符号表
(2)状态转换图
(3)数据结构
(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()/*词法分析,读入在a.txt输入的语句,循环执行resolve(),直到所有单词识别完毕*/
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)文法
(3)数据结构
#include
stack
stack
(4)函数说明
VoidinitYffx()/*语法分析初始化,状态栈放0,符号栈放#,语义栈放_*/
VoidshowLR()/*遍历状态栈,符号栈,语义栈,并显示出来*/
VoidyffxSolve()/*查action二维数组,进行移进,规约处理*/
Voidyyfx()/*循环执行yffxSolve(),直到分析成功或出现错误*/
VoidshowBlm()/*显示变量名表*/
VoidshowCsb()/*显示常数表*/
3.中间代码
(1)属性文法
①移进时:
如果输入的是终结符,语义栈就移进”_”,如果是非终结符,则语义栈移进对应的常数或变量名.
②规约时:
如果规约对应的文法是(4)E→i时语义栈不变,对应其他文法时,先pop出栈顶3个元素,再如果是(3)E→(E)文法时,语义栈push刚才出栈的第二个元素,如果是
(1)E→E+E文法时,判断刚才出栈的第一个和第三个元素是否是常数,是则push两个常数的和,否则push临时变量Tn;如果是
(1)E→E*E文法时,判断刚才出栈的第一个和第三个元素是否是常数,是则push两个常数的积,否则push临时变量Tn;
(2)数据结构
#include
stack
stringv1,v2,v3,v4;/*分别表示四元式的参数1,参数2,参数3,参数4*/
(3)函数说明
语义栈和四元式的产生是在语法分析一起的,在yffxSolve().
(4)流程图
4.错误处理
(1)数据结构
stringshowErr[12]=
{{"FOUNDERROR:
+前缺少变量或常量"},/*0,e12*/
{"FOUNDERROR:
*前缺少变量或常量"},/*1,e11*/
{"FOUNDERROR:
)前缺少对应("},/*2,e10*/
{"FOUNDERROR:
连续的变量或常量,缺少+/*"},/*3,e9*/
{"FOUNDERROR:
(前缺少+/*"},/*4,e8*/
{"FOUNDERROR:
(后缺少常量或变量"},/*5,e7*/
{"FOUNDERROR:
()内无表达式"},/*6,e6*/
{"FOUNDERROR:
+后缺少变量或常量"},/*7,e5*/
{"FOUNDERROR:
*后缺少变量或常量"},/*8,e4*/
{"FOUNDERROR:
算数表达式为空"},/*9,e3*/
{"FOUNDERROR:
缺少对应)"},/*10,e2*/
{"FOUNDERROR:
语法分析错误"}/*11,e1*/};
(2)函数说明
yffxSolve()中,查action数组时,遇到e时输出错误位置和错误信息,跳过此单词,继续进行语法分析.
六、程序运行结果
1.准确的语句分析
连加
加乘混合
带括号
2.错误的算术表达式
1)缺少操作符
2)缺少操作数
3)不完整的()
七、总结
本次编译原理上机课程设计共计1个周半,总共有三个题目供选择,然后在衡量本身水平和题目难度之后,我做了第一道题:
表达式的小型编译器,即对一个给定的表达式进行词法语法分析,最终给出分析过程和结果。
在做这道不算难的题目的过程中,开始的代码在书中,包括LR分析表,以及中间代码四元式的产生均有例可循,于是在理解的基础上,很快就做出来了。
而后,遇到的难点问题就是对表达式的错误处理。
开始想通过一个公共的函数直接显示出来,经研究和具体实验之后发现是不可行的,不能够在一个短短的函数中把看似简单的错误表示清楚。
然后经过大家讨论,对每一个错误,类似括号不全,算术符号缺失,操作字缺失等等这些均给出一个函数定义,在通过具体的case判断来指出所遇到的错误是哪一个,并且通过判断错误时读取的位置来得出该错误的位置。
所以,最终,算是比较成功圆满地解决了本次课程设计的内容。
当然,在老师的指导下,我又发现该程序不能指出所有错误,只会指示出第一个错误的缺陷,但最终研究也没有得出一个好的解决办法,因此只能遗憾放弃,希望在以后的深化学习中能解决这个问题。
最后,衷心感谢在本次课程设计带给我思路和帮助的老师,同学。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 报告
