编译原理课程设计枣庄学院适合王艳秋教文档格式.docx
- 文档编号:16208660
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:24
- 大小:114.81KB
编译原理课程设计枣庄学院适合王艳秋教文档格式.docx
《编译原理课程设计枣庄学院适合王艳秋教文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计枣庄学院适合王艳秋教文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
768显示分辨率)
课程设计进度计划
起至日期
工作内容
备注
12月5日
12月9日
12月12日
12月18日
搜集资料
程序分析
编写代码
写报告书
编写代码阶段要细心
参考文献、资料索引
序号
文献、资料名称
编著者
出版单位
[1]例子:
刘宇君.SQLserver数据库应用设计案例汇编[M].北京:
中国铁道出版社,2007.86-132
[2]吕映芝,张素琴,蒋维杜.编译原理.清华大学出版社,1997
[3]李建中,姜守旭等译编译原理机械工业出版社,2002
目录
1摘要…………………………………………………………………..……4
2前言…………………………………………………………………..……5
3编译器
3.1编译器的发展…………………………………………………..……6
3.2编译器的可行性分析………………………………………….……7
3.3编译过程概述……………………………………………………..……7
4系统需求分析………………………………………………………..……9
4.1词法语法分析…………………………………………………………9
4.2语法需求分析…………………………………………………………9
4.3符号表的应用…………………………………………………………9
5系统设计
5.1总流程图……………………………………………………………10
5.2语法流程图…………………………………………………………10
5.3语法分析设计………………………………………………………11
5.4目标代码分析………………………………………………………16
6编译程序运行测试…………………………………………………...…19
7总结……………………………………………………………...........……23
1摘要
编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都含有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。
从功能上看,一个编译程序就是一个语言翻译程序。
它把一种语(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。
比如汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。
如果源语言是像FORTRAN,PASCAL,或C那样的高级语言,目标语言是像汇编语言或机器语言那样的低级机器语言,则这种翻译程序称作编译程序。
一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁索细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断地增长的年代尤为重要。
编译过程划分了词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成、六个阶级。
另外两个重要的工作:
表格处理和出错处理与上述六个阶级都有联系。
2前言
编译器的设计涉及到编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。
尽管“编译程序”是特指将高级程序设计语言翻译成低级语言的软件,但编译程序构造的基本原理和技术也广泛应用于一般的设计和实现,因此,是一门对实践性要求较高的课程。
目前,世界上存在着数千种源语言,既有Fortran和Pascal这样的传统程序设计语言,也有各计算机应用领域中出现的专用语言。
目标语言也同样广泛,目标语言可以是另一种程序设计语言或者是从微处理机到计算机的任何计算机的机器语言。
不同语言需要不同的编译器。
根据编译器的构造方法或者它们要实现的功能,编译器被分为一遍编译器、多遍编译器、装入并执行编译器、调试编译器、优化编译器等多种类别。
从表面上看,编译器的种类似乎千变万化,多种多样,实质上任何编译器所要完成的基本任务都是相同的。
通过理解这些任务,我们可以利用同样的基本技术为各种各样的源语言和目标机器构建编译器。
中间代码生成在进行了上述的语法分析和语义分析的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。
所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点:
一是容易生成;
二是容易将它翻译成目标代码。
很多编译程采用了一种近似“三地址指令”的“四元式”中间代码,这种四元式的形式为:
(运算符,运算对象1,运算对象2,结果)。
3编译器
3.1编译器的发展
如果源语言是像FORTRAN,PASCAL,或c那样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,则这种翻译程序称作编译程序。
词法分析阶级是编译过程的第一个阶级。
这个阶级的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别一个个单词(也称为单词符号或符号)。
这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。
比如标识是由字母开头,后跟字母、数字字符序列组成的一种单词,。
保留字是一种单词,此外还有算符,界符等等。
语法分析是编译过程的第二个阶段。
语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语。
如“程序”,“语句”,“表达式”等等。
一般这种语法短语也称为语法单位,可表示成语法树。
语法分析所依据的是语言的语法规则,即描述程序结构的规则。
通过语法分析确定整个输入串是否构成一个语法上正确的程序。
由于代码生成较复杂,所以编译器一般将这一阶段分成几个涉及不同中间数据结构步骤,其中包括了某种称作中间代码的抽象代码。
编译器也可能没有生成真正的可执行代码,而是生成了某种形式的汇编代码,这必须由汇编器、链接器和装入器进行进一步处理。
汇编器、链接器和装入器可由操心系统提供或由编译器自带。
在翻译期间,中间表示或IR代表了源程序和数据结构。
虽然抽象语法树是源代码完美充分的表达,即使对于代码生成也不过这样,但是它与目标代码极不相像,在控制流构造上尤为如此。
在控制流构造上,目标代码使用转移语句而不是if和while语句。
因此,编译器编写者可能希望从语法树生成一个更接近目标代码的中间表示形式,或者用这样一个中间表示代替语法树,然后再从这个新的中间表示生成目标代码。
这种类似目标代码的中间表示称为中间代码。
3.2编译器的可行性分析
编写编译器的原理和技术具有十分普遍的意义,以致于在每一个计算机科学家的研究生涯中,许多原理和技术都会反复用到。
编译器的编写涉及到程序设计语言、计算机体系结构、语言理论、算法和软件工程等学科。
简单的说,编译器是一个程序,它读入用某种语言(源语言)编写的程序并将其翻译成一个与之等价的以另一种语言(目标语言)编写的程序。
作为这个翻译过程匠一个重要组成部分,编译器能够向用户报告被编译的源程序中许多操纵源程序的软件工具都首先完成某种类型的分析。
下边是这类工具的示例:
1.结构编辑器,结构编辑器将一个命令序列作为输入一构造程序。
2.智能打印机,智能打印机能够对程序进行分析,打印出结构清晰的程序。
3.静态检查器,静态检查器读入一个程序,分析这个程序,并在不运行这个程序的条件试图发现程序的潜在错误。
4.解释器,解释器不是通过翻译来产生目标程序,而是直接执行源程序中蕴含的操作。
研究编译程序是有意义在于:
1)编译程序构造是计算机科学中的一个非常成功的分支,也是最早获的成功的分支之一;
2)它与文件转换程序关系密集,且不仅仅适用于编译程序;
3)它包含许多在实际应用中有用的算法。
3.4编译过程概述
如果源语言是像FORTRAN,PASCAL
,或C那样的高级语言,目标语言是像汇编语言或机器语言那样的低级玉器言,则这种翻译程序称作编译程序。
将编译过程划分了词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成、六个阶级。
编译过程是源程序和各种信息被子保留在种种不同的表格里,编译各阶级的工作都涉及到构造、查找或更新有关的表格,因此需要有表格处理的工作;
如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。
语法分析是编译过程的第二个阶级。
语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式”等等。
一般这种语法短语,也称为语法单位,可表示成语法树。
词法分析和语法分析本质上都是对源程序的结构进行分析。
但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结构是字母打头的字母和数字序列,这只要顺序扫描输入流,遇到既不是字母又不是数字字符时,将前面所发现的所有字母和数字组合在一起而构成单词标识符。
但这种线性扫描则不能用于识别递归定义的语法成分,比如就不能用此办法去匹配表达式中的括号。
语义分析阶级是审查源程序有无语义错误,为代码生成阶级收集类型信息。
比如语分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。
如有的编译程序要对实数用个数组下标的情况报告错误。
又如某些语言规定运算对象可被强制,那么当二目运算一整数和一实型时,编译程序应将整型转换成实型而不能认为是源程序的错误。
中间代码生成在进行了上述的语法分析和语义分析的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。
代码优化在此阶级的任务是对前阶级产生的是间代码进行变换或进行改造,目的是使成的目标代码更为高效,即省时间和省空间。
目标代码生成的任务是把是间代码变换成特定机器上的绝对指令代码或可重定位的指令
代码或汇编指令代码。
这是编译的最后阶级,它的工作与硬件系统结构和指令含义有关,这个阶的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
4系统需求分析
4.1词法语法分析
词法分析的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个的单词(也称单词符号或符号)。
语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式”等等,即判断单词序列是否符合组成各类语法短语的组成规则,一般这种语法短语,也称为语法单位,可表示成语法树。
4.2语法需求分析
词法分析器的主要任务是读入输入字符,产生记号序列,提交给语法分析使用。
4.3符号表的应用
在编译程序中符号表用来存放语言中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性。
在词法分析及语法分析过程中不断积累和更新表中的信息,并在词法分析到代码生成和各阶段,按各自的需要从表中获得不同的属性信息。
不论编译策略是否分趟,符号表的作用和地位是完全一致的。
符号表的功能主要有:
收集符号属性:
在分析语言程序中标识符说明部分时,编译程序根据说明信息收集有关标识符的属性,并在符号表中建立符号的相应属性信息。
上下文语义的合法性检查的依据:
同一个标识符可能在程序和不同地方出现,而有关该符号和属性是在不同情况下收集的,特别是在多趟编译及程序分段编译的情况下,更需检查标识符属性在上下文中的一致性和全法性。
通过符号表中属性记录可进行这些语义检查。
作为目标代码生成阶段地址分配的依据:
除语言中规定的临时分配存储的变量外,每个符号变量在目标代码生成时需要确定其在存储分配的位置。
语言程序中的符号变量由它被定义的存储类别或被定义的位置来确定。
首先要确定其被分配的区域。
其次是根据变量出现的次序。
在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性。
在词法分析及语法分析过程中不断积累和更新表中的信息,并在词法分析到代码生成的各阶段,按各自的需要从表中获取不同的属性信息。
5系统设计
5.1总流程图
5.2语法流程图
5.3语法分析设计
语法分析是编译过程的核心部分,语法分析的任务是:
按照文法,从源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。
语法分析设计采用递归下降分析法,递归下降分析技术是一种无回溯的自顶向下分析技术,它的实现思想是:
让一个识别符程序由一组子程序组成,其中每一个子程序对应于文法的一个非终结符;
根据文法的递归定义,这些子程序往往是递归子程序。
这种技术称为递归下降技术,相应的识别程序称为递归下降识别程序。
在递归下降识别程序中的每一个子程序都对应于文法的一个非终结符,更确切地说为各个非终结符设计一个子程序,每一个子程序分析相对于相应非终结符短语。
例如,当进入关于非终结符号〈语句〉的递归子程序时,便期待句子中出现相对于〈语句〉的短语,这时必要的是让识别程序逻辑知道句子中正期待短语的位置。
递归下降分析技术是面向目标的,这个目标是子程序所相应的非终结符号,也是预测的,预言能找到这个相对于该非终结符号的短语。
C语言的语法分析EBNF
如下:
<
程序>
[<
宏定义>
][<
头文件>
]<
主函数(main)>
[<
子函数>
]
变量说明部分>
常量说明部分>
子函数调用>
语句>
CONST<
常量定义>
{,<
};
<
标识符>
=<
整型常量>
[+|-]<
数字>
{<
}
类型说明>
int|flaot|double|char
字母>
|<
赋值语句>
|<
条件语句>
循环语句>
子函数调用语句>
输入语句>
输出语
句>
表达式>
条件>
关系运算符>
|!
FOR循环语句>
WHILE循环语句>
DO-WHILE循环语句>
for
‘(’[赋值语句]‘;
’[表达式]’;
’[条件语句]’)<
while’(‘<
’)’<
do-while循环语句>
do’{‘<
’}’while’(‘<
’)’
函数调用语句>
函数名>
‘(’[<
变量说明>
]‘)’
scanf’(‘<
输入类型声明>
‘,’‘&
’<
’)‘’;
‘
输出语句>
printf’(‘<
输出类型声明>
‘,’<
%d|%c|%s<
项>
加减法运算符>
因子>
乘除法运算符>
无符号整数>
|‘(‘<
’)‘
+|-<
*|/<
==|<
=|>
|>
=|!
=<
if<
条件<
else<
10<
a|b|……|A|B|……|Z<
0|1|……|9
用C语言实现递归下降分析程序如下:
voidError(){…}
main()
{
Constant
()
;
Variable()
;
Call_sentence()
Sentence();
/*常量说明部分*/
if(const)
{
Constant_define();
}
Constant_define()/*常量定义*/
Identifer
();
Integer_content();
/*整型常量/
Variable()/*变量说明部分*/
if(
类型说明
)
定义标识符;
Sentence()/*语句*/
if(!
Set_value_sentence())
Condition_sentence())
Circle_sentence())
Call_sentence())
printf)
scanf)
returnError();
Set_value_sentence()
/*标识符*/
Expression
/*表达式*/
Condition()/*条件*/
11
Expression
Relation_symbol();
/*关系运算符*/
Circle_sentence()/*循环语句*/
语句();
while
do-while
Call_sentence()/*函数调用语句*/
Function_Identifer
/*函数名*/
/*表达式*/
if(+|-)
Item();
Math_symbol();
/*算数运算符*/
Item()/*
项
*/
Factor();
Math_symbol();
Factor();
Factor()/*
因子
Integer;
If(‘(‘)
If(‘)’)
Get_next_word();
Math_symbol()
if(Math_symbol())
12
if(Relation_symbol())
Condition_sentence()/*条件语句*/
if(if){
if(‘(‘)
if(‘)’)
Sentence();
if(else)
5.4目标代码分析
代码生成概要:
代码生成的基础是用目标代码段系统地替换AST的结点和子树,用这种方法可以保持语义紧接着是一个线性代阶段,从重写的AST产生一个线性指令序列。
替换过程被称为树重写。
线性化由目标代码段和数据流和控制流需求控制。
代码生成中的三个主要问题是代码选择、寄存器分配和指令排序。
一般情况下,发现最优组合是NP完全的。
有三个方法简化代码生成问:
1每次只考虑AST的一小部分;
2简化目标机;
3限制代码段之间的接口。
代码生成分三个阶段进行:
1预处理,通过程序转换,有些AST结点模式被其他AST结点模式替换;
2正确代码生成,通过树重写,所有AST结点模式被目标代码序列替换;
3后处理,通过窥孔优化,有些目标代码序列被其他目标代码序列替换。
预处理和后处理可能反复执行得到代码最简单的方法是为AST的每个结点生成代码段,由迭代解释程序为其执行。
如果目标代码为C或C++,所有优化都可能留给C或C++编译程序。
这个过程用最小的投入使解释程序变为编译程序。
可以生成对库中简单拷贝的例程调用,而不是多次重复一个代码段,这可以相当可观地减小目标代码的长度。
这个技术被称为线程代码。
目标代码长度的减少对嵌入式系统可能是重要的。
通过将库例程编号并且将程序存储为这些编号数的一个列表可以大大减小目标代码长度。
所有目标机依赖现在集中于库例程中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 枣庄 学院 适合 王艳秋教