基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx

上传人:b****3 文档编号:14652749 上传时间:2022-10-23 格式:DOCX 页数:50 大小:997.44KB
下载 相关 举报
基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx_第1页
第1页 / 共50页
基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx_第2页
第2页 / 共50页
基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx_第3页
第3页 / 共50页
基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx_第4页
第4页 / 共50页
基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx

《基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx》由会员分享,可在线阅读,更多相关《基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx(50页珍藏版)》请在冰豆网上搜索。

基于gui的交互式编译系统之中间代码生成器的设计与实现Word下载.docx

Thisfinalprojectimplementsacompilerfront-end,ittranslatessourceprogramswritteninasubsetoftheClanguageintointermediatecode.Thelexer、parserandintermediatecodegeneratorareallhand-writteninC++,noautolexerorparserareused,GUIisimplementedinWin32APIforfastrunningspeedandhighperformance,andeditcontrolusesScintilla.ThelexerisimplementedinDeterministicfiniteautomata,theparserisarecursive-descentparser,theintermediatecodesarerepresentedinquadruple。

Thecompilerfront-endrunsontheWindowsplatform,WindowssystemversionisWindowsXP,Windows7orlater.Thisprojectprovideaworkinganduserinterfacefriendlycompilerfront-end,whichcanbeusedtodemonstratecompilerprincipleandhowcompilerscanbeimplementedinalanguagesuchasC++,forlearningandteaching.

Keywords:

compilerfront-end;

GUI;

C++

附件1:

开题报告(文献综述)

附件2:

译文及原文影印件

1绪论

很少有人去自己编写或修改编译器,那么为什么要去实现编译器前端呢?

很重要的一点就是,理解计算机程序怎样被编译以及执行,可以帮助任何程序员理解他们写的代码是怎样驱动计算机的,从而帮助他们写出更快、更高效的程序。

编译原理经过多年发展已日趋成熟,然而现代很多跟编译原理相关的教材,内容陈旧落后,比如以Fortran或Pascal等过时语言为例进行分析讲解,或者全书充满晦涩难懂的定理公式,不能以直观的方式进行阐述,致使学生望而生畏。

本设计用C++语言实现了一个编译器前端,它将一个用C子语言编写的源程序翻译成中间代码,拥有友好直观的交互式图形界面,有助于对编译原理的理解,可用于学习及教学。

在一段程序可以执行之前,首先需要把它翻译成一种其能够被计算机接受的形式,完成这项翻译工作的程序称为编译器(compiler)[1]。

简单而言,编译器是一个程序,它将使用源语言编写的程序转换成另一种目标语言。

在转换阶段很重要的一部分是报告用户当前源程序的错误。

为了将源程序从一种语言翻译成另一种语言,编译器必须首先把程序的各种成分拆开,并搞清其结构和含义,然后再把这些成分组合成有意义的计算机能识别的语言。

编译器的前端进行词法分析、语法分析和语义分析,并且产生中间代码,即进行分析。

编译器的后端对中间代码进行优化并将中间代码翻译成机器语言,即进行组合。

词法分析的任务是:

对源程序进行从左到右逐个字符地扫描,产生一个个独立的单词符号(token)。

词法分析是编译的基础。

语法分析的任务是:

在词法分析识别出一系列单词符号的基础上,分析并判定源程序的结构是否符合语法规则。

语法分析可以粗略地分为两类,一类是自顶向下,一类是自底向上[2]。

对于本设计,采用的是自顶向下进行分析。

语法分析得到语法树,尽管可以直接将语法树转换成目标机器代码,但这样做不利于可移植性和模块化设计。

假设需要这样一个编译器:

它可以编译N种不同的源语言,然后为M台不同的目标机生成代码。

理论上,这是N*M个编译器,如图1.1(a),但实现这么多的编译器是需要花费大量的人力物力。

中间代码(intermediatecode,IC)是一种抽象机器语言,它可以表示目标机的操作而不需太多涉及与机器相关的细节,而且,它也独立于源语言的细节[3]。

一个可移植的编译器如图1.1(b)所示,它先将源语言转换成中间代码,然后再将中间代码转化成目标机器语言,这样便只需要实现N个前端和M个后端。

这种实现要更容易合理些。

即使在只需实现一个前端和一个后端的情况下,好的中间代码也利于将系统模块化,使得编译器前端不会因机器相关的细节而复杂化,编译器后端不会因源语言的特殊信息而干扰。

编译器可以使用的中间代码有多种形式,对于本设计,采用简单的四元式。

IC

(a)(b)

图1.1面向5种语言并支持4种目标机的编译器:

(a)没有IC,(b)有IC

编译器的每个阶段都可能遇到错误,如果编译器在遇到第一个错误时就停止运行,对于修正程序肯定起不到多大帮助作用。

词法分析阶段可以检测出来自输入的字符串不能形成语言的任何单词符号(token)。

