编译原理复习提纲


https://www.cnblogs.com/wkfvawl/p/13189703.html

1 introduction

2 词法分析

语言的定义:表示字母表上的一个串集,属于该语言的串称为该语言的句子或字。
形式语言
正则表达式的递归定义
四类形式语言

词法记号的描述与识别

2.1.1 语言

词法分析器的任务是把构成源程序的字符流翻译成词法记号流。可以借助状态转换图来实现词法分析器。
语言运算的定义:
在这里插入图片描述

2.1.2 正规式

正规式(又称正则表达式,正规表达式),每个正规式r表示一个语言L®

正规式表达的语言叫做正规语言和正规集。如果约定:

  1. 闭包运算由最高的优先级并且是左结合的运算(*)
  2. 连接运算的优先级次之且也是左结合的运算(两个正规式并列)
  3. 选择运算的优先级最低且仍然是左结合的运算。(|)

2.1.3 正规定义

正规定义的形式为:

d1->r1
d2->r2
...
dn->rn

*:0个或多个
+:1个或多个
?:0个或1个
[abc]:a|b|c
[a-z]:a|b|…|z

2.1.4 有限自动机

有限自动机分成确定和不确定两种。不确定的含义是:存在这样的状态,对于某个输入符号,它存在不止一种转换。二者都能识别正规集。

不确定的有限自动机(NFA)

NFA:

  1. 一个有限的状态集合S
  2. 一个输入符号的集合∑
  3. 一个转换函数move:S * (∑ ∪ {∈}) ----> P(S) 【P(S)指的是S的幂集】,他把状态和符号两元组映射到一个状态集合
  4. 状态S0是唯一的开始集合
  5. 状态集合F是接受(或终止)状态集合,并且F是S的子集。

可以用转换图或者转换表来表示。

确定的有限自动机(DFA)

DFA:

  1. 任何状态下都没有∈,即任何状态必须进行输入符号的匹配才能进入下一个状态
  2. 对任何状态s和任何输入符号a,最多只有一条标记为a的边离开s,即转换函数move:S * ∑ ----> S 可以是一个部分函数。
NFA转换为DFA

计算机很难使用NFA,因为二义性
NFA转换为DFA,子集构造法:

一般思想:让新构造的DFA的每个状态对应到NFA的一个状态集

1.假定NFA M=<S,∑,f,S0,F> 对M的状态转换图进行以下改造:

①引进新的初态结点X和终态结点Y, X,Y∈S, 从X到S0中的任意结点连一条ε箭弧,从F中任意结点到Y连一条ε箭弧。(解决初态的唯一性)

②引入新状态对M的状态转换图进行进一步的替换(简化弧上的标记)

在这里插入图片描述
2.NFA确定化:子集法(解决弧和转换问题)
设I是S的一个子集
①J为I中的某个状态经过一条a弧而到达的集合
②ε-closure(I):I∪{s’|从s∈I出发经过任意条ε弧能到达s’}
③Ia=ε-closure(J)
例:
在这里插入图片描述
I=ε-closure({1})={1,2}
J={5,4,3}
Ia=ε-closure({5,4,3})={5,4,3,6,2,7,8}

3.状态集转换表:
设只含两个字符a,b
①置第一行第一列为ε-closure({X}),求出Ia,Ib
②检查Ia,Ib看其是否已出现在表中的第一列,把未曾出现的填入后面空行的第一列,再求出Ia,Ib
③重复上述过程,直到所有2,3列子集全部出现在第一列为止
例:

在这里插入图片描述
在这里插入图片描述

化简和确定化的状态转换图:

在这里插入图片描述

DFA 的化简

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将NFA转化为正规式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

将正规式转化为DFA

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 语法分析

在这里插入图片描述

3.1 上下文无关文法

3.1.1 上下文无关文法的定义

一个上下文无关文法G是一个四元组(VT,VN,S,P),其中

  1. VT是一个非空有限集合,其元素称为终结符。
  2. VN是一个非空有限集合,其元素被称为非终结符,并有VT ∩ VN = 空集。
  3. S是一个非终结符,称为开始符号,它定义的终结符串集就是文法定义的语言
  4. P是产生式的有限集合,每个产生式的形式是 A -> a,其中A ∈VN, α ∈ (VT ∪ VN)

