其他分享
首页 > 其他分享> > 编译原理笔记整理

编译原理笔记整理

作者:互联网

编译程序的逻辑结构

编译程序逻辑结构上至少包含两大阶段

编译程序的前端、中端和后端

典型编译程序的逻辑过程

image-20210108174211851

词法分析

词法分析程序(Lexical Analyzer)或词法扫描程序(Scanner)的作用

  1. 从左至右扫描构成源程序的字符流

  2. 识别出有词法意义的单词(Lexemes)

  3. 返回单词记录(由单词记号(Token)和单词的属性值组成),或词法错误信息

  4. 除以上主要任务外,常伴有如下任务

    滤掉空格,跳过注释、换行符,追踪换行标志,复制出错源程序,宏展开,……也可能包含访问符号表的操作

image-20210108174044863

语法分析

image-20210109151316200

判断w是否是文法G的语言,如果是则给出语法分析树。image-20210108174151302

语法分析过程主导语义分析以及翻译的过程

语义分析

对语法分析后的程序进行语义分析,不符合语义规则时给出语义错误信息

image-20210108174338842

符号表

收集每个名字的各种属性用于语义分析及后续各阶段

image-20210108174352813

出错处理

中间代码生成

抽象语法树 AST

image-20210108174450324

三地址码 TAC

image-20210108174510231

目标代码生成

生成目标机代码

image-20210108174545918

小结: 典型编译程序的主要逻辑模块

image-20210108174608310

文法基础

1. 最左(右)推导

最左推导

image-20210108204328596

image-20210108204343373

最右推导

image-20210108204429422

image-20210108204438459

2. 0~3型文法分类及其包含关系

文法与语言的 Chomsky 分类方法

image-20210108204616628

0 型文法

每个产生式左边至少有一个非终结符

image-20210108204709706

1型文法(上下文有关文法)

每个产生式右边长度都 大于等于 左边长度(除S→ε),且S不出现在右部

image-20210108204849939

2型文法(上下文无关文法)

产生式左边只有一个非终结符

image-20210108204945499

3型文法(正规文法)

产生式左边仅是一个非终结符

产生式右边只由1个终结符(或ε)后面跟0到1个非终结符

能够用3型文法定义的语言称为3型语言或正规语言

image-20210108205145980

文法之间的关系

\[3型文法 \subsetneq 2型文法 \subsetneq 1型文法 \subsetneq 0型文法 \]

3. 画出语法分析树

image-20210108210537045

image-20210108210322031

语法分析树的果实

image-20210108210706420

归约、推导与分析树之间关系

image-20210108210743587

4. 文法的二义性

二义文法(ambiguous grammars)举例

image-20210108210837973

二义文法概念

image-20210108210917514

二义性的判定

image-20210108210926056

消除二义性

image-20210108210935945

正规式、正规文法、自动机

1. DFA 和 NFA 的等价性

定理: L 是某个 DFA 的语言, 当且仅当 L 也是某个 NFA 的语言.

ε - 闭包

image-20210108231456671

个人理解:ε_CLOSURE(I)表示从 集合I 中的每一个元素出发经过 ε边能够到达的点(包括集合I)。

move函数

image-20210108231636460

个人理解:状态集合 I 中的元素经过a边可以到达的点的集合

子集构造法

NFA\(\Rightarrow\)DFA

image-20210108231734775

image-20210108231737066

子集构造法之例

image-20210108232803995

2. DFA 的化简:通过合并等价的(或不可区别的)状态

DFA 状态集合上的一个等价关系定义

image-20210108234456046

DFA 状态集合上等价关系的另一种解释

image-20210108234520232

无关状态

​ 无用状态:从开始状态不能到达的状态
​ 死状态:不能到达终止状态的状态

DFA的简化算法

image-20210108234614499

image-20210108234618162

3. 正规表达式

image-20210109111449341

正规表达式算符优先级

image-20210109111608806

举例

image-20210109111624822

4. 正规式和正规文法的等价

正规式转换为正规文法

tips:未在考试重点

image-20210109111737097

