编译原理——真来不及了快逃

  • Post author:
  • Post category:其他


以下内容

大部分

来自wzl 巨佬的博客:

编译原理复习总结-耗子尾汁_吾仄lo咚锵的博客-CSDN博客


少部分

来自个人总结,也缺少一些东西,仅仅是个人复习编译原理自用,如果一定要用请务必结合上面大佬博客加下面大佬视频

以下是个人期末复习参考的大佬b站视频


编译原理—混子速成期末保过_哔哩哔哩_bilibili

如有侵权,十分抱歉 ,请联系我删除!

编译原理复习大纲

第一章


解释

(Interpret)的过程是把源程序代码一行一行的读懂,然后一行一行的执行,发生在运行时,产物是

运行结果


编译

(Compile)的过程是把整个源程序代码翻译成另外一种代码,翻译后的代码等待被执行或者被优化等等,发生在运行之前,产物是

另一份代码

为什么需要编译器:因为不能出错

汇编语言->机器语言(11对应)

编译:高级语言->低级语言


编译程序的结构

: 1.词法分析器,2.语法分析器3.语义分析和中间代码产生器4.优化器5.目标代码生成

1.词法分析器:又称扫描器

2.语法分析器:分析器




:编译过程五个阶段仅仅是逻辑功能上的 一种划分。具体实现时,受不同语言,设计要求,使用对象和计算机条件的限制,往往将编译程序组织为若干遍,


所谓的“遍”是对源程序或源程序中间结果 从头到尾扫描一遍,并作有关的加工处理,生成新的中间结果或者目标程序

在主存可能情况下,一般还是遍数尽可能少一点,并不是所有语言都可以用单遍编译此程序实现


编译前端和后端

概念上,我们有时候把编译程序划分为编译前端和编译后端,

前端

主要由与源语言有关但是与目标机无关的那部分组成,

这部分通常包括词法分析,语法分析,语义分析和中间代码

生成。而且有一些代码的优化工作也可以包括在前端。

后端

包括:编译程序中与目标机有关的那些部分。

如与目标机有关的代码优化和目标代码生成

。后端不依赖于源语言而仅仅依赖于中间语言。

第二章


词法规则

的描述工具:有限自动机


语法规则

描述工具:上下文无关文法


关于闭包

:分为正闭包和自反传递闭包:(补充文本)

注意空字 ε


乔姆斯基四型文法

0型文法:短语文法(不重点)

1型文法:上下文有关文法

2型文法:上下文无关文法

3型文法:也称右线性文法,但也有另一种形式:左线性文法, 由于三型文法等价于正规式所以也称作正规文法


上下文无关文法

(重点):

上下文无关文法是一个四元式(Vt,Vn,S,P)(符号不会打书本28页)) 这里的NT都是大写

Vt:非空有限集合,他的每个元素成为终结符号,(一般小写字母)

Vn是一个非空有限集,它的每个元素成为非终结符号,Vt∩Vn = 空(一般用大写字母)

S:是一个非终结符号,称为开始符号;

P :一个产生式集合,每个产生式形式P->Vn a∈(Vt∪Vn)


句型,句子

假定G是一个文法,S是它的开始符号,称 S    ⟹ * α是一个句型,仅含终结符的句型是一个句子。

注意 * 指0步以上推导,+指1步以上推导(把+记住成正就好记)


语言

文法G所产生的句子的

全体

就是一个语言


最左推导和最右推导


自顶向下

(给你非终结符让你推导出非终结符)

最左推导:被替换的总是当前符号串中的最左非终结符

最右推导:被替换的总是当前符号串中最右的非终结符(规范推导)


自底向上

(归约 比如给你aaaabbbb 让你归约 给你终结符让你归约成非终结符)

最右归约:被归约的总为当前符号串最右

最左规约:被归约的总为当前符号串最左(规范归约)


规范:右推左规


把规范推导逆着看就是规范归约

语法树

1.

子树:任意一结点及其后继