有上下文无关语法产生的语言叫做上下文无关语言,如果两个文法产生同样的语言则称这两个文法等价。

句子,句型和语言

  • 假定G是一个文法,S是他的开始符号。如果S=*>a,则称a是一个句型
  • 仅含终结符的句型是一个句子
  • 文法G所产生的句子的全体是一个语言,它记为L(G)

注意推导与直接推出的区别

**最左推导:**每一步都是代换句型中最左边的非终结符的推导
**最右推导:**每一步都是代换句型中最右边的非终结符的推导
最右推导又称规范推导

3.1.2 二义性

一个文法,如果存在某个句子有不止一颗分析树与之对应,则称这个文法是二义的。
消除二义性没有一般性的方法,只能进行特殊处理,对文法的产生式进行改造,有些文法的二义性是无法消除的。

3.1.4 形式语言鸟瞰

乔姆斯基(chomsky)把文法分成四种类型:0型,1型,2型,3型。
描述能力:0型 > 1型 > 2型> 3型
0型: 文法G=(VT, VN, S, P)是0型文法,如果它每个产生式α -> β 满足约束:α∈(VN∪ VT), 且 至少含有一个非终端符, 而β ∈(VN∪ VT)
0型文法也称短语文法,其能力相当于图灵机,递归可枚举。

如果对0型文法加上以下第 i 条限制,就可以得到 i 型文法:

  1. G 的任何产生式 α ->β 都满足|a| ≤ |β|(|x|用来表示x中符号的个数)。只有S-> ε可以例外,但此时 S不得出现在任何产生式的右部。
  2. G的任何产生式为A -> β的形式,A ∈ VN, β ∈(VN ∪ VT)
  3. G的任何产生式为A -> aB 或A -> a的形式,A,B ∈VN,a ∈ VT

1型文法也称上下文有关文法。这种文法意味着对非终结符的替换需要考虑上下文,并且一般不允许换成ε串。例如,若aAβ -> aγB 是1型文法的产生式,且a和β不都为空,则非终结符A只有在α和β这样的上下文环境下才可以替换成 γ。
2型文法也就是上下文无关文法,非终结符的替换不必考虑上下文。
3型文法等价于正规式,因而也称正规文法。

3.2 自上而下分析----LL(1)文法

3.2.1 自上而下分析得基本思想:

  • 从文法的开始符号出发,向下推导,推出句子
  • 针对输入串,试图用一切可能的办法,从文法开始符号(根节点)出发,自上而下地为输入串建立一棵语法树。

回溯问题:分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的,出错时,不得不回溯。
一个文法是左递归的,如果它有非终结符A,对某个串a,存在推导A => +Aa.
自上而下的分析方法不能用于左递归文法,需要消除左递归。有形式为A->Aa的产生式引起的左递归称为直接左递归。

对左递归:A -> Aα | β,可以用非左递归
A -> βA
A -> α A | ε
来代替,而且并没有改变从A推导出来的串集。

直接左递归的消除
在这里插入图片描述
间接左递归的消除
在这里插入图片描述
在这里插入图片描述
**基本思路:**把左递归的闭环替代到只有一个然后实行消除左递归。

在这里插入图片描述
在这里插入图片描述

3.2.1 消除回溯

消除回溯必须保证:对闻法得任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。

3.2.2 FIRST集合

令G是一个不含左递归的文法,对G的所有非终结符的每个候选定义它的终结首符集FIRST(α)为:
FIRST(α) = {a|α =>a…,a ∈ VT}
特别是,若 α => ε,则规定ε ∈ FIRST(α)
在这里插入图片描述
在这里插入图片描述

3.2.3 提取公共左因子

提取公共左因子的目的是↑,让A的每个候选的FIRST集合都不同, 这样需要的时候可能准确指派某个候选,
在这里插入图片描述

3.2.4 FOLLOW集合

在这里插入图片描述