个人理解:第二条可以简化成如下

\[对于形如A\rightarrow x^*y 的正规产生式改写为 A\rightarrow xA|y \]

举例

image-20210109111756312

正规文法转换为正规式

image-20210109111748465

5. 正规式与有穷自动机的等价

image-20210109131143592

从正规表达式构造等价的ε - NFA

image-20210109131549708

image-20210109131553457

image-20210109131556063

image-20210109131558030

image-20210109131604959

典型正规表达式对应的状态转换图

image-20210109131619171

从有限自动机M构造等价的正规表达式r

image-20210109131659281

举例

image-20210109131708152

6. 正规文法与构造有穷自动机的等价

有穷自动机M\(\Rightarrow\)正规文法G

image-20210109133345302

正规文法G构造有穷自动机M

image-20210109133422363

LL(1)自顶向下

1. 消除(直接)左递归

tips:间接左递归不在考点

左递归消除规则

image-20210109160250024

举例

image-20210109160554865

2. 提取左公因子

提取左公因子规则

image-20210109160612656

举例

image-20210109160719183

3. Select集合

First 集合

image-20210109160750370

个人理解:经过任意次推导得到的句型中的第一个终结符

计算 First 集合

image-20210109160858942

个人理解:

  1. 终结符或ε的first集合为自己
  2. 产生式右部为空,即\(A \rightarrow \varepsilon\) First(A)并上\(\varepsilon\)
  3. 产生式右部非空,则First(左部)需并上First(右部)
  4. First(\(Y_1Y_2...Y_k\))。找到第一个First集合不包含\(\varepsilon\)的元素\(Y_i\)。将前面所有元素的First集合并起来,减去\(\{\varepsilon\}\)。如果不存在则所有元素的First集合并起来

Follow 集合(后继符号集)

image-20210109161724804

个人理解:Follow(A)求A后面可能字符串的First集合

计算 Follow 集合

image-20210109161737494

个人理解:如果\(\beta\)为\(\varepsilon\),即A后面无内容,则Follow(A)需并上Follow(X)

Select集(预测集合)(Predictive Set)

image-20210109165331367

4.判断是否为LL(1)文法

image-20210109165434733

举例

image-20210109170101816

5. 画出预测分析表

表驱动 LL(1)分析程序

工作原理:借助于预测分析表和一个下推栈

初始时,下推栈只包含#;首先将文法开始符号入栈;之后依如下步骤:

  1. 若栈顶为终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一单词继续分析;不匹配,则进行出错处理

  2. 若栈顶为非终结符,则根据该非终结符和当前输入单词查预测分析表,若相应表项中是产生式(唯一的),则将此非终结符出栈,并把产生式右部符号从右至左入栈;若表项为空,则进行出错处理

  3. 重复(1)和(2),直到栈顶为 # 同时输入也遇到结束符 # 时,分析结束

预测分析表

预测分析表的构造算法

image-20210109171704515

举例

image-20210109171733216

6. 对输入块的分析过程

image-20210109171754968

LR(0)

1. 增广文法

增广文法:使开始符号不会出现在产生式的右部

image-20210109223926381

2. 画出活前缀的DFA

活前缀

image-20210109223934956

活前缀与句柄的关系:一个活前缀是某一右句型的前缀,它不超过该右句型的某个句柄

活前缀集合的归纳定义:

image-20210109224430186

LR(0)FSM 的状态

LR(0)FSM 的状态是一个特殊的 LR(0)项目(item)集

一个LR(0)项目是在右端某一位置有圆点的产生式

image-20210109224927618

LR(0)项目解析

image-20210109225030085

计算LR(0)项目集 I 的闭包 CLOSURE(I)的算法

image-20210109225200356

圆点在产生式右部字符串的某个非终结符前,且该非终结符可以进行推导,则圆点也在该终结符推导出的式子的前面

LR(0)FSM 的初态

image-20210109225244418

例子

image-20210109225255624

LR(0)FSM 的状态转移函数

image-20210109225313225

计算 LR(0)FSM 的所有状态的集合

image-20210109225925463

