《编译原理》笔记整理

编译原理 笔记整理

1.1 《编译原理》引论

基本概念——发展

  1. 机器语言
  2. 汇编语言
  3. 高级语言
  4. 工具语言

基本概念——翻译程序

某一种语言程序(称为源语言程序)等价的转换成另一种语言程序(称为目标语言程序)的程序

如:中英互译系统、DBMS语言(DDL、DCL)

翻译程序

基本概念——编译程序

某一种高级语言程序等价的转换成另一种低级语言程序(如:汇编语言或机器语言程序)的程序

编译程序分类:

  1. 诊断编译程序&优化编译程序
  2. 交叉编译程序&可变目标编译程序运行

编译程序

基本概念——解释程序

把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身

解释程序


编译程序与解释程序的区别:编译生成目标程序,而解释不会生成


基本概念——执行高级语言程序的步骤

《编译原理》笔记整理_第1张图片

1.2 编译过程

1. 词法分析

  1. 任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号
  2. 依循的原则:构词原则
  3. 描述工具:正规式和有限自动机

2. 语法分析

  1. 任务:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位
  2. 依循的原则:语法规则
  3. 描述工具:上下文无关文法

3. 中间代码产生

  1. 任务:对各类不同语法范畴按语言的语义进行初步翻译
  2. 依循的原则:语义规则
  3. 中间代码:三元式、四元式、树形结构等

4. 优化

  1. 任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
  2. 依循的原则:程序的等价变换规则

5. 目标代码产生

  1. 任务:把中间代码变换成待定机器上的目标代码

    依赖于硬件系统结构和机器指令的含义

  2. 目标代码的三种形式:

    • 绝对指令代码【可直接运行】
    • 可重新定位指令代码【需要连接装配】
    • 汇编指令代码【需要进行汇编】

编译程序的逻辑结构

《编译原理》笔记整理_第2张图片

表格与表格管理

常见的表格:符号名表、常数表、标号表、入口名表、过程引用表

格式:

《编译原理》笔记整理_第3张图片

例子:

《编译原理》笔记整理_第4张图片

《编译原理》笔记整理_第5张图片

出错处理

出错处理程序:发现源程序中的错误,把有关错误信息报告给用户【语法错误、语义错误】

源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标程序

由从外存上获得前一的工作结果开始,完成工作后,把结果存放在外存上。每工作完成后所占用的存贮空间大部分被释放

编译前端与后端

前端与后端

  • 编译前端:与源语言有关,如词法分析、语法分析、语义分析与中间代码产生,与机器无关的优化
  • 编译后端:与目标机有关,与目标机有关的优化,目标代码产生

1.3 高级语言程序简介

一、参数传递

传地址

把实在参数的地址传递给相应的形式参数

传值

调用段把实在参数的值计算出来并放在被调用段可以拿到的地方,把值代入

传名

调用过程的作用相当于 把被调用的过程抄到调用出现的地方,但把其中任一出现的形式参数都替换成相应的实在参数

二、存贮管理

静态存贮分配

编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项目的单元地址。

动态存贮分配

如果允许递归、可变数据结构,则必须动态分配。

  1. 栈式:整个程序数据空间安排在一个栈中
  2. 堆式:允许自由地申请和退还空间

2.1 程序语言的定义

一个程序设计语言使一个记号系统,其完整的定义应包括语法语义两个方面

  1. 语法是一组规则,用它可以形成和产生一个合适的程序
  2. 语法只定义什么样的符号序列是合法的,与这些符号的含义毫无关系

阐明语法的一个工具是文法,这是形式语言理论的基本概念之一

字符串集合的一些运算

《编译原理》笔记整理_第6张图片

文法

文法是定义或描述语法结构的一组形式规则

2.2 文法的形式化定义和分类

文法的定义

文法定义为一个四元组G=(VN, VT, S, P)

对于这些符号的阐述:

  • VN非空 有限的非终结符集【字符集】

  • VT非空 有限的终结符集【字符集】

  • S:开始符号

  • P:产生式集合

  • 其中, VN ∩ VT =Φ,S∈ VN

    这句话也就是说:

    • 非终结符集【VN】与终结符集【VT】没有相同元素
    • 开始符号为非终结符集【VN】中的一个元素
  • P中产生式一般形式为: A→α|β,其中 A∈ VN ,α, β ∈( VN ∪ VT )*

    这句话也就是说:

    • 一个产生式,表示为一个非终结集中的一个元素可以变成【→】一个为α或者β的字符串,这个字符串为 终结集和非终结集的并集的自反闭包

文法的分类