直接子树(树高为2):叶子节点的父节点

一颗语法树< – >多种推导序列

以可语法树< – >唯一最左推导和最右推导

2.

二义性文法:L(G) 的某个句子对应不只有一颗语法树

无二义性文法:L(G)产生的每一个句子都只有一颗语法树

3.


短语

:每棵子树的叶子

直接短语:简单短语是一次性能推导出来的,一次推导出叶子节点


句柄



直接短语中的最左直接短语为该句型的句柄

。(就是在规范分析中最先被归约的子串,可以在语法树中找最左的叶子节点)

(注意题目说的是推导过程每一步的句柄还是语法树的句柄)


素短语

:至少包含一个终结符 且不包含更小素短语的短语


化简文法

1.从S开始一步步看,将含有永远消不掉的符号的产生式消去

2.删除 ε产生式 如 A-> ε

3.删除形如A->B的单产生式0

第三章(词法分析)

右线性文法:形如 A->aB 以及 A->a (非终结符号只能在右边)


状态转换图

(右线性文法,无ε产生式时 )

1.用状态图和正规式描述标识符

20210623100703697.png

结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记(字符)代表在射出节点状态下可能出现得输入字符或字符类。 其中0为初态,2为终态(用双圈表示)。终态结上打个星号*意味着多读进了一个不属于标识符部分得字符,应把它退还给输入串。


正规式与正规集

p47

Σ 为字母表 如 Σ = {A,B,0,1}

1

正规式 正规集
ba * Σ 上所有以b为首后跟任意多个a的字
a(a|b)* Σ上所有以a为首的字
(a|b)* (aa|bb)(a|b) * Σ上所有含有两个相继的a或两个相继的b的字

2

正规式 正规集
(A|B)(A|B|0|1)* Σ 上的“标识符”的全体
(0|1)(0|1)* Σ 上“数”的全体


如果两个正规式所表达的正规集相同,则认为二者等价


确定有限自动机

(DFA)p47页


非确定有限自动机

(NFA)p49页


LEX

(词法分析器的语言p58 上课有讲?) LEX用来描述和自动产生所需的各种词法分析器,包括正规式定义和识别规则两部分,将LEX程序编译后所得结果程序记为L,其作用同有限自动机一样,可用来识别和产生单词符号。

20210622164856322.png#pic_center


正规式

:将文法的终结符号,用* | · 连接成的表达式(这里的*是自反闭包的意思)

1.由正规式构造DFA(分裂法)

2.确定化最小化。(注意最小化,我感觉b站这个大佬视频讲的最小化之前状态集合太少了,感觉最小化方法不太行,我自己百度的)

(1.的规则看补充)

第四章(自下而上语法分析)


自顶向下的语法分析


LL(K)分析->LL(1)

递归下降分析

预测分析


消除左递归性

A->Aα|β ={ A->βA‘ ,A’ = αA’|ε}


求First集

(p78底部)和

Follow 集

(p79)


判断LL(1)文法

1)已经化简无左递归

2)对G中每个产生式A->r1|r2|…rm 其各候选式均满足:

1.First(ri)∩First(j) = ∅(两两不相交)

2.若有候选式为ε(A->ε),则First(ri)(这边指其余候选式)∩ Follow(A)=∅

求LL(1)分析表的三个规则

对于A->ri

1. 求First(ri) = a ,则在m[A,a]处填入此表达式

2.若First(ri) = ε,则求Follow(A) = b(A->ε)

3.其余空着

第五章(自下而上的语法分析)


自底向上的语法分析

简单优先

算符优先

优先函数


LR分析:LR(0)<SLR(1)<LALR(1)<LR(1)<无二义性


句型,句子

假定G是一个文法,S是它的开始符号,称 S    ⟹ * α是一个句型,仅含终结符的句型是一个句子。

注意 * 指0步以上推导,+指1步以上推导(把+记住成正就好记)


语言

文法G所产生的句子的

全体