LR(0)FSM 的构造说明

同一状态的项目集中,若不同项目其后继符号相同时, 后继状态也相同

不同状态的项目集中,若出现相同的项目时,则后继状态也相同. (如后图状态I2和I4同有项目A→.cA故经c均到达状态I2 ,状态I2和I4也同有项目A→.d故经d均到达状态I10 )

LR(0)FSM 的构造举例

image-20210109230145707

LR(0)FSM 的语言

image-20210109233532984

3. 判断是否为LR(0)

LR(0)文法判断

image-20210109230719441

4. action表,goto表

LR分析表

ACTION表

告诉分析引擎:在栈顶状态为k, 当前输入符号是 a 时做什么

ACTION [k,a]=si Shift:状态 i 移进状态栈顶,a移进符号栈顶
ACTION [k,a]=rj Reduce:按第 j 条产生式A→β归约,两栈顶各弹出|β|个元素
ACTION [k,a]=acc Accept :分析完成
ACTION [k,a]=err Error :发现错误 (常标为空白)

GOTO表

GOTO[i,A]=j 告诉分析引擎:在依产生式 A→β 归约依Action完成动作后(两栈顶各弹出|β|个元素),栈顶状态为i 时,要将新状态 j 移进状态栈顶(同时: A 移入符号栈顶)

即:在栈顶状态为k, 当前输入符号是 A时做什么。GOTO表就一个shift操作

LR(0)分析表的构造

image-20210109233547974

LR(0)分析表的构造举例

image-20210110111157195

5. 对输入串的分析过程

LR分析

带符号栈的 LR 分析算法

image-20210109223909375

SLR(1)

LR(0)分析的局限性

image-20210110111243266

发现两个状态(项目集)存在移进-归约冲突

image-20210110111338142

向前查看一个符号可解决冲突

image-20210110111348580

SLR(1)分析思想

SLR(1)分析表的构造

image-20210110113757164

image-2021011011133814
image-20210110113606929

SLR(1)文法

image-20210110113632717

比较 LR(0)表和 SLR(1)表

在 LR(0)表的 ACTION 表中,归约表项总是整行出现的,即一个归约对于所有输入符号都适用; 不会既有移进又有归约
而在 SLR(1)表的ACTION 表中。归约表项只适用于相应非终结符Follow 集中的输入符号; 可以既有移进又有归约

LR(1)

LR(1)项目

image-20210115145347193

image-20210115145415498

LR(1)FSM

image-20210115145445428

LR(1)FSM的构造

image-20210115145457839

LR(1)FSM的初态

image-20210115145514768

LR(1)FSM的状态转移函数

image-20210115145533237

计算 LR(1)项目集规范族

image-20210115145542366

LR(1)FSM的构造举例

image-20210115145554611

LR(1)分析表的构造

image-20210115145616167

LR(1)分析表的构造举例

image-20210115145624834

LR(1)文法

image-20210115145633767

语义分析、中间代码

0. 语法制导的语义计算基础(不在考点,前导概念)

概念

基于属性文法的语义计算

S-属性文法

L-属性文法

image-20210110170230987

L-属性文法的语义计算

采用基于深度优先后序遍历算法进行 L-属性文法的语义计算举例

image-20210110170550355

翻译模式(Translation Scheme)概念

受限的翻译模式

翻译模式举例

定点二进制小数转换为十进制小数

image-20210110165727098

1. 声明语句的属性文法

类型表达式(type expressions)

由基本类型,类型名字,类型变量,及类型构造子 (type constructor)归纳定义的表达式

分四类定义

语义函数

