计科班编译原理教案Word文档下载推荐.docx

上传人:b****4 文档编号:17832740 上传时间:2022-12-11 格式:DOCX 页数:117 大小:2.58MB
下载 相关 举报
计科班编译原理教案Word文档下载推荐.docx_第1页
第1页 / 共117页
计科班编译原理教案Word文档下载推荐.docx_第2页
第2页 / 共117页
计科班编译原理教案Word文档下载推荐.docx_第3页
第3页 / 共117页
计科班编译原理教案Word文档下载推荐.docx_第4页
第4页 / 共117页
计科班编译原理教案Word文档下载推荐.docx_第5页
第5页 / 共117页
点击查看更多>>
下载资源
资源描述

计科班编译原理教案Word文档下载推荐.docx

《计科班编译原理教案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计科班编译原理教案Word文档下载推荐.docx(117页珍藏版)》请在冰豆网上搜索。

计科班编译原理教案Word文档下载推荐.docx

也是一种翻译程序,它与编译程序的区别:

立即执行源程序,通常是逐句翻译执行。

如BASIC、SQL、JAVA的BYTECODE解释程序等。

二、高级语言程序的处理过程

高级程序设计语言程序的典型处理过程如下图所示:

1.2编译过程和编译程序结构

一、编译过程的阶段划分

一般编译程序的工作过程按阶段进行,每个阶段将源程序从一种表示形式转换成另一种表示形式。

典型的阶段划分方法是将整个编译过程分为如下六个阶段:

1、词法分析:

任务:

对构成源程序的字符串进行扫描和分解,识别出单词(如标识符等)符号。

输入:

源程序

输出:

单词符号序列

例子:

有待分析源程序:

main(){intx=10,y;

}

词法分析后的输出:

1)保留字:

main

2)界符:

左圆括号(

3)界符:

右圆括号)

4)界符:

左大括号{

5)保留字:

int

6)标识符:

x

7)运算符:

=

8)常数:

10

9)标识符:

y

10)界符:

11)界符:

右大括号}

2、语法分析

根据语言的语法规则对单词符号串(符号序列)进行语法分析,识别出各类语法短语(可表示成语法树的语法单位),判断输入串在语法上是否正确。

输入:

单词序列

输出:

语法分析后的单词序列

3、语义分析

任务:

按语义规则对语法分析器归约出的语法单位进行语义分析,审查有无语义错误,为代码生成阶段收集类型信息,并进行类型审查和违背语言规范的报错处理。

输入:

语义分析后带语义信息的单词序列

4、中间代码生成(并非所有的编译程序都包含此阶段)

将语义分析得到的源程序变成一种结构简单、含义明确、易生成、易翻译成目标代码的内在代码形式。

常用的中间代码是四元式(算符,运算对象1,运算对象2,结果)。

语义分析后的单词序列

中间代码

5、代码优化(可放到目标代码生成阶段后)

对中间代码或目标代码进行变换改造等优化处理,使生成的代码更高效。

中间代码或目标代码

优化后的中间代码或目标代码

6、目标代码生成

将中间代码生成特定机器上的绝对或可重定位的指令代码或汇编指令代码。

语义分析后的单词序列或优化后的中间代码

目标代码

二、编译程序结构

上述六个阶段的任务分别由六个模块来完成。

一个完整的编译程序还应包括表格管理和出错处理程序。

典型编译程序结构框图如下:

三、编译阶段的组合

1、前后端组合法

编译前端:

与源语言有关与目标机无关的部分(第1-4阶段)。

编译后端:

与目标机有关的部分(第6阶段)

注:

第5阶段置前或后端都可以。

组合方式:

1)同一源语言的编译前端+不同后端=不同机器上同一源语言的编译程序;

2)不同源语言的编译前端生成同一种中间语言+使用共同后端=同一机器上不同语言的编译程序。

2、遍组合法

遍/趟:

对源程序或源程序的中间结果从头到尾扫描一次称为一遍。

每一遍扫视完成一个或几个阶段的工作。

一个编译程序可由一遍或多遍完成.实际编译程序分遍的主要参考因素是源语言与目标机器的特征。

1.3编译技术和软件工具

一、编译技术的发展

1950S早期:

算术工式译成机器代码。

1950S中期:

FORTRAN编译系统。

1950S末期:

自动生成工具出现,如:

LEX、YACC。

