编译原理课程设计报告——表达式的小型编译器

上传人:liy****000 文档编号:115598840 上传时间:2019-11-14 格式:DOC 页数:18 大小:1.29MB
返回 下载 相关 举报
编译原理课程设计报告——表达式的小型编译器_第1页
第1页 / 共18页
编译原理课程设计报告——表达式的小型编译器_第2页
第2页 / 共18页
编译原理课程设计报告——表达式的小型编译器_第3页
第3页 / 共18页
编译原理课程设计报告——表达式的小型编译器_第4页
第4页 / 共18页
编译原理课程设计报告——表达式的小型编译器_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《编译原理课程设计报告——表达式的小型编译器》由会员分享,可在线阅读,更多相关《编译原理课程设计报告——表达式的小型编译器(18页珍藏版)》请在金锄头文库上搜索。

1、 专业: 计算机1201学生姓名:贺 茂 纯指导教师:年 轶完成时间:2019年11月13日编译技术课程设计 表达式的小型编译器一、目的1二、题目1三、要求11.词法分析12.语法分析13.代码生成24.错误处理2四、实验环境2五、系统实现21.词法分析22.语法分析43.中间代码64.错误处理8六、程序运行结果91.准确的语句分析92.错误的算术表达式13七、总结16表达式的小型编译器 3120602018一、目的是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识

2、和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、题目表达式的小型编译器三、要求1.词法分析产生语言的单词序列2.语法分析能识别由加+ ,乘* ,括号(),操作数(变量或常数)所组成的算术表达式,其文法如下:EE+T|TTT*F|FF(E)|i使用的分析方法是: LR分析法。 3.代码生成产生上述算术表达式的中间代码4.错误处理针对整个需要分析的语句,可能出现的错误,进行错误的分析指出四、实验环境1.开发环境:Visual Studio 20082.程序语言: C+五、系统实现1.词法分析 (1)单词符号表(2)状态转换图(3)数据结构(4)函数说明void

3、getonechar() /*从输入的算数表达式中读取一个字符*/void concatenation()/*将token中的字符串与character中的字符并作为token中新的字符串*/bool letter() /*判断character中的字符是否为字母的布尔函数,是则返回true,否侧返回false*/bool digit()/*判断character中的字符是否为数字的布尔函数,是则返回true,否侧返回false */void retract()/*扫描指针回退一个字符,同时将character置为空白*/intreserve() /*将token中的字符查找保留字数组,若是保

4、留字就返回它的种别编码,否则返回0*/void buildlist1()/*将标识符登录到符号表中(value2)*/void buildlist2()/*将常数登录到常数表中(value1)*/void resolve()/*词法分析的主要函数,每次识别一个单词,将种别编码放入cf中,填入对应的value1和value*/void cffx()/*词法分析,读入在a.txt输入的语句,循环执行resolve(),直到所有单词识别完毕*/2.语法分析(1)分析方法说明本程序采用LR分析法,存在4种动作:移进:使(s,a)的下一个状态s= ACTIONs,a和输入符号a进栈,下一输入符号变成现行

5、输入符号。规约: 指用某一产生式A进行规约,假若的长度为,则规约动作是去掉栈顶的个栈,即是状态Sm-变成栈顶状态,然后使(Sm-,A)的下一状态s=GOTOSm-,A和文法符号A进栈。规约的动作不改变现行输入符号,执行规约的动作意味着呈现于栈顶的符号串Xm-+1Xm是一个相对于A的句柄。接受: 宣布分析成功,停止分析器工作.报错: 报告发现源程序含有错误,调用错误处理程序.(2)文法(3)数据结构#include/*引入c+标准库*/stack status;/*状态栈*/stack sign;/*符号栈*/(4)函数说明Void initYffx() /*语法分析初始化,状态栈放0,符号栈放

6、#,语义栈放_*/Void showLR()/*遍历状态栈,符号栈,语义栈,并显示出来*/Void yffxSolve() /*查action二维数组,进行移进,规约处理*/Void yyfx()/*循环执行yffxSolve(),直到分析成功或出现错误*/Void showBlm()/*显示变量名表*/Void showCsb()/*显示常数表*/3.中间代码(1)属性文法 移进时: 如果输入的是终结符,语义栈就移进”_”,如果是非终结符,则语义栈移进对应的常数或变量名. 规约时: 如果规约对应的文法是(4)Ei时语义栈不变,对应其他文法时,先pop出栈顶3个元素,再如果是(3)E(E)文法

7、时,语义栈push刚才出栈的第二个元素,如果是(1)EE+E文法时,判断刚才出栈的第一个和第三个元素是否是常数,是则push两个常数的和,否则push临时变量Tn;如果是(1)EE*E文法时,判断刚才出栈的第一个和第三个元素是否是常数,是则push两个常数的积,否则push临时变量Tn;(2)数据结构#include/*引入c+标准库*/stackyuyi;/*语义栈*/string v1,v2,v3,v4;/*分别表示四元式的参数1,参数2,参数3,参数4*/(3)函数说明语义栈和四元式的产生是在语法分析一起的,在yffxSolve().(4)流程图4.错误处理(1)数据结构stringsh

8、owErr12 = FOUND ERROR: +前缺少变量或常量 ,/*0,e12*/ FOUND ERROR: *前缺少变量或常量 ,/*1,e11*/ FOUND ERROR: )前缺少对应( ,/*2,e10*/ FOUND ERROR: 连续的变量或常量,缺少+/* ,/*3,e9*/ FOUND ERROR: (前缺少+/* ,/*4,e8*/ FOUND ERROR: (后缺少常量或变量 ,/*5,e7*/ FOUND ERROR: ()内无表达式 ,/*6,e6*/ FOUND ERROR: +后缺少变量或常量 ,/*7,e5*/ FOUND ERROR: *后缺少变量或常量 ,

9、/*8,e4*/ FOUND ERROR: 算数表达式为空 ,/*9,e3*/ FOUND ERROR: 缺少对应) ,/*10,e2*/ FOUND ERROR: 语法分析错误 /*11,e1*/;(2)函数说明 yffxSolve()中,查action数组时,遇到e时输出错误位置和错误信息,跳过此单词,继续进行语法分析.六、程序运行结果1.准确的语句分析连加加乘混合带括号2.错误的算术表达式1)缺少操作符2)缺少操作数3)不完整的()七、总结本次编译原理上机课程设计共计1个周半,总共有三个题目供选择,然后在衡量本身水平和题目难度之后,我做了第一道题:表达式的小型编译器,即对一个给定的表达式

10、进行词法语法分析,最终给出分析过程和结果。在做这道不算难的题目的过程中,开始的代码在书中,包括LR分析表,以及中间代码四元式的产生均有例可循,于是在理解的基础上,很快就做出来了。而后,遇到的难点问题就是对表达式的错误处理。开始想通过一个公共的函数直接显示出来,经研究和具体实验之后发现是不可行的,不能够在一个短短的函数中把看似简单的错误表示清楚。然后经过大家讨论,对每一个错误,类似括号不全,算术符号缺失,操作字缺失等等这些均给出一个函数定义,在通过具体的case判断来指出所遇到的错误是哪一个,并且通过判断错误时读取的位置来得出该错误的位置。所以,最终,算是比较成功圆满地解决了本次课程设计的内容。当然,在老师的指导下,我又发现该程序不能指出所有错误,只会指示出第一个错误的缺陷,但最终研究也没有得出一个好的解决办法,因此只能遗憾放弃,希望在以后的深化学习中能解决这个问题。最后,衷心感谢在本次课程设计带给我思路和帮助的老师,同学。15

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号