语法分析阶段可以检测出违反语言语法的单词符号串。

本设计可以报告出错误是什么及错误在源程序的行号和列号。

2基本原理

一个编译器是一个计算机程序,它可以把用某种高级语言写的源代码转换成另一种形式,典型的形式是机器码。

机器码是计算机可以执行的一系列指令[4]。

intmax(inta,intb)

{

if(a>

b)

returna;

returnb;

}

一个编译器由有两部分组成,如图2.1所示。

(1)源代码分析器:

它将输入的源代码看作是一个字符串,然后将其翻译成有意义的符号(变量,值,操作符等)。

(2)目标代码生成器:

它将源代码分析器的结果转换成可执行代码。

图2.1编译器结构

源代码分析器不依赖于机器,然而目标代码生成器需要针对不同的机器类型生成不同的代码,因此是依赖于机器的。

源代码分析器经常被称作编译器的前端,目标代码生成器被称作后端。

本设计要实现的正是编译器的前端。

编译器的前端又分为三个阶段,如图2.2所示。

图2.2编译器前端

2.1词法分析

词法分析器以字符流作为输入,删除单词之间的空白符和注释(程序中每一部分都有可能出现空白和注释)并生成一系列的名字、关键字和标点符号。

如果让语法分析器来处理它们就会使得语法分析过于复杂,结构也不清晰,这便是将词法分析成为一个独立阶段,从语法分析中分离出去的主要原因[5]。

在词法分析器中,词法单元(token)通常包含以下几种类型:

•标识符

•保留字(如:

“if”,“while”等)

•数值常量(如:

整数,实数等)

•字符串常量

•简单符号(运算符如:

“+”,“-”等,分隔符如:

“;

”,“,”等)

•多重符号(运算符如“+=”,“++”等)

这些词法单元将用于下一阶段语法分析。

2.1.1词法分析结果

对于下面一段程序:

intmatch(char*str)//findazero

if(!

strncmp(str,“0”,1))

return0;

词法分析器将产生如下tokens:

INTID(match)LPARENCHARSTARID(str)RPAREN

LBRACE

IFLPARENBANGID(strncmp)LPARENID(str)COMMASTRING(0)COMMANUM

(1)RPARENRPARENRETURNREAL(0)SEMI

RBRAC

EOF

2.1.2确定有限自动机

确定有限自动机可用来实现词法分析器。

有限自动机包括一个有限状态集合和一些从一个状态通往另一状态的边,每条边上标有一个符号;

其中一个状态是初态,某些状态是终态[6]。

图2.3给出了几个有限自动机的例子。

i

f

IF

a-z

0-9

IDNUM

图2.3词法单词的有限自动机

在确定有限自动机中,不会有从同一状态发出的两条边标记有相同的符号,确定有限自动机以如下方式接受或拒绝一个字符串:

从初始状态出发,对于输入串中的每个字符,自动机都将沿着一条确定的边到达另一状态,这条边必须是标有输入字符的边,对n个字符的字符串进行了n次状态转换后,如果自动机到达了一个终态,自动机将接受该字符串,若到达的不是终态,或者找不到与输入字符相匹配的边,那么自动机将拒绝接受该字符串[7]。

2.2语法分析

语法分析是分析如何根据一个文法生成一个终结符号串的过程。

一种语言的识别器是一个程序,它把输入看作一个字符串x,如果x是该语言的一个句子,则回答是,否则回答否。

大多数分析方法都可以归为以下两类:

自顶向下方法和自底向上方法。

在自顶向下语法分析器中,构造过程从根结点开始,逐步向叶子节点方向进行,直至推出句子。

自顶向下方法可以较容易地手工构造出高效的语法分析器。

在自底向上语法分析器中,逐步对输入串进行归约,直至文法的开始符号,即从叶子节点开始,逐步向上归约,直至语法树的根节点。

LL

(1)文法表示对输入串从左到右扫描,进行最左推导,分析时每步向前查看一个字符。

LL

(1)分析法需要消除左递归和克服回溯。

LR分析法表示对输入串从左到右扫描,构造最右推导的逆过程。

LR分析法若采取手工构造,工作量非常大。

本设计语法分析采用递归下降分析法。

2.2.1递归下降分析法

递归下降分析方法是一种不带回溯的自顶向下语法分析方法,它使用一组递归过程来处理输入。

为文法的每个非终结符都创建一个相应的过程。

递归下降分析法的一种简单形式是预测分析法。

在预测分析法中,各个非终结符号对应的过程中的控制流可以由向前看符号无二义性地确定,在分析输入串时出现的过程调用序列隐式地定义了该输入串的一棵语法树[8]。

假设用预测分析法分析以下文法(黑体字符序列被视为一个单元,也就是单个终结符号):

stmtexpr;

|if(expr)stmt

|for(optExpr;

optExpr;

optExpr)stmt

|other

optExprε

|expr

则预测分析器如下所示:

voids

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1