1960S:

自展技术。

1971年:

用自展技术生成PASCAL编译程序。

现代:

并行编译技术。

二、编译技术与软件工具

1、先进的软件开发技术和软件工具能提高编程效率、缩短调试时间。

2、编译程序本身是一种软件工具。

3、大部分软件工具的开发常用到编译技术和方法。

4、进行源程序处理的软件工具实质上都在不同程度上用到了编译程序各个部分的技术和方法。

如:

(1)语言结构化编辑器(语法);

(2)语言程序调试工具(语法、语义);

(3)语言程序测试工具(静、动态测试,发现错误);

(4)高级语言之间的转换工具;

(5)程序格式化工具、程序理解工具等。

例如:

Java的传统环境

Java编译器把Java代码翻译成独立于机器的Java“字节代码”。

运行时,目标装置中的校验器便分析这些字节代码以确保代码的安全执行。

在目标装置中,内置一个JVM(Java虚拟机)。

该虚拟机用一个解释器或一个JIT(适时)编译器把字节代码翻译成目标处理器能够识别的机器语言。

1.4程序设计语言规范

从支持的计算模式来看,程序设计语言(是指书写计算机程序的高级语言)规范有如下几种:

1、强制命令式语言,即过程式语言

该型语言中,一个过程可看作是一系列动作,其动作由命令驱动,以语句形式表示,一个语句接一个语句的执行。

属于这种规范的语言如PASCAL、C、FORTRAN等,C++、Ada、COBOL等也支持这种模式。

本课程介绍的编译技术针对这型语句。

2、函数式语言,即应用式语言

该型语言注重程序所表示的功能,程序的开发过程是从前面已有函数出发构造出更加复杂的函数,对初始数据集进行操作,直到最后形成的函数可以得到最终结果。

属于这种规范的语言如ML、LISP等。

3、基于规则(逻辑)的语言

该型语言程序的执行过程是检查一定的使能条件,满足时,则执行适当的动作。

如逻辑程序设计语言PROLOG,其基本的使能条件是某种谓词逻辑表达式;

再如YACC,其使能条件是程序的形式语法(BNF)。

4、面向对象语言

该型语言的主要特点是提供抽象数据类型,支持封装性、继承性和多态性。

C++、Ada、Java等也支持这种模式。

1.5编译程序的构造

一、编译程序的构造途径

1、用某种程序语言编写;

2、用编译程序自动构造工具构造。

3、通过现有的编译基础设施进行改造和组装。

二、T型图

T型图是用来表示一个编译程序所涉及到的三个方面的语言的一种工具,将源语言S通过用语言H书写的编译器翻译成目标语言T的编译程序可用如下T型图THST表示。

T型图的两种组合方式:

三、编译程序的自展

1、方法:

用“滚雪球”的方式生成编译程序。

2、思想:

先用目标机的汇编语言或机器语言书写源语言的一个子集的编译程序,再用这个子集作为书写语言(属于高级语言),实现源语言的编译程序。

例:

设,目标机A的语言为A,则两层自展构造实现语言C对应A机器的编译程序过程可描述为如下:

其自展过程:

用语言A编写语言C1的编译程序TAC1A;

再用C1书写语言C的编译程序TC1CA;

最后再将TC1CA经过TAC1A编译得到TACA。

四、编译程序的移植、自编译、交叉编译

1、移植:

将某一机器(宿主机)上已有的软件移植到另一机器(目标机)上的过程。

2、自编译:

用某种语言本身书写自己的编译程序的过程。

例如:

在机器A上已有语言C的编译程序(将语言C翻译成A的机器码A),现希望利用此编译程序生成机器B上的语言C的编译程序(将语言C翻译成B的机器码B)。

3、交叉编译:

把某源语言在宿主机上经过编译而产生目标机的汇编语言或机器语言的过程。

五、编译程序的构造工具

1、LEX

1)基于正规式的词法分析程序的生成器;

2)工作原理:

把LEX源程序中的正规式转换为相应的DFA,并将其插入到词法分析函数yylex()中的适当位置。

2、YACC

1)基于LALR

(1)文法的语法分析程序的生成器;

2)它是目前处理能力最强的语法构造工具,可处理满足LALR

(1)文法要求(包括某些二义性文法)的规则。

六、可重定向编译程序

1、由于交叉编译是在一个平台上生成另一个平台上的可执行代码的过程。