make_product_3 (V1.type, T.type, L.num) 生成积类型表达式< t1,…,tm,T.type,…,T.type>T.type共L.num个,V1.type=<t1,…,tm> 。
num.lexval 为词法分析返回的单词属性值
id.entry 指向当前标识符对应于符号表中的表项
addtype(id.entry,L.in) 表示将属性值 L.in 填入当前标识符在符号表表项中的type 域( 记录标识符的类型)
id.name 为当前标识符的名字;
lookup_type(id.name) 从符号表中查找名字为 id.name 的标识符所对应的表项中 type 域的内容,若未查到该表项或表项中的 type 域无定义,则返回 nil。
type_error 专用于有类型错误的程序单元
ok 专用于没有类型错误的程序单元
match( fun (type1), type2) 返回 true,当且仅当 type1, type2 是完全相同的积类型表达式
id.place id 对应的存储位置
E.place 用来存放 E 的值的存储位置
E.code E 求值的 TAC 语句序列(可不止一条四元式)
S.code 对应于 S 的 TAC 语句序列
newtemp 在符号表中新建一个名字,返回该名字存储位置
newlabel 返回一个新的语句标号
gen 生成一条 TAC 语句
|| TAC 语句序列之间的链接运算

类型检查程序的设计

语法制导的方法

语法制导的类型检查程序 —— 举例

处理声明的翻译模式

image-20210110172534352

image-20210110174900720

处理表达式的翻译模式(不在考点)

image-20210110173013237

image-20210110173023975

处理语句、过程声明及程序的翻译模式(不在考点)

image-20210110173103986

image-20210110173124815

2. 写出四元式序列(布尔表达式,短路求值)

布尔表达式的语法制导翻译

image-20210110210127385

直接对布尔表达式求值

image-20210110210136859

翻译流程控制布尔表达式至短路代码(L-翻译模式)

image-20210110210149809

语法分析树

image-20210110210305133

通过控制流体现布尔表达式的语义

image-20210110210320496

运行时存储组织

1. 栈区、活动记录、静态链和动态链

栈式存储分配

活动记录

函数/过程调用或返回时,在运行栈上创建或从运行栈上消去的栈帧(frame)

包含局部变量,函数实参,临时值(用于表达式计算的中间单元)等数据信息以及必要的控制信息

image-20210114213106246

过程活动记录的栈式分配举例

image-20210114213114752

典型的过程活动记录结构

image-20210114213206427

活动过程记录举例

image-20210114213225004

静态链

Display 表的方法要用到多个存储单元或多个寄存器。

一种可选的方法是采用静态链,也称访问链、存取链

所有活动记录都增加一个静态链(如在offset 为 0 处)的域,指向定义该过程的直接外过程(或主程序)运行时最新的活动记录

过程返回时, 当前活动记录要被撤销,为回( unwind)到调用过程的活动记录(恢复FP),需要在被调用过程的活动记录中有这样一个域,即动态链,指向该调用过程的活动记录(的基址),也称控制链

个人理解:静态链指向定义该过程的外过程,动态链指向调用该过程的外过程

静态链动态链举例

image-20210115152600104

代码生成

1. 支配节点集、回边、自然循环

基本块(basic block)

概念

入口语句

划分基本块的算法

流图(flow graph)

概念

流图以基本块集为结点集;第一个结点为含有程序第一条语句的基本块;从基本块 i 到基本块 j 之间存在有向边当且仅当

举例

image-20210114222714829

循环(loop)

支配结点集(dominators)

如果从流图的首结点出发,到达 n 的任意通路都要经过 m,则称 m 支配 n, 或 m 是 n 的支配结点,记为 m DOM n(∀a. a DOM a)

结点n 的所有支配结点的集合, 称为结点 n 的支配结点集,记为D(n)

注意:支配结点也称必经节点,支配节点集也称必经节点集

支配结点集举例

image-20210114222832927

自然循环(natural loop)

假设 n→d 是流图中的一条有向边,如果 d DOM n 则称 n→d 是流图中的一条回边(back edge)

有向边 n→d 是回边,它对应的自然循环是由结点 d ,结点 n 以及有通路到达 n 而该通路不经过 d 的所有结点组成,并且 d 是该循环的唯一入口结点

同时,因 d 是 n 的支配结点,所以 d 必可达该循环中任意结点

注:流图中的任何结点都是从首结点可达的

自然循环举例

image-20210114222835236

标签:语句,文法,终结符,语义,笔记,编译,LR,原理,属性
来源: https://www.cnblogs.com/EIPsilly/p/15699694.html