产生式施加不同的限制得到不同类型的文法

  • 0型(无限制文法)

    规则形式:

    ɑ→β:

    1. α ∈ ( VN∪VT ) +
    2. β ∈ ( VN ∪ VT )*
    3. 且 α中至少含有一个非终结符

    解释:

    这个基本没有限制,只要求左边非空且至少有一个非终结符即可

    PS:但是如果左边都没有非终结符,全是终结符了,那么这个产生式也就没有意义了呀,所以说基本没有限制

  • 1型(上下文有关)

    规则形式:

    α→β:

    1. 有 1≦|α|≦|β|
    2. 其中α=γ12
    3. A ∈ VN
    4. γ1, γ2, β ∈ ( VN ∪ VT )*

    解释:

    这个文法又叫做【上下文有关】,这个所谓的上下文就是γ1和γ2,那么其实这个与0型的区别就在于,左边的α字符串的长度不能大于右边的β字符串的长度

  • 2型(上下文无关)

    规则形式:

    A→δ:

    1. A ∈ VN
    2. δ ∈ ( VN ∪ VT )+

    解释:

    这个就是:产生式的左边A为一个非终结字符,而右边β是一个非终结集和终结集的并集的正闭包【一个非空字符串】

  • 3型(右线性)

    规则形式:

    A→αB或A→α(右线性):

    1. A,B ∈ VN
    2. α ∈ ( VT )*

    解释:

    这个产生式的形式如下:

    • 左边的A为一个非终结字符
    • 右边的字符串有如下的性质:左边全为终结字符,最右边有一个或者没有非终结字符

  • 其他:

    • 左线性(比较右线性即可)

    • 正规文法:

      规则形式:

      A→αB或A→α

      1. 其中A,B ∈ VN
      2. α ∈ VT
      3. 如果 S → ε ∈ P,则S不能出现在任何产生式右边

      解释:

      【前面两条】右边只能是 单个的终结符 或者 一个终结符+一个非终结符的字符串

      【第三条】如果有一个非终结符可以变成空串,那么这个非终结符不能出现在右边的字符串中

    • 2型文法扩充:

      规则形式:

      A → δ,A ∈ VN

      1. δ ∈ ( VN ∪ VT )*

      解释:

      比2型文法多了一条:

      允许有空产生式: A → ε


  • 四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。

  • 0型文法 产生的语言为 0型语言

    上下文有关文法(1型文法) 产生的语言为 上下文有关语言

    上下文无关文法(2型文法) 产生的语言为 上下文无关文法

    正规文法 产生的语言为 正规语言

  • 现今大多数高级程序设计语言采用**上下文无关文法(2型文法)**来描述其语法已经足够了。

2.3 文法和语言

推导

设文法G = ( VN, VT, P, S),A → α是其中的产生式

若有符号串γ,δ ∈ ( VN ∪ VT )*,使得

U = γAδ,w = γαδ,则称w为U使用产生式A → α所得到的直接推导,记为U ⇒ w,即γAδ ⇒ γαδ【也称w可直接归约到U】

在这里插入图片描述

在这里插入图片描述

最左推导和最右推导

【最左推导】:每一步推导操作的都是字符串最左边的非终结符

【最右推导】:每一步推导操作的都是字符串最右边的非终结符

规范推导

  • 最右直接推导称规范直接推导
  • 最右推导又称规范推导

最右归约和最左归约

《编译原理》笔记整理_第7张图片

【最右归约】——【最左推导】

【最左归约】——【最右推导】

句型、句子、语言的定义

  1. 这S是文法G的识别符号(也就是开始字符),

    如果S=(*)=>u【经过0步或多步推导】,

    则称符号串u为文法G的句型

  2. 这S是文法G的识别符号(也就是开始字符),

    如果S=(*)=>u【经过0步或多步推导】,且u ∈ (VT)*【u为终结集的自反闭包,也就是说u是由非终结符组成的字符串】

    则称符号串u为文法G的句子

  3. 这S是文法G的识别符号(也就是开始字符),

    文法G的语言L(G) = {u|S=(*)=> 且 u ∈ ( VT )*},

    即文法的语言是文法所有句子的集合

文法等价

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

2.4 语法分析树

  • 我们用一张树型结构的图来描述一个句子的推导,这种表示称为语法树。
  • 语法树的根结由文法开始符号标记。随着推导的进行,当某个非终结符被它的候选式所替换时,此非终结符生出其下一代新结,候选式中自左至右没有符号对应着一个新结。

【IMPORTANT】性质:在语法树生长的任何时候,所有那些没有后代的端末结自左至右的排列起来,就是一个句型。

《编译原理》笔记整理_第8张图片

文法的二义性

  • 一个文法,如果它的一个句子有两棵或两棵以上的语法树,则称此句子具有二义性。如果一个文法含有二义性的句子,则该文法具有二义性。
  • 换一个说法:如果一个文法存在某个句子对应两棵或两棵以上不同的语法树,则称该文法是二义的

3.1 词法分析概述

词法分析程序的任务

从左至右逐个字符地扫描源程序,产生一个个单词符号

把作为字符地源程序改造为单词符号串组成地中间程序,执行词法分析任务地程序称为词法分析器或称扫描器