交叉编译受限较多。

2、编译基础设施:

为开发各种编译程序成分提供相应生成工具。

3、可重定向编译程序:

能够根据不同的目标机生成相应目标代码的编译程序。

它将与目标机相关的部分单独编写成不同模块,根据不同的目标机调用不同的模块。

自由软件GCC(GNU工程的编译程序集合)是目前使用广泛的可重定向编译程序。

4、支持可重定向编译的关键技术

  1)中间表示技术:

区别于四元式等传统的中间表示,支持可重定向编译的中间表示应在适当的抽象层次上,向上能够支持多语言映射、向下能够适应多平台转换后宜于进行各种优化。

2)机器描述技术:

区别于传统的假定式体系结构抽象模型的描述技术,支持可重定向编译的机器描述机制应能描述系统和硬件的共性,又能描述它们各自的特性,且能适应于不同编译程序的处理。

研究表明,基于体系结构描述语言详细地指定了体系结构是产生高质量机器级工具的关键技术。

3)代码生成程序的构造技术:

为简化开始过程、提高代码可靠性,支持代码生成程序的自动构造工具是关键技术和主要难点。

4)目标机描述与目标代码生成的接口技术:

在重定向编译程序的开始过程中,抽取一系列函数和数据结构作为目标机描述与目标代码生成的接口可以简化编译程序的开发,提高编译程序的效率。

作业:

教材P11-12的1、2、4题

2

使学生了解文法的直观描述、符号和符号串,掌握文法和语言的形式定义、文法的分类。

文法和语言的形式定义、文法的分类

文法和语言的形式定义

3学时

第三章文法和语言

3.1语言概述和文法的直观概念

一、基本概念

1、语言:

是由句子组成的集合,是由一组符号所构成的集合。

2、汉语:

所有符合汉语语法的句子的全体。

3、英语:

所有符合英语语法的句子的全体。

4、程序设计语言:

所有该语言的程序的全体。

二、语言研究的内容

1、语法(Syntax):

每个句子构成的规律/每个程序构成的规律。

表示构成语言句子的各个记号之间的组合规律。

在形式语言理论中,阐明语法的工具是文法。

2、语义(Semantics):

每个句子的含义/每个程序的含义。

表示各个记号的特定含义。

(各个记号和记号所表示的对象之间的关系)。

3、语用(Pragmatics):

每个句子和使用者的关系/每个程序和使用者的关系。

表示在各个记号所出现的行为中,它们的来源、使用和影响。

三、文法的直观描述

通常,用句子表述一种语言,但是句子是无穷的。

1、例子

以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如汉语句子可以是由主语后随谓语而成,构成谓语的是动词和直接宾语。

下面采用EBNF来表示句子的构成规则。

先给定如下一组规则:

〈句子〉∷=〈主语〉〈谓语〉

〈主语〉∷=〈代词〉|〈名词〉

〈代词〉∷=我|你|他

〈名词〉∷=王明|学生|工人|英语

〈谓语〉∷=〈动词〉〈直接宾语〉

〈动词〉∷=是|学习

〈直接宾语〉∷=〈代词〉|〈名词〉

有了这一组规则后,用它们导出句子的方式如下:

1)找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,这个动作表示成:

〈句子〉⇒〈主语〉〈谓语〉

2)在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应规则的∷=右端代替之。

比如:

选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉,那么得到:

〈主语〉〈谓语〉⇒〈代词〉〈谓语〉,

3)重复上述步骤。

导出句子:

“你是学生”的全部动作过程是:

〈句子〉⇒〈主语〉〈谓语〉⇒〈代词〉〈谓语〉⇒你〈谓语〉⇒你〈动词〉〈直接宾语〉⇒你是〈直接宾语〉⇒你是〈名词〉⇒你是学生

因此,“你是学生”的构成符合上述规则,而“你学生是”不符合上述规则,因此,它不是句子。

2、文法的直观定义

上例中的规则就是我们判别句子结构合法与否的依据,可以将这些规则看成是一种元语言,用它描述汉语。

由此可得文法的直观定义如下:

文法:

就是这样一些规则的有穷集合,它是以有穷规则集来刻划无穷句子集合的工具。

3.2符号和符号串

1、字母表:

元素的非空有穷集,记为Σ。

2、符号:

字母表中的元素。