3.2.5 LL(1)文法

LL(1):

  • L :从左向右扫描输入
  • L:最左推导
  • 1:每步只需向前查看一个符号
    在这里插入图片描述
    在这里插入图片描述
    FIRST集合和FOLLOW集合的构造
    构造FIRST和FOLLOW集合:对产生式反复扫描,每次扫描按照一定规则修改FIRST集合和FOLLOW集合,直到不再变化为止。
    在构造FIRST和FOLLOW集合之前需要对文法进行消除左递归和提取公共左因子
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

递归下降分析器

在这里插入图片描述

非递归的预测分析

在这里插入图片描述
在这里插入图片描述
构造预测分析表M:
在这里插入图片描述
在这里插入图片描述

LL(1)文法不是二义的。

3.3 自下而上分析----LR分析法

在这里插入图片描述
在这里插入图片描述

LR分析法:

  • L:从左到右扫描输入串
  • R:自下而上进行规约

在这里插入图片描述

3.3.1 句柄

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3.2 LR分析法

在这里插入图片描述
LR分析表包含ACTION和GOTO

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
空着的地方即为报错。

在这里插入图片描述
在这里插入图片描述
LR文法是无二义文法的子集。

在这里插入图片描述

3.3.3 活前缀

在这里插入图片描述
只要一直保证符号栈中总是活前缀,就可以保证移进规约过程的正确性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一种识别活前缀DFA的方法:(直接计算项目集规范族)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只要点没在最后就说明还没形成句柄还需要移进

3.3.4 LR(0)分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 更强的LR分析方法

移进规约冲突指的是同一个项目集中同时有移进和规约项目。

3.4.1 移进规约冲突消解方法:SLR(1)冲突消解办法

3.4.2 构造SLR(1)分析表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.3 SLR(1)文法

在这里插入图片描述

3.4.4 SLR(1)存在的问题

3.5 LR(1)分析法

展望串对规约项目有作用
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.5.1 LR(1)分析表的构造

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4 属性文法和语法制导翻译

4.1 属性文法

在这里插入图片描述
属性包括综合属性和继承属性
在这里插入图片描述
在这里插入图片描述

4.2 带注释的语法树


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.3 属性计算

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.3.1 依赖图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.4 S属性文法

在这里插入图片描述
在这里插入图片描述

4.5 L属性文法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.6 翻译模式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 语义分析和中间代码生成

在这里插入图片描述

5.1 常见的中间语言形式

在这里插入图片描述

5.1.1 图表示法—有向无环图(DAG)

5.1.2 三地址代码


在这里插入图片描述

5.1.3 赋值语句的属性文法

5.2 控制流语句的翻译模式实例







5.2 布尔表达式

在这里插入图片描述







6 运行时存储空间的组织和管理

把过程和函数这样的程序单元统称为过程
程序运行时过程的每一次执行称为过程的一次活动
过程的每次活动通常用一块连续的存储区来存放,称之为活动记录

过程一次执行所需局部信息用一块连续的存储区来管理,这块存储区叫做活动记录或帧。
组成如下:

  1. 临时数据。保存临时值,例如奇存器不足以存放表达式计 算的中间结果时,可以把中间结果存放在这儿。
  2. 局部数据。保存过程的局部数据。
  3. 保存的机器状态。保存刚好在过程调用前的机器状态信息,典型信息包括返回地址(程序计数器的值,它是被调用过程必须返回的地址),还有调用过程使用并且在返回时必须恢复的寄存器的内容。
  4. 访问链。有些语言需要通过访问链来访问非局部数据。
  5. 控制链。用来指向调用者的活动记录。
  6. 返回值。用于存放被调用过程返回给调用过程的值。为提高效率,这个值也常常用寄存器返回。
  7. 参数:存放调用过程提供的实在参数,由被调用过程使用。为提高效率,实际上的 寄存器传递参数。

7 代码生成





8 优化

优化:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。
优化包括:控制流分析,数据流分析,代码变换
优化的级别:局部优化,循环优化,全局优化。
局部优化:局限于基本块的范围的优化。





在这里插入图片描述







  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值