词法分析程序的功能

  • 主要功能
    • 读入源程序字符串,识别开具有独立含义地最小语法单位——单词(符号)
    • 把单词变换成长度统一地且为定长地属性字
  • 其他功能
    • 滤掉空格,跳过注释、换行符
    • 某些预加工处理

词法分析程序的安排

常常把词法分析程序作为独立的一遍或作为被语法分析程序所调用的子程序

  • 作为独立的一遍:

    语法分析前进行词法分析,把单词符号串形成中间文件存贮

《编译原理》笔记整理_第9张图片

  • 作为被语法分析器所调用的子程序:

《编译原理》笔记整理_第10张图片

词法分析程序的实现方式

  • 相对独立方式

    当采用递归下降分析等技术实现一趟编译程序时常采用这种方式

实现方式

  • 完全独立方式

    采用词法分析工作完全独立的原因:

    • 简化设计,降低语法分析的复杂性
    • 提高编译效率
    • 增加编译系统的可移植性

在这里插入图片描述

词法分析程序的输出形式

单词——程序语言的基本语法符号

如:基本字,标识符,常熟,运算符,界符等

词法分析器中,单词的输出形式:

【二元式】(单词类别,单词内部码值)

  • 单词类别:表示单词种类,常用整数编码,它是语法分析需要的

    一般分为以下5种:

    1. 关键字(基本字):个数确定,可全体编为一类(不同的关键字靠内部码值区分),也可一字一类
    2. 标识符(变量名):个数不确定,作为一类
    3. 常数:各种类型的常数,个数不确定,按类型分类(整型、浮点型)
    4. 运算符:如/*-+等,个数确定,一符一类
    5. 界符:如,)等,个数确定,一符一类

    注意:一种语言的单词如何分类、怎样编码,主要取决于技术上的方便

  • 单词自身的值:是编译其他阶段所需要的信息

例子:

一个分类表

《编译原理》笔记整理_第11张图片

3.2 词法分析程序的设计

状态转换图

注意:

  1. 终态是识别出了一个单词,而不是这个程序停下来,

    比如说,if1这个标识符,当识别出if时,已经到达了终态,但是实际上还可以往后面再识别一个1,组成if1这个标识符

  2. 初态:程序入口

  3. 理论上状态转化图可以没有终态

状态转换图的实现

方法:每个结点对应一段程序,前面状态的结点的程序调用其后继结点的程序

《编译原理》笔记整理_第12张图片

《编译原理》笔记整理_第13张图片

3.3.1 正规式与正规集

《编译原理》笔记整理_第14张图片

运算与运算优先级

  • 正规式而言(优先级递增)

    |【或】 .【连接,通常省略这个符号】 *【闭包】

  • 正规集而言(优先级递增)

    ∪ ∩ *

若两个正规式对表示的正规集相同,则认为二者等价

3.3.2 确定有限自动机(DFA)

基本概念

一个确定的有穷自动机(DFA)D是一个五元组:

D = ( K,∑,M,S,F) 其中:

  • K:有穷非空的状态集合

  • ∑:有穷非空的输入符号字母表

  • M:转换函数,是在K×Σ→K上的映像

    即,M ( ki,a ) = kj,(ki ∈ K,kj ∈ K)就意味着,当前状态为ki输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;

  • S:S ∈ K,是唯一的一个初态

  • F:F ⊃ K,是非空的终态集合

例子:


  • 一个DFA M也可用一张状态转换图表示,DFA的每个状态对于状态转换图的一个结点,图中箭弧上的标记为输入字符,若δ(s, a)=S’,则从状态s画一条箭弧到S’,弧上标记为a。
  • 对Σ*中的任何字α,若存在一条从初态到某一终态的道路,且这条路上所有弧上标记连接成的字为α,则称α可为DFA M所识别,或称DFA M可读出(或接受、识别)字α。
  • DFA M识别的字的全体记为L(M)。

DFA的一些性质

  • 如果一个DFA M的输入字母表为∑,则我们也称M是∑上的一个DFA。

    可以证明:∑上的一个子集是正规的,当且仅当存在∑上的DFA M,使得V = L(M)

  • DFA的确定性表现在映射δ:S×Σ→S是一个单值函数

    也就是说,对任何状态 s ∈ S和输入符号a∈Σ,δ(s, a) 唯一地确定了下一状态。

  • 特别地,若DFA M的初态同时又是终态,该DFA M可识别空字ε

  • 显然,若DFA M中字母表Σ含n个字母,则任何一个状态顶多只有n条发出弧

3.3.3 非确定有限自动机(NFA)

与确定有限自动机的区别:转换函数不再是单值函数了,也就是说可以是这样M(K,T)={K1,K2,…,Kn}

3.3.4 正规式与有限自动机的等价性

你可能感兴趣的:(编译器)