3、符号串:

符号的有穷序列。

4、空符号串:

什么符号也不含的符号串,记为ε。

Σ={a,b,c,d,……z}。

a、b、c……都称为符号。

hello、stri、aezfg、main、fjfka都是Σ上的符号串。

二、符号串的基本操作

1、符号串的长度:

符号所包含符号的个数,设x是一符号串,其长度记为|x|。

例:

|hello|=5,|main|=4,|ε|=0。

2、符号串的连接:

设x、y是两个符号串,则xy被称为x与y的连接。

特别有:

x=xε=εx=εxε

x=my,y=classmate,则xy=myclassmate。

3、符号串的方幂:

设x是符号串,x自身的连接称为符号串的方幂,有:

x=ba,x0=ε,x1=ba,x2=bababa

4、符号串的集合:

若集合A中元素都是某字母表Σ上的符号串,则A是Σ上的符号串集合。

5、符号串集合的乘积:

若A、B均为Σ上的符号串集合,则AB={xy|x∈A,y∈B}

设A={ab,cd},B={ef,jh},则AB={abef,abjh,cdef,cdjh}

A{ε}=A,φA=Aφ=φ。

6、符号串集合的正闭包:

设符号串集合A,A的正闭包记为A+,A的闭包记为A*。

例:

设Σ={0,1},则Σ+={0,1,00,01,10,11,000,001……}。

Σ*={ε,0,1,00,01,10……}。

3.3文法和语言的形式定义

1、产生式

设VN,VT分别是非空有限的非终结符号集和终结符集。

V=VN∪VT,VN∩VT=φ。

所谓产生式是一个序偶对(α,β),其中α∈V+,β∈V*,通常表示为:

α→β或α∷=β,产生式也叫规则、重写规则、生成式。

<

阿拉伯数字>

→0|1|2|3…|9

2、文法

文法G是一个四元组,G=(VN,VT,P,S)。

其中:

VN,VT分别是非空有限的非终结符集和终结符集,且二者交集为φ;

P为产生式集;

S∈VN,是文法的开始符号(或识别符),它是一个非终结符,至少要在一条规则中作为左部出现。

文法G=(VN,VT,P,S),其中VN={S,B},VT={0,1},P={S→0B,B→1,B→1B}。

开始符为S。

可用文法的通俗表示法表示如下:

G[S]:

S→0B,B→1,B→1B

这个文法表示所有形如01,011,0111,01111的串。

3、直接推导

设α→β是文法G=(VN,VT,P,S)的产生式,γ,δ∈(VN∪VT)*,若有符号串v,w满足v=γαδ,w=γβδ,则称w是v的直接推导,或称v是w的直接归约。

记作v=>

w。

现有文法G[E]:

E→E+T|TT→T*F|FF→(E)|i

设v=E+F*i,w=E+i*i,则有v=>

w或E+F*i=>

E+i*i。

4、推导

如存在一直接推导序列v=>

α0=>

α1=>

α2....=>

αn=u(n>

0),则称符号串u为符号串v的一个推导(或者说v是u的一个归约),记为v=+>

u;

若有v=+>

u,且有v=u,则记作v=*>

u。

对于上例中文法G[E]:

E→E+T|TT→T*F|FF→(E)|i

设v=E,u=i+i*i,则有:

v=+>

相应的直接推导序列为:

E=>

E+T=>

E+T*F=>

E+F*F=>

T+F*F=>

F+F*F=>

F+F*i=>

F+i*i=>

i+i*i

5、句型和句子

设G[S]是一文法,如有S=*>

x,则称x是文法G[S]的句型。

若x是G[S]的句型,且x∈VT*,则称x是G[S]的句子。

6、语言

文法G[S]的语言是G[S]的所有句子构成的集合。

即L(G)={x|S=*>

x,且x∈VT*}。

文法G[S]:

S→MVDM→小王|小张V→是|不是D→大学生

则文法G[S]表示的语言可定义为:

L(G)={小王是大学生,小王不是大学生,小张是大学生,小张不是大学生}

MVD,M是D,M是大学生等均是G[S]的句型。

7、文法的等价

若L(G1)=L(G2),则称G1和G2是等价的。

3.4文法的类型

Chomsky将文法按其所表示的语言的表达能力,由高往低分为四类:

0型,1型,2型,3型文法。

一、定义

(1)0型文法

