(编译原理)讲义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章概述
计算机由硬件和软件组成,软件又包括程序设计语言、系统软件和应用软件,而编译系统属系统软件。
最早人们只能使用计算机可直接接受的机器语言,到1956年,在IBM704计算机上构造了第一个FORTRAN编译程序,使人们从繁重的机器语言程序设计中解放出来。
计算机是一种逻辑电子装置,它只能接受二进制数,要使得计算机接受高级语言程序,就要借助于编译程序将高级语言程序翻译成机器可接受的机器语言。
§1编译程序和解释程序:
要在计算机上实现除机器语言之外的任一程序设计语言,就首先应使此语言为计算机所“理
解”。解决这一问题的方法有两种:一种是对程序进行翻译;另一种是对程序进行解释。
翻译程序:①汇编程序
②编译程序
翻译程序:是把一种语言编写的程序翻译成等价的另一种语言的程序;前一种语言称为源语言,后一种语言称为目标语言;
根据源语言和目标语言的不同,有各种不同的翻译程序:
汇编程序:若源语言是汇编语言,目标语言是机器语言,这种翻译程序称为汇编程序。
编译程序:若源语言是高级语言,而目标语言是某计算机的汇编语言或机器语言,这种翻译程序称为编译程序。
解释程序:它以用该语言编写的源程序作为输入,但不产生目标程序,而是按照源语言的定义边解释边执行源程序本身。
通常的编译程序是先将源程序比较简单地翻译成某种中间形式的程序,然后再对这种中间形式进行解释;这种中间形式的语言有多种:波兰表示、三元组、四元组、树、伪代码等。
编译程序和解释程序相比,解释程序的执行效率比较低,但占用时间较少。
§2编译程序的组成部分:
编译程序将首先根据源语言的定义来对源程序进行分析,之后进行综合,并从而得到与源程序等价的目标程序;
分析:对源程序进行结构分析和语义分析;
综合:创建出与源程序等价的目标程序;
结构分析:①词法分析
②语法分析
综合:①中间代码生成
②代码生成
每一个编译程序一般都要做以下几个方面的工
作:
①词法分析
②语法分析
③语义分析
④中间代码生成
⑤代码生成
⑥代码优化
目标程序
图1。1编译程序的基本组成
在编译过程中,要从头到尾扫视源程序或其内部表示(等价的中间语言程序)。每扫视一遍称为一趟扫描。如果经过一趟扫描就能生成目标代码,这样的编译程序称为一趟扫描的编译程序,否则称为多趟扫描的编译程序。
下图是一个不带代码优化的五趟扫描的编译程序的实现方案:
编译程序总控
中间语言3,表
图1。2不带代码优化的五趟扫描
的编译程序的实现方案目标代码
这个五趟扫描的编译程序工作过程如下:首先,编译程序的主程序调用词法分析程序,词法分析程序把源程序作为输入,将它转换为一种内部表示,称为中间语言1,并得到有关的一些表;然后,主程序调用语法分析程序,语法分析程序把中间语言1作为输入,进行语法分析,并转换为中间语言2;。。。。。。;最后,主程序调用目标代码生成程序,把中间代码(可看作为一种理想机代码)作为输入,并转换为目标代码。
对于一趟扫描的编译程序,程序本身紧凑,编
译程序快;
对于多趟扫描的编译程序,它的功能块清晰,占用内存器少(重叠使用内存)。
1、词法分析:词法分析程序又称扫描程序;主要
任务是从构成源程序的符号串中识别出一个
个具有独立意义的最小单位——单词,并把需
要存放的单词放到符号表中;词法分析是一种
线性分析;
例1:对赋值语句a:=b+c*d进行词法分析,得到以下的结果:
单词类别值单词自身值
(1)标识符(IDENT) a (2)赋值号(BECOMES):= (3)标识符(IDENT) b (4)加号(PLUS)+ (5)标识符(IDENT) c
(6)乘号(TIMES)* (7)标识符(IDENT) d (8)分号(SEMICOLON);
识别标识符要根据词法规则。例如:标识符的词法规则是以字母开头的字母数字序列。在扫描源程序时,当遇到第一个字母之后继续扫描,直到发现既不是字母也不是数字时可以确定,从第一个字母到最后一个字母或数字的字符串构成一个标识符(或保留字)。
在词法分析过程中,通常要跳过空格,不做任何处理。
2、语法分析:是编译程序的主要组成部分,它的
任务是根据语言的语法规则进行语法分析,即
按照语法规则识别源语言中的单词序列所构
成的句子。它是一种层次结构的分析。
例:对赋值语句:a:=b+c*d进行语法分析得到如下图所示的层次结构:(语法树)
赋值语句
标识符:= 表达式
a 表达式+ 表
达式
标识符表达式* 表达式
标识符标识符
c
d
图1。3语句a:=b+c*d的语法树语法树的层次结构可以用递归规则来表示,例如可以用下列规则递归地定义语句:
(1)如果identifier1是一个标识符,expression2是一个表达式,则identifier1:= expression2是一个语
句;
(2)如果expression1是一个表达式,statement2是一个语句,则while(expression1) do statement2
(递归定义)
if (expression1) then statement2 (递归定义)
都是语句;
语法分析的输入是单词(词法分析的结果),语法分析的输出是确定该语句的类型。
例2:对条件语句:IF a>0 THEN b:=a*(i1+5)进行语法分析。
①词法分析的结果如下:
单词类别值单词自身值
(1)保留字(IFSYM)IF