编译原理讲义

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1)把用汇编语言或高级语言写成的程序转换成机器语言的程序,被称为翻译程序。

汇编语言的翻译程序称为汇编程序

把高级语言的翻译程序称为编译程序。

可以采用边翻译边执行的解释执行方式,这种处理程序称为解释程序。解释程序的结果是源程序的执行结果。

2)编译有哪些部分组成?

每个部分的作用?

词法分析:输入源程序,对构成源程序的字符串进行扫描和分析,识别出一个个的单词(符号)如关键字,标识符,常数,算符,界符。

语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号分解成各类语法单位(如短语、句子等),并构造一棵能够正确反映该结构的语法树。

作用:通过语法分析确定整个输入是否构成语法上正确的“程序”。

注意:词法分析是种线性分析,而语法分析是一种层次分析。

中间代码生成:任务:语义分析的基础上按语言的语义规则进行初步的翻译(产生中间代码)中间代码:是一种含义明确、便于处理的记号系统,它通常独立具体的硬件;

表示形式:四元式、三元式、间接三元式等

中间代码优化:任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效的目标代码。

目标代码生成:任务:把中间代码变换成特定机器上的低级语言代码(目标代码)

目标代码形式:绝对指令代码、可重定位指令代码、汇编指令代码

表格管理:

错误处理:

3)编译前后端的划分?

前端:此法分析、语法分析、中间代码生成、中间代码优化。

后端:目标代码生成及和硬件有关的工作。

4)符号和符号串的概念

1、字母表:它是非空有穷集。

例如:∑={a,b,c}或∑={1,2,3}

2、符号:字母表中的元素称为符号。

3、符号串:符号的有穷序列,符号串也称为字。用ε来表示空符号串。

例如:a,ab,abc,dsfsd

4、长度:符号串的长度是指该串所包含的符号个数。用|x|表示符号串x的长度。

例如:|a|=1,|abn|=3

5、连结:设x和y为符号串,则称xy 为他们的连结。

例如:x=aa,y=bb,则XY=aabb

6、空集:不含任何元素的集合,记为Φ。

7、乘积:设A和B是符号串集,则用AB表示A和B的乘积。

例如:X={a,b},Y={c,d},则XY={ac,ad,bc,bd}

8、方幂:设A为符号串集,则定义

A0={ε}

A1=A

A n=A n-1 A

例如:A={a,b} 则有:

A0={ε} A1={a,b}

A2={aa,ab,ba,bb}

9、正闭包:设A为符号串集,则用A+表示A的正闭包,其具体定义如下:

A+=A1∪A2∪A3∪⋯…

例如:A={a},A+={a,aa,aaa,……}

10、星闭包:设A为一集合,则定义A的星闭包为A*,其具体定义如下A*=A0∪A+例如:A={a},A*={ε,a,aa,aaa,……}

5)巴克斯范式(EBNF),能够写出巴克斯范式

带<>的叫非终止符,不带<>的叫终止符。例如:<逻辑值>→True|False

6)文法定义:文法是一个四元组G(V N,V T,P,Z)。非终极符集记为V N(大写字母)、

终极符集记为V T(小写字母)、产生式集记为P、初始符记为Z。

7)名词:

1、直接推导:设x和y是符号串,若用一次产生式可从x导出y,则称y为x的直接推导,并记为x⇒y。例子:x=Ab,y=ab,A→a,Ab⇒ab

2、推导:若用若干次产生式可从x串导出y

为x

的推导,并记为x y。

例子:x=AB,A→a,B→b AB⇒aB⇒ab 即:。

8) 语法树

定义:设G=(V N,V T,P,S)是给定文法,则称满足下面条件

的树为G的一棵语法树。

•每个结点都标有G的一个文法符号,且根结点标

有初始符S,非叶结点标有非终极符。

•如果一个非叶结点A有n个儿子结点(从左到

右)B1,B2,…,B n,则A→B1B2…,B n一定是G的一个产生

式。

如果每步都是最右非终极字符,则也称该规范推导为

最右推导。

例子:G[S]:S→AB

A→Aa|bB

B→a|Sb

S⇒AB⇒bBB⇒baB(最左推导)

S⇒AB⇒ASb⇒AABb⇒AAab⇒AbBab (最右推导)

S⇒AB⇒ASb⇒bBSb⇒baSb(非左非右)

定义:如果一个文法G 存在某个句子,使得它有两棵语法树,则称G 为二义性文法。 例子:证明 G:E →E+E|E*E|(E)|i 则G 是二义性文法。

因为句子i+i*i 具有两棵语法树分别如图所示。

1、设有文法G[N]:

N →D |ND

D →0|1|2|…|9

(1)试写出021和4321的最右推导和

最左推导。

(2)试举出三个无最右推导的句型。 解:(1)021的最左推导:

N ⇒ND ⇒NDD ⇒DDD ⇒0DD ⇒02D ⇒ 021

021的最右推导: N ⇒ND ⇒N1⇒ND1⇒N21 ⇒D21⇒021 解:4321的最左推导:

N ⇒ND ⇒NDD ⇒NDDD ⇒DDDD ⇒4DDD ⇒43DD ⇒432D ⇒4321 4321的最右推导:

N ⇒ND ⇒N1⇒ND1⇒N21

⇒ND21⇒N321⇒D321⇒4321 (2)无最右推导的句型 N ⇒ND ⇒N1⇒ND1⇒DD1⇒4D1

定理 1、每个句型都有一棵语法树,每个语法树的叶组成一句型。 2、每棵子树的叶组成短语,每棵简单子树的叶组成简单短语,最左简单子树的叶组成句柄。 3、用语法树可证明每个句子都有一规范推导。 3、设有文法G[E]: E →T |E+T |E-T

T →F |T*F |T /F

F →i|(E)

解:(1) i*i /(i+i*i)的语法树

(3)最右推导:E ⇒T ⇒T*F ⇒T*(E)⇒T*(E+T) ⇒T*(E+F)⇒T*(E+i)⇒T*(T+i)⇒ T*F*(T+i)

2、证明下列文法G[S] 是二义性文法: S →if E then S else S | if E then S 解:设有if E 1 then if E 2 then S 1 else S 2 ,则有两棵语法树:

短语:第一个F,F+i,i, 第二个F,i, F*i(F+i),(F*i), T*(F*i),(F+i)-T*(F*i) 简单短语:第一个F,i, 第二个Fi

句柄:第一个F

相关文档
最新文档