如果文法G的产生式α→β,其中α∈(VN∪VT)*,且至少含有一个非终结符号,β∈((VN∪VT)*。

则称G为0型文法。

0型文法又称短语结构文法。

(2)1型文法

如果0型文法G的产生式α→β满足|β|>

=|α|,仅当β=ε时例外。

则称此文法G是1型文法。

1型文法也称上下文有关文法。

(3)2型文法

一个1型文法G,如果满足α∈VN,则称为2型文法。

或者说2型文法的产生式都形如A→β。

2型文法也称上下文无关文法。

(4)3型文法

一个2型文法G,如果产生式全都是形如A→a或A→aB,其中:

A、B∈VN,a∈∪VT*,则G为3型文法。

3型文法也称正则文法或正规文法或右线性文法。

它对应有穷自动机。

(5)四类文法产生对应的四类语言。

二、文法之间的关系

四类文法的定义是通过逐步增加限制条件进行的。

即有:

3型文法⊂2型文法⊂1型文法⊂0型文法。

三、例题

判断下列文法类型:

例1:

S→aSYZS→aYZaY→ayyY→yyyZ→yzZY→YZzZ→zz

例2:

S→xSYZS→xYZxY→xyY→yyyZ→yzZY→YZzZ→zz

例3:

S→aTT→bT|cT|b|c

例4:

S→xB|cB→AzA→cS

3

使学生掌握语法树的构造、句型分析的方法,了解二义性文法的改造和有关文法实用性的一些说明。

句型分析

二义性文法的改造、句型分析

3.4上下文无关文法及语法树

上下文无关文法有足够的能力来描述现今程序设计语言的语法结构。

今后如无特别说明,“文法”一词均指上下文无关文法。

一、语法树

语法树也称推导树,给定文法G=(VN,VT,P,S),对于文法G的任意一个句型都存在一个相应的语法树,它满足:

(1)树中每一个结点都有一个标记,此标记是V=VN∪VT中的一个符号。

(2)根的标记是S。

(3)若树的一结点A至少有一个子女,则A∈VN。

(4)如结点A的子女结点从左到右次序为B1,B2...Bn,则必有产生式A→B1B2...Bn。

S→aAS|a

A→SbA|SS|ba

对句型aabbaa的推导过程可表示为下图所示语法树。

下面两个推导过程均可由上图表示。

(1)S⇒aAS⇒aSbAS⇒aabAS⇒aabbaS⇒aabbaa

(2)S⇒aAS⇒aAa⇒aSbAa⇒aSbbaa⇒aabbaa

这说明同一语法树可以表示对同一句型不同的推导过程。

二、最左(右)推导

1、如果每一步α⇒β中,都是对α中最左(右)非终结符进行替换,则称之为最左(右)推导。

2、最右推导称为规范推导,由规范推导所得的句型称为规范句型。

3、同一语法树最多对应唯一的最左(右)推导。

4、一个句型有可能对应着不同的语法树。

文法G[E]:

E→i|E+E|E*E|(E),则句型i*i+i可能对应着下面两个最右推导:

(1)E⇒E+E⇒E+i⇒E*E+i⇒E*i+i⇒i*i+i

(2)E⇒E*E⇒E*E+E⇒E*E+i⇒E*i+i⇒i*i+i

三、二义性语法树

1、如果一个文法存在某个句子对应着两棵不同的语法树,则称此文法是二义的。

不存在一种算法能在有限步骤内判断一个2型文法是否是二义的。

2、实际应用中,常找出一组无二义性的充分条件来构造无二义性文法。

3、例子

下列简单算术表达式的文法是二义性文法。

E→E+E|E-E|E*E|E/E|(E)|id

引入新的非终结符后可变换为非二义性文法。

E→E+T|E-T|TT→T*F|T/F|FF→(E)|id

If语句的文法G[S]:

S→ifEthenSS→ifEthenSelseSS→EE→a≠0|a>

0|b=1|b=-1|b=0

假设执行下列语句前b=0,有If句子:

ifa≠0thenifa>

0thenb=1elseb=-1

则当a=1时,b=1;

当a=-1时,b=-1;

当a=0时,b=0。

通过引入新非终结符、加ε规则进行改造后得文法:

(1)S→U|M|E

(2)U→ifEthenS(3)U→ifEthenMelseU(4)M→ifEthenMelse

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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