基于GUI的交互式编译系统之中间代码生成器的设计与实现毕业论文设计.docx
《基于GUI的交互式编译系统之中间代码生成器的设计与实现毕业论文设计.docx》由会员分享,可在线阅读,更多相关《基于GUI的交互式编译系统之中间代码生成器的设计与实现毕业论文设计.docx(54页珍藏版)》请在咨信网上搜索。
1、 基于GUI的交互式编译系统之中间代码生成器的设计与实现基于GUI的交互式编译系统之中间代码生成器的设计与实现摘要本设计实现了一个编译器前端,它将一个用C语言的子语言编写的源程序翻译成中间代码。词法分析器、语法分析器、中间代码生成器均是采用C+语言手动书写完成,未采用自动生成器,GUI采用Win32 API实现以保证轻快的运行速度及良好的系统性能,编辑控件采用Scintilla。词法分析器采用确定有限自动机实现,语法分析器是一个递归下降分析器,中间代码生成器输出的中间代码以四元式形式表示。本设计实现的编译器前端,运行在Windows平台下,Windows系统版本为Windows XP、Wind
2、ows 7或更高版本。本设计提供了一个可工作的界面友好的编译器前端,可以用来理解编译原理及解释怎样用一种语言如C+实现编译器前端,以供学习和教学所用。关键词:编译器前端;GUI;C+Design & Implementation of Intermediate Code Generator of Interactive Compilation System Based GUIAbstractThis final project implements a compiler front-end, it translates source programs written in a subset o
3、f the C language into intermediate code. The lexer、parser and intermediate code generator are all hand-written in C+, no auto lexer or parser are used, GUI is implemented in Win32 API for fast running speed and high performance, and edit control uses Scintilla. The lexer is implemented in Determinis
4、tic finite automata, the parser is a recursive-descent parser, the intermediate codes are represented in quadruple。The compiler front-end runs on the Windows platform, Windows system version is Windows XP, Windows 7 or later. This project provide a working and user interface friendly compiler front-
5、end, which can be used to demonstrate compiler principle and how compilers can be implemented in a language such as C+, for learning and teaching.Keywords: compiler front-end; GUI; C+目录1 绪论12 基本原理32.1 词法分析42.1.1 词法分析结果42.1.2 确定有限自动机52.2 语法分析52.2.1 递归下降分析法62.2.2 运算符的优先级82.3 中间代码生成92.3.1 四元式92.3.2 四元式
6、的常见结构102.4 符号表142.4.1 作用域152.4.2 局部变量名的存储布局163 设计与实现173.1 C子语言173.1.1数据类型173.1.2 字面值173.1.3 表达式173.1.4 语句183.1.5 函数183.2 符号表193.3 词法分析器243.4 语法分析器263.5 中间代码生成器283.6 GUI304 测试36总结41参考文献42致谢43附录 源程序44附件1:开题报告(文献综述)附件2:译文及原文影印件1 绪论很少有人去自己编写或修改编译器,那么为什么要去实现编译器前端呢?很重要的一点就是,理解计算机程序怎样被编译以及执行,可以帮助任何程序员理解他们写
7、的代码是怎样驱动计算机的,从而帮助他们写出更快、更高效的程序。编译原理经过多年发展已日趋成熟,然而现代很多跟编译原理相关的教材,内容陈旧落后,比如以Fortran或Pascal等过时语言为例进行分析讲解,或者全书充满晦涩难懂的定理公式,不能以直观的方式进行阐述,致使学生望而生畏。本设计用C+语言实现了一个编译器前端,它将一个用C子语言编写的源程序翻译成中间代码,拥有友好直观的交互式图形界面,有助于对编译原理的理解,可用于学习及教学。在一段程序可以执行之前,首先需要把它翻译成一种其能够被计算机接受的形式,完成这项翻译工作的程序称为编译器(compiler)1。简单而言,编译器是一个程序,它将使用
8、源语言编写的程序转换成另一种目标语言。在转换阶段很重要的一部分是报告用户当前源程序的错误。为了将源程序从一种语言翻译成另一种语言,编译器必须首先把程序的各种成分拆开,并搞清其结构和含义,然后再把这些成分组合成有意义的计算机能识别的语言。编译器的前端进行词法分析、语法分析和语义分析,并且产生中间代码,即进行分析。编译器的后端对中间代码进行优化并将中间代码翻译成机器语言,即进行组合。词法分析的任务是:对源程序进行从左到右逐个字符地扫描,产生一个个独立的单词符号(token)。词法分析是编译的基础。语法分析的任务是:在词法分析识别出一系列单词符号的基础上,分析并判定源程序的结构是否符合语法规则。语法
9、分析可以粗略地分为两类,一类是自顶向下,一类是自底向上2。对于本设计,采用的是自顶向下进行分析。语法分析得到语法树,尽管可以直接将语法树转换成目标机器代码,但这样做不利于可移植性和模块化设计。假设需要这样一个编译器:它可以编译N种不同的源语言,然后为M台不同的目标机生成代码。理论上,这是N*M个编译器,如图1.1(a),但实现这么多的编译器是需要花费大量的人力物力。中间代码(intermediate code, IC)是一种抽象机器语言,它可以表示目标机的操作而不需太多涉及与机器相关的细节,而且,它也独立于源语言的细节3。一个可移植的编译器如图1.1(b)所示,它先将源语言转换成中间代码,然后
10、再将中间代码转化成目标机器语言,这样便只需要实现N个前端和M个后端。这种实现要更容易合理些。即使在只需实现一个前端和一个后端的情况下,好的中间代码也利于将系统模块化,使得编译器前端不会因机器相关的细节而复杂化,编译器后端不会因源语言的特殊信息而干扰。编译器可以使用的中间代码有多种形式,对于本设计,采用简单的四元式。IC (a) (b)图1.1 面向5种语言并支持4种目标机的编译器:(a)没有IC,(b)有IC编译器的每个阶段都可能遇到错误,如果编译器在遇到第一个错误时就停止运行,对于修正程序肯定起不到多大帮助作用。词法分析阶段可以检测出来自输入的字符串不能形成语言的任何单词符号(token)。
11、语法分析阶段可以检测出违反语言语法的单词符号串。本设计可以报告出错误是什么及错误在源程序的行号和列号。2 基本原理一个编译器是一个计算机程序,它可以把用某种高级语言写的源代码转换成另一种形式,典型的形式是机器码。机器码是计算机可以执行的一系列指令4。int max(int a, int b)if(a b)return a;return b;一个编译器由有两部分组成,如图2.1所示。(1)源代码分析器:它将输入的源代码看作是一个字符串,然后将其翻译成有意义的符号(变量,值,操作符等)。(2)目标代码生成器:它将源代码分析器的结果转换成可执行代码。t1 = -ct2 = b * t1t3 = t1
12、 + t2t4 = t3目标代码源代码目标代码生成器源代码分析器图2.1 编译器结构源代码分析器不依赖于机器,然而目标代码生成器需要针对不同的机器类型生成不同的代码,因此是依赖于机器的。源代码分析器经常被称作编译器的前端,目标代码生成器被称作后端。本设计要实现的正是编译器的前端。编译器的前端又分为三个阶段,如图2.2所示。t1 = -ct2 = b * t1t3 = t1 + t2t4 = t3前端源代码中间代码生成器语法分析器词法分析器图2.2 编译器前端2.1 词法分析词法分析器以字符流作为输入,删除单词之间的空白符和注释(程序中每一部分都有可能出现空白和注释)并生成一系列的名字、关键字和
13、标点符号。如果让语法分析器来处理它们就会使得语法分析过于复杂,结构也不清晰,这便是将词法分析成为一个独立阶段,从语法分析中分离出去的主要原因5。在词法分析器中,词法单元(token)通常包含以下几种类型: 标识符 保留字(如:“if”,“while”等) 数值常量(如:整数,实数等) 字符串常量 简单符号(运算符如:“+”,“-”等,分隔符如:“;”,“,”等) 多重符号(运算符如“+=”,“+”等)这些词法单元将用于下一阶段语法分析。2.1.1 词法分析结果对于下面一段程序:int match(char* str)/ find a zeroif(!strncmp(str, “0”, 1)re
14、turn 0;词法分析器将产生如下tokens:INTID(match)LPARENCHARSTARID(str) RPARENLBRACEIFLPARENBANGID(strncmp) LPAREN ID(str) COMMA STRING(0) COMMANUM(1)RPAREN RPAREN RETURN REAL(0)SEMIRBRACEOF2.1.2 确定有限自动机确定有限自动机可用来实现词法分析器。有限自动机包括一个有限状态集合和一些从一个状态通往另一状态的边,每条边上标有一个符号;其中一个状态是初态,某些状态是终态6。图2.3给出了几个有限自动机的例子。if312IFa-z0-9
15、10-92120-9IDNUM图2.3 词法单词的有限自动机在确定有限自动机中,不会有从同一状态发出的两条边标记有相同的符号,确定有限自动机以如下方式接受或拒绝一个字符串:从初始状态出发,对于输入串中的每个字符,自动机都将沿着一条确定的边到达另一状态,这条边必须是标有输入字符的边,对n个字符的字符串进行了n次状态转换后,如果自动机到达了一个终态,自动机将接受该字符串,若到达的不是终态,或者找不到与输入字符相匹配的边,那么自动机将拒绝接受该字符串7。2.2 语法分析语法分析是分析如何根据一个文法生成一个终结符号串的过程。一种语言的识别器是一个程序,它把输入看作一个字符串x,如果x是该语言的一个句
16、子,则回答是,否则回答否。大多数分析方法都可以归为以下两类:自顶向下方法和自底向上方法。在自顶向下语法分析器中,构造过程从根结点开始,逐步向叶子节点方向进行,直至推出句子。自顶向下方法可以较容易地手工构造出高效的语法分析器。在自底向上语法分析器中,逐步对输入串进行归约,直至文法的开始符号,即从叶子节点开始,逐步向上归约,直至语法树的根节点。LL(1)文法表示对输入串从左到右扫描,进行最左推导,分析时每步向前查看一个字符。LL(1)分析法需要消除左递归和克服回溯。LR分析法表示对输入串从左到右扫描,构造最右推导的逆过程。LR分析法若采取手工构造,工作量非常大。本设计语法分析采用递归下降分析法。2
17、.2.1 递归下降分析法递归下降分析方法是一种不带回溯的自顶向下语法分析方法,它使用一组递归过程来处理输入。为文法的每个非终结符都创建一个相应的过程。递归下降分析法的一种简单形式是预测分析法。在预测分析法中,各个非终结符号对应的过程中的控制流可以由向前看符号无二义性地确定,在分析输入串时出现的过程调用序列隐式地定义了该输入串的一棵语法树8。假设用预测分析法分析以下文法(黑体字符序列被视为一个单元,也就是单个终结符号):stmtexpr;|if(expr) stmt|for(optExpr; optExpr; optExpr) stmt|otheroptExpr|expr则预测分析器如下所示:v
18、oid stmt() switch(curToken) case expr:accept(expr); accept(;);break;case if:accept(if); accept(); accept(expr); accept(); stmt();break;case for:accept(for); accept();optExpr(); accept(;); optExpr(); accept(;) optExpr();accept(); stmt(); break;case other:accept(other); break;default:report(“syntax er
19、ror”);void optExpr() if(curToken = expr)accept(expr);void accept(terminal t) if(curToken = t)curToken = nextTerminal;elsereport(“syntax error”);该预测分析器中包含了两个过程stmt()和optExpr(),分别对应于文法中非终结符号stmt和optExpr。该分析器中还包括一个额外的过程accept。这个额外的过程用来简化stmt和optExpr()的代码。过程accept(t)将它的参数t和向前看符号比较,如果匹配就前进到下一个输入终结符号。因此,a
20、ccept改变了全局变量curToken的值,该变量存储了当前正被扫描的输入终结符号。在分析过程的开始,首先调用文法的开始非终结符号stmt对应的过程,根据相应的语法规则,调用相应的处理过程。例如在处理“for(expr; expr; expr) other”输入时,curToken被初始化为第一个终结符号for。每个非终结符都产生一个对相应过程的调用:accept(for); accept();optExpr(); accept(;); optExpr(); accept(;); optExpr();accept(); stmt();2.2.2 运算符的优先级考虑表达式5 + 2 * 3。该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 GUI 交互式 编译 系统 中间 代码 生成器 设计 实现 毕业论文
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【胜****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【胜****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。