编译原理复习总结


一、编译器概述

1、名词解释

1.1解释下列名词

源语言:被翻译器翻译的语言,用于书写源程序的语言。
目标语言:被翻译器翻译之后得到的语言,用于书写目标程序的语言
翻译器:能够完成从一种语言到另一种语言的变换的软件
编译器:一种特殊的翻译器,要求目标语言比源语言低级
解释器:解释器是不同于编译器的另一种语言处理器。解释器不像编译器那样通过翻译来生成目标程序,而是直接执行源程序所指定的运算。

2、编译阶段

1.2典型的编译器可以划分成几个主要的逻辑阶段?各阶段的主要功能是什么?
典型的编译器可以划分成七个主要的逻辑阶段,分别是词法分析器、语法分析器、语义分析器、中间代码生成器、独立于机器的代码优化器、代码生成器、依赖于机器的代码优化器。各阶段的主要功能:

(1)词法分析器:词法分析阅读构成源程序的字符流,按编程语言的词法规则把它们组成词法记号流。

(2)语法分析器:按编程语言的语法规则检查词法分析输出的记号流是否符合这些规则,并依据这些规则所体现出的该语言的各种语言构造的层次性,用各记号的第一元建成一种树形的中间表示,这个中间表示用抽象语法的方式描绘了该记号流的语法情况。

(3)语义分析器:使用语法树和符号表中的信息,依据语言定义来检查源程序的语义一致性,以保证程序各部分能有意义地结合在一起。它还收集类型信息,把它们保存在符号表或语法树中。

(4)中间代码生成器:为源程序产生更低级的显示中间表示,可以认为这种中间表示是一种抽象机的程序。

(5)独立于机器的代码优化器:试图改进中间代码,以便产生较好的目标代码。通常,较好是指执行较快,但也可能是其他目标,如目标代码较短或目标代码执行时能耗较低。

(6)代码生成器:取源程序的一种中间表示作为输入并把它映射到一种目标语言。如果目标语言是机器代码,则需要为源程序所用的变量选择寄存器或内存单元,然后把中间指令序列翻译为完成同样任务的机器指令序列。

(7)依赖于机器的代码优化器:试图改进目标机器代码,以便产生较好的目标机器代码。

3、有限自动机

有限怎么理解?

DFA和NAF区别?

二、词法分析

1、正规式

例1

 例2

 至少含有一个1,因而需要正闭包1+,在出现1后面就会对其后是1还是0选择状态,如果是1,则停留在q2状态上,如果是0进入q3状态。在q3状态上,如果选择0进入q2状态,则实现了1后面两个0,如果是选择1进行q2状态,后面没有0,同样也是符合1后面偶数个0的,这样q2与q3本质是一种等价状态。

例3

 换个意思理解,就是任何一个1后面都有偶数个0

 例4

解释:对于L来说描述的语言意思是0的个数是偶数并且1的个数是偶数,原因在于11、00必然是0偶1偶,而01、10要至少出现两次无论是0101,1010,0110,1001都能保证0偶1偶

对于L1

对于L2

对于L3

L2的另外一种表达形式

习题2.3

叙述下列正规式描述的语言

a) 0(0|1)*0
b) ((ε|0)1*)*
c) (0|1)*0(0|1)(0|1)
d) 0*10*10*10*
e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)*

答案:
a)以0开始和结尾,而且长度大于等于2的0、1串
b)所有0,1串(含空串)
c)倒数第三位是0的0、1串
d) 仅含3个1的0、1串
e) 偶数个0和偶数个1的0、1串(含空串)

2、有限自动机

NFA:不确定的有限自动机

DFA:确定的有限自动机

 例1

例2

 还能表示的正规式是(b*a+b)+

例题3

例题4

习题2.7

用算法2.4为下列正规式构造非确定的有限自动机,给出它们处理输入串ababbab的转换序列。
a) (a|b)*
b) (a*|b*)*
c)((ε|a)b*)*
d)(a|b)*abb(a|b)*

答案:

a) (a|b)*

输入串ababbab 的转换序列:
0 1236 1456 1236 1456 1456 1236 14567


b) (a*|b*)*

输入串ababbab 的转换序列:
0 1234510 1678910 1234510 167878910 12345610 167891011

c)((ε|a)b*)*

输入串ababbab 的转换序列:
0 1456789 145678 789 1456789 10

D)NAF:

输入串ababbab 的转换序列:
0 1236 1456 789 10 11 12 13 16 11 14 15 16 17

习题2.11

对于(a|b)*使用子集构造法

原NFA:

A:{0、1、2、4、7}

B:{1、2、3、4、6、7}   A+a

C:{1、2、4、5、6、7}   A+b

对于(a*|b*)*使用子集构造法

原NFA:

A:{0、1、2、3、5、6、7、9、10、11}

B:{1、2、3、4、6、7、9、10、11}   A+a

C:{1、2、5、6、7、8、9、10、11}   A+b

对于((ε|a)b*)*使用子集构造法

原NFA:

A:{0、1、2、3、4、6、7、9、10}

B:{1、2、3、4、5、6、7、9、10}   A+a

C:{1、2、3、4、6、7、8、9、10}   A+b

三者DFA相同

 化成最简DFA

习题2.13

习题2.14

 有点像小丑的微笑?

三、语法分析

1、分析树

习题3.1

对句子(a,(a,a))的最左推导,最右推导和分析树。

对句子(a,((a , a),(a , a) ) )的最左推导,最右推导和分析树。

该文法产生的语言是:括号匹配的串,串中的各项由“,”隔开,项可以是括号匹配的子串或a。

习题3.2

3.2 考虑文法 S aSbS | bSaS |ε
a) 为句abab 构造两个不同的子最左推导,以此说明该文法是二义的。 

(b) 为abab 构造对应的最右推导。

(c) 为abab 构造对应的分析树。 

(d) 这个文法产生的语言是什么?

二义性出现在第二步上,是将最左边的S换成ε还是换成aSbS?

 最右推导也是二义的。

该文法产生的语言是:该文法产生a、b个数相等的ab串(含空串)

习题3.3

2、二义性

 3、直接左递归的消除

 举例:

 

3、LL(1)文法

FRIST集

 FOLLOW集

 SELECT集

习题3.8

 S->(L)|a
L->SL’
L’->,SL’|e

SELECT集

SELECT(S){ (, a}

对于S->(L) 右部以终结符(打头

对于S->a右部以终结符a打头

SELECT(L){ ( ,a }

对于L->SL’ 右部第一个非终结符S的FIRST集

SELECT(L'){ ' , ' , ) , $ , ' , ' }

对于L’->,SL’ 右部以终结符‘ , ’打头

对于L’->e  SELECT集就是左部的FOLLOW集

习题3.10

4、自下而上分析

句柄是该句型中和一个产生式右部匹配的子串

习题3.16

(a)用习题3.1的文法构造(a,(a,a))的最右推导,说出每个右句型的句柄。

 
(b)给出对应的(a)的最右推导的移进-归约分析器的步骤。

 


(c)对照(b)的移进-归约,给出自下而上构造分析树的步骤。

5、LR文法

习题3.17

四、语法指导的翻译

习题4.3

习题4.6

习题4.12

 

习题4.14

习题4.15