就是一个语言


最左推导和最右推导


自顶向下

(给你非终结符让你推导出非终结符)

最左推导:被替换的总是当前符号串中的最左非终结符

最右推导:被替换的总是当前符号串中最右的非终结符(规范推导)


自底向上

(归约 比如给你aaaabbbb 让你归约 给你终结符让你归约成非终结符)

最右归约:被归约的总为当前符号串最右

最左规约:被归约的总为当前符号串最左(规范归约)


规范:右推左规


把规范推导逆着看就是规范归约


前缀、活前缀


字的前缀是指该字的任意首部。例如字abc的前缀有ε、a、ab或abc。

所谓活前缀是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号。之所以称为活前缀,是因为在右边增添一些终结符号之后,就可以使它成为一个规范句型。在LR分析工作过程中的任何时候,栈里的文法符号(自栈底而上)X1X2…Xm应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)。因此只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。(我也不太懂活前缀= v =)


关于课本有一题p102面例5.7 wzl大佬(上面链接博客)给了详细解题过程,对概念建立有所帮助


LR(0)项目

1.规约项目(A->α· ) 2.接受项目(s-> α·)

2移进项目(A->α·xβ) 4.待约项目(A->α·Xβ)

LR(0)项目指右边某位置上标有· 的产生式

eg.A->xyz  有四个项目 A->·xyz   A->x·yz  A->xy·z.  A->xyz·

所有等价项目组成一个项目集工,成为项目闭包,每个项目集闭包对应自动机的一个状态

项目集的构造:求基本项目集工的闭包=>找等价项目  eg.S->cc·B   这个时候看出B是一个待约项目则需要去找B能推出什么  B->·ccB  B->·b (看b站视频做题理解一下,我第一次看这边也没看懂,直接跳过看做题)


判断LR(0)文法:无冲突项目(移进-归约 归约-归约 冲突)


LR(0)分析表

(看b站视频)


判断SLR(1)文法

1.DFA中存在冲突项目(移进-归约 归约-归约)

2 In = {A1 -> α·a1β,A2->α·a2β …… ,B1->α·,B2->α·} (这里的In指的是一个状态也叫项目集)

当{a1,a2,….,am}(注意:这个是下一个需要移进的符号的集合),FOLLOW(B1),FOLLOW(B2)…两两不相交时为

SLR(1)

文法


SLR(1)分析表:

与LR(0)不同点在于:对于每一个归约项目   A->α求FOLLOW(A)得到的输入符号处填rn,其余都和LR(0)相同。

第六章(属性文法和语法制导翻译)



属性定义

:在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为


属性


)。


1.


属性代表与文法符号相关信息,如类型、值、代码序列、符号表内容等


2.


属性可以进行计算和传递



语义规则






对于文法的每个产生式都配备了一组属性的计算规则



属性文法


(也称属性翻译文法)是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。.

属性通常分为两类:

综合属性

(自下而上传递信息)和

继承属性

(自下而上传递信息)


所谓



语法制导翻译法






直观上说就是为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则

具体定义请看课本p136页 尾部(说实话我没看明白,有点抽象)

来自课本的特别强调:

1

.终结符

只有

综合属性

,它们由词法分析器提供

2.

非终结符

既可以有

综合属性

,也可以有

继承属性

,文法开始符号的所有继承属性作为属性计算的初始值

S-属性文法:只含有

综合属性

,通常可借助于LR分析器实现,自下而上计算

L-属性文法:可以通过自上而下分析方法(LL(1))的同时实现L属性文法的计算,

S-属性文法一定是L-属性文法


L-属性文法适合于一遍扫描的自上而下分析


S-属性文法适合于一遍扫描的自下而上分析

第七章(语义分析和中间代码生成)

常见中间语言形式:

1.后缀式(逆波兰表示法)操作数在前,算符写在后

2.图表示法:DAG,抽象语法树

3.三地址代码



版权声明:本文为weixin_45683054原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。