编译原理 复习 简版 自用

大题

  1. 词法分析的正规式的确定化
  2. LL1文法的分析表构造,包括消除左递归和提取左公因子
  3. LR1分析表的构造

文法与语言

符号串

不包含任何符号的符号串称为空符号串,简称空串,用ε表示。

定义:由字母表上的一些符号串组成的集合。
说明:空集Ø是一个语言,仅含一个空符号串的集合{ε}也是一个语言。Ø和{ε}是不同的语言

正闭包与闭包
设A是符号串的集合,则集合A的正闭包A+和闭包A*定义为
A+ = A1∪A2∪…∪An∪…
A * = A0∪A1∪…∪An∪…

eg:若A={0,1},则A+={0,1,00,01,10,11,000,001,…},A*={ε,0,1,00,01,10,11,000,001,…}。

文法

产生式规则
1)定义:一个产生式规则是一个有序对(A,α)。通常写作A→α或A::=α。
”→"或”::=”表示“定义为”、“由…组成”、“生成”。
2)含义: A→α表示左部符号A生成右部符号串α。
3)若A→α;A→β,则可以写成A→α|β。”|”表示“或”。
4)非终结符号:产生式规则左部出现的符号。
5)终结符号:不是非终结符号的符号。
6)非终结符号既可以出现在产生式规则的左部,也可以出现在产生式规则的右部。终结符号不能出现在产生式规则的左部。
7)非终结符号通常用大写字母或尖括号括起来的部分表示。
2.文法
1)定义:产生式规则的非空有穷集合。由四元组G=(VN,VT,P,Z)组成。
2)VN:是一个非空有穷集合。它的每个元素称为非终结符号。且VN∩VT=Ø。
3)VT:是一个非空有穷集合。它的每个元素称为终结符号。
4)P:是文法规则(产生式规则)的非空有穷集合,每个产生式规则的形式是A→α或A::=α,其中A∈VN,α∈(VN∪VT)*。
5)Z:是一个非终结符号。称为开始符号或识别符号。它至少要在一条产生式规则的左部出现。有它开始识别定义的语言。
6)通常不必将文法的四元组显式地表示出来,而仅需给出文法的产生式规则集。
7)对于两个不同的文法G[Z]和G’[E],若这两个文法生成的语言相同,则称这两个文法是等价的。

0型文法

设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈(VN∪VT)*且至少含有一个非终结符。

α∈(VN∪VT)且至少含有一个非终结符,而 β∈(VN∪VT)

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

1型文法

1型文法也叫上下文有关文法,它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。

注意:虽然要求|β|>=|α|,但有一特例:α→ε也满足1型文法。

每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度

产生式右边大于左边

2型文法

2型文法也叫上下文无关文法,2型文法是在1型文法的基础上,再满足:每一个α→β都有α是非终结符。

每一个α→β都有α是非终结符

产生式左边必须全为非终结符

3型文法

3型文法也叫正规文法,它对应于有限状态自动机。它是在2型文法的基础上满足:A→α|αB(右线性)或A→α|Bα(左线性)。

A→α|αB(右线性)或A→α|Bα(左线性)

产生式右边为一个终结符|一个终结符加上非终结符,且左线性,右线性不能同时出现

语言

2.句型和句子
设有文法G[Z],Z是文法G的开始符号。
1)句型:若Z ⇒* x,x∈(VN∪VT),则称符号串x为文法G[Z]的句型。
2)句子:若Z ⇒
x,x∈VT*,则称符号串x为文法G[Z]的句子。
3)句子一定是句型,句型不一定是句子。
3.语言
1)定义:文法G[Z]产生的所有句子的集合称为文法G所定义的语言,记为L(G[Z]),简写为L(G)。L(G)={x| Z ⇒+ x且x∈VT*}。
2)语言L(G)是VT*的子集。
3)L(G)中的每一个符号串均由终结符号组成,且该符号串能由开始符号Z推导出来。
4.递归规则(直接递归)
1)定义:一个产生式规则中,出现在左部的非终结符也出现在其右部。
2)种类:左递归、右递归、递归。
3)左递归:A→A…
4)右递归:A→…A
5)递归:A→…A…

短语、直接短语、句柄

设G[Z]是一个文法,假定αβδ是文法G的一个句型。
1)短语:若存在Z ⇒+ αAδ且A ⇒+ β,则称β是句型αβδ相对于非终结符A的短语。语法树: 在语法树中表示所有分支结点对应子树,短语即子树叶子对应的符号。注: 子树包括语法树本身,及句型本身也可以称为短语。

2)直接短语:若存在Z ⇒+ αAδ且A⇒β,则称β是句型αβδ相对于产生式规则A→β的直接短语。**语法树:**在语法树中表示为该短语只有上下相邻父子两代的直接子树

3)句柄:一个句型的最左直接短语称为该句型的句柄。语法树: 在语法树上,则表示为最左边的只包含相邻父子节点的短语(最左直接短语)

规范推导和规范归约

1.最左推导:对一个推导序列中的每一步直接推导α⇒β,都是对α中的最左非终结符进行替换。
2.最右推导(规范推导):对一个推导序列中的每一步直接推导α⇒β,都是对α中的最右非终结符进行替换。
3.规范句型:由规范推导得到的句型。
4.最左归约(规范归约):规范推导的逆过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0rsaYVZ-1599200536462)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200824103754444.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A4nm2IRh-1599200536463)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200825175209239.png)]

3.2 词法分析器的手工构造

3.2.1 确定的有限自动机

1.定义:一个确定的有限自动机(DFA) M是一个五元组:M=(S,Σ,δ,s0,F),其中:
1)S是一个有限集,它的每一个元素称为一个状态。
2)Σ是一个有穷字母表,它的每个元素称为一个输入字符。
3)δ是一个从S×Σ到S的单值部分映射。δ(s,a)=s’表示在目前状态s下输入字符为a时,将转换到下一个状态s’。s’被称为s的一个后继状态。
4)s0∈S,s0是唯一的初态。
5)F ⊆S,F是一个终态集,可以为空。
2.DFA的状态转移矩阵
DFA可用一个二维矩阵表示,矩阵的行表示状态,列表示输入字符,矩阵元素表示δ(s,a)的值。
3.DFA的状态转换图
若设DFA M含有m个状态和n个输入字符,则这个图含有m个状态结点,每个结点至多有n条箭弧射出与其它的状态结点相连接,每个箭弧用Σ中的一个不同输入字符作为标记。整张图含有唯一的初态结点和若干终态结点。
4.DFA识别字符串
1)对Σ上的任何符号串w∈Σ*,若存在一条从初态结点到某一终态结点的通路,且该通路上所有弧的标记符连接成的字符串等于w,则称w可被DFA M所识别。若M的初态结点同时又是终态结点,则空字符串ε被M所识别。
2)DFA与语言的关系:DFA M所能识别的符号串的全体记为L(M)。
eg:设DFA M=({0,1,2,3},{a,b},δ,{3}),其中,δ定义为:
δ(0,a)=1,δ(0,b)=2,δ(1,a)=3,δ(1,b)=2,δ(2,a)=1,δ(2,b)=3,δ(3,a)=3,δ(3,b)=3。
在这里插入图片描述

3.3.1 不确定有限自动机

1.定义:一个不确定有限自动机(NFA) M是一个五元组:M=(S,Σ,δ,S0,F),其中:
1)S是一个有限集,它的每一个元素称为一个状态。
2)Σ是一个有穷字母表,它的每个元素称为一个输入字符。
3)δ是一个从S×Σ到S的子集的映射,即δ:S×Σ*→2S
4)S0⊆S,S0是一个非空初态集。
5)F ⊆S,F是一个终态集,可以为空。

不确定有限自动机的判断:

  1. NFA状态转移图中存在ε
  2. 有对于一个状态有两条不同的路转到另一个相同的状态

NFA与语言的关系:

Σ*中所有可被NFA M所识别的符号串的集合记为L(M)。

L(M)为自动状态机M的语言

5.DFA和NFA的关系
1)DFA是NFA的特例,NFA是DFA概念的推广。
2)NFA能识别的语言都能被一个DFA识别。
3)DFA相对NFA的识别程序更容易实现。

3.3.2 不确定有限自动机的化简

1.NFA的确定化:对任给的NFA M。都能相应地构造一个DFA M‘,使得L(M’)=L(M)。
2.NFA的化简思路:DFA的每一个状态代表NFA状态集合的某个子集,构造的DFA使用它的状态去记录NFA读入输入符号之后可能到达的所有状态的集合。
3.闭包:若q为一初始状态s0,让a为ε,则δ(s0,a)={q1,q2,…,qk}为所有等价的状态结点构成的集合,这个集合被称为s0的ε闭包。记为ε-Closure(s0)。
4.推广:集合I的ε-Closure(I)
设I是NFA M的状态集的子集,定义I的ε闭包ε-Closure(I):
1)若q∈I,则q∈ε-Closure(I)。
2)若q∈I,则从q出发经过任意条ε弧而能到达的任何状态q’,有q’∈ ε-Closure(I)。
eg:将下图NFA M确定化。
在这里插入图片描述
生成DFA M‘的初态ε-Closure({0})={0,2,3}。重新命名生成的各个状态:{0,2,3}为0,{1}为1,{2,3}为2,{3}为3。由于{0,2,3}、{2,3}和{3}中均包含M中的终态3,因此0、2、3为M’的终态。
在这里插入图片描述

子集构造法

第一行第一列为初始状态的闭包(包含初始状态和经过ε弧能到达的状态)

后面列根据条件写出move到的状态和这些状态的闭包的集合

下一行为状态表中出现过的但是未曾在第一列出现的状态集合

DFA最小化

  1. 多余状态(从起始状态出发不能到达的状态。)
  2. 死状态(不能从此状态到达最终状态。)
  3. 等价状态(若存在两个状态A,B;若L(A)=L(B),则说这两个状态是等价的。)
  4. 可区别状态 (不等价状态就是可区别状态)
    • 终态和非终态是可区别的
    • 对于两个不同的状态A和B,输入任意符号,转到的状态不相同,则A与B是可区别的

DFN最小化过程

  1. 删除多余状态和子状态;
  2. 等价的状态整合为同一个状态;
    • 1 终结态和非终结态
    • 2 指向是否相同分成两个分组
    • 3 重复2操作,直到分不开

消除左递归

直接消除左递归

P->Pa|b

可以转化为:

P->bP’

p’->aP’|ε

间接消除左递归

A->Bd|e

B->Abc|bAc

A->Abcd|bAcd|e

消除左递归

A->bAcdA’|eA’

A’->bcdA’|ε

消除文法中所有左递归

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wo8qRpjz-1599200536467)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200902162734383.png)]

自上而下的语法分析

自上而下的语法分析就是从开始符号开始由文法规则一步步推导到我们所需要的句子或者句柄。

First集合

  1. 对于终结符而言,FIRST集中的元素只有它本身。
  2. 对于非终结符A而言,
    • 如果开始符是终结符或者空符号串ε,则加入A的FIRST集中;
    • 若开始符是非终结符,则要加入它的不含ε的FIRST集到A的FIRST集中;
    • 若开始符为非终结符,且此非终结符可以取ε,那么将其后面的一个符号的不含ε的FIRST集合加入A的FIRST集中;
    • 若开始符为非终结符,且此非终结符可以取ε,且此非终结符后面没有别的符号,则可以把ε加入A的FIRST集合中。

First集合就是某个字符可能推导出的第一个终结符的集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTccYnKU-1599200536468)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200902165608057.png)]

Follow集合

FOLLOW集对于非终结符而言,是非终结符的全部后紧跟的终结符号的集合。

  1. 如果后跟终结符则加入
  2. 如果后跟非终结符,则加入该非终结符的不含空符号串的FIRST集
  3. 如果后跟非终结符,且非终结符FIRST集可以取ε,则加入该产生式左部的FOLLOW集合
  4. 文法的识别符的FOLLOW集需要额外的加入‘#’。

Follow集合就是某个非终结符后面可能跟的第一个终结符的集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdMg487F-1599200536470)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903234852960.png)]

Select集合

Select集合就是产生式左部的可能的推导结果的起始符号

给定上下文无关文法的产生式A→α, A∈VN,α∈V*,

  1. 若α不能推导出ε,则SELECT(A→α)=FIRST(α)
  2. 若α能推导出ε则:SELECT(A→α)=(FIRST(α) –{ε})∪FOLLOW(A)

需要注意的是,SELECT集是针对产生式而言的。

LL(1)文法

判断方法1

对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的

产生式A—>α|β 满足下列条件:

  1. 不存在左递归

  2. 如果α、β均不能推导出ε,则 FIRST(α) ∩ FIRST(β) = ∅。

    (α、β均不为空,两者FIRST集合无相同符号)

  3. α 和 β 至多有一个能推导出 ε。

  4. 如果 β *═> ε,则 FIRST(α) ∩ FOLLOW(A) = ∅。

(若其中一个推出来空,另一个的FIRST集合与A的FOLLOW集合无相同符号)

判断方法2

对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的

产生式A—>α|β 满足下列条件:

SELECT(A->α)∩SELECT(A->β)= ∅

将满足上述条件的文法称为LL(1)文法。

预测分析表

预测分析表可以用一个矩阵M表示。

  1. 矩阵的行表示非终结符号;

  2. 列表示输入的符号或者#;

  3. 矩阵元素M[U,a]表示对于非终结符号U,面临输入符号a时,向下推到所应该采取的产生式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWFuNkDL-1599200536471)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903235150947.png)]

    SELECT集合构造分析预测表

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRQ8lfuQ-1599200536472)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903235906351.png)]

构造算法

  1. 对文法中的每个产生式A->a执行第二步和第三步
  2. 对于每个非终结符x∈FIRST(a),把A->a加入M[A,x]中00
  3. 如果ε∈FIRST(a),对于任意的x∈FOLLOW(A),将把A->a加入M[A,x]中。

自下而上的语法分析

从输入符号串开始,查找当前句柄,并用产生式将他归约到相应的非终结符号,最后规约成开始符号的一种分析方法。

LR(0)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cc0AEoGN-1599200536472)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903092150227.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDkGlDij-1599200536473)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903092121333.png)]

构造识别活前缀的NFA

在LR分析过程 中,栈里的文法符号(自底向上)和输入串的剩余部分配上后称为规范句型

活前缀

活前缀是指规范句型的一个前缀,这个前缀不含句柄之后的任何符号。

状态

三种:

  1. 活前缀中包含句柄的全部符号
  2. 活前缀中包含句柄的部分符号
  3. 活前缀中无句柄的符号

一个状态由一个或者多个项目构成

项目

对于文法G,其产生式右部添加一个特殊符号 · ;构成文法的一个项目。

特别的S->ε时。S-> · ;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sut1rTht-1599200536473)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903095147775.png)]

活前缀的NFA图

在第一个产生式前面拓展一个产生式。

S’->S为初态

点在最左边的所有状态为终态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWkCBdQ6-1599200536474)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903101742563.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThVGwn83-1599200536475)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903101423726.png)]

构造识别活前缀的DFA

方法1

与第三章方法相同

方法2

求项目集规范族,每个项目集对应一个DFA状态

后继状态

S1接受符号a以后到达S2,则S2是S1关于符号a的后继状态

求项目集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGtjJ6Ws-1599200536475)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903112743080.png)]

本身要加入项目集CLOSURE,若推导式右边的点后面跟的是一个非终结符,则要将这个非终结符的所有开始符为点的推导式,包含在项目集合中CLOSURE.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XlI5R9BC-1599200536476)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903114326765.png)]

LR(0)预测分析表

LR(0)语法分析

项目分类
  1. 移进项目:

    圆点以后为终结符

  2. 待约项目:

    圆点以后为非终结符,对应状态为待约状态

  3. 规约项目:

    圆点以后没有符号,对应状态为归约状态

  4. 接受项目:

    S’->S. 是一个特殊的归约项目,称之为接受项目,对应的是接受状态

项目集相容性

同一个项目集:

  1. 移进项目和归约项目不能并存
  2. 多个归约项目不能并存

这样的项目集称为相容项目集。

冲突:

  1. 移进项目和归约项目并存:移进–归约冲突
  2. 多个归约项目并存:归约–归约冲突

LR(0)文法的判断

若一个文法G的项目集规范族中所有的项目都是相容的,则称文法G为LR(0)文法

分析表构造

Si为当前状态,a为点后面的符号(即下一个扫描的符号)

若 a 是非终结符,将加入符号后生成状态的数字放入GOTO[Si,a]中

若 a 是终结符,将加入符号后生成的状态放入ACTION[Si,a]中

若 a 是空(点后无符号),即归约项目:A->a · ∈Si,若A->a为文法的第 j 个产生式,则对于任意输入符号a,ACTION][Si,*]=rj ; 即Si的所有ACTION都填rj

若S’->a. ACTION[S’,#]填Acc(S‘ 为开始符号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AKQoa6UJ-1599200536477)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903120315112.png)]

SLR(1)

分析表构造

Si为当前状态,a为点后面的符号(即下一个扫描的符号)

若 a 是非终结符,将加入符号后生成状态的数字放入GOTO[Si,a]中

若 a 是终结符,将加入符号后生成的状态放入ACTION[Si,a]中

若 a 是空(点后无符号),即归约项目:A->a · ∈Si,若A->a为文法的第 j 个产生式,则对于任意输入符号b,若b∈FOLLOW(A)则ACTION][Si,a]=rj;(因为归约以后A的后面跟的符号,与归约之前a的后面跟的符号应该相同,即 b∈FOLLOW(A))

若S’->a. ACTION[S’,#]填Acc(S‘ 为开始符号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U04UINFC-1599200536477)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903160546347.png)]

LR(1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUTEg75e-1599200536478)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903134144452.png)]

项目集构成

项目构成:

在LR(0)项目中放置一个向前搜索的符号x,成为[A->a.b,x]

特殊的:[S’->S,#]属于初始项目集中的一个LR(1)项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XG7rqZKy-1599200536479)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903135627270.png)]

每一个LR(1)项目与其后继项目由相同的向前搜索符

即A->a·xb,k 输入一个x后 A->ax·b,k k不变

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GuySPhBn-1599200536479)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903140248592.png)]

分析表构造

Si为当前状态,a为点后面的符号(即下一个扫描的符号)

若 a 是非终结符,将加入符号后生成状态的数字放入GOTO[Si,a]中

若 a 是终结符,将加入符号后生成的状态放入ACTION[Si,a]中

若 a 是空(点后无符号),即归约项目:A->a · ∈Si,同时还有X->cA · d,若A->a为文法的第 j 个产生式,则对于任意输入符号b,若b∈FIRST(d),则ACTION][Si,a]=rj;(即若A->a ·归约以后,含A的式子后面跟的一定是A后面的d的FIRST集合,而不一定是A的FOLLOW集,因为A在别的产生式中可能还有FOLLOW的内容)

若S’->a. ACTION[S’,#]填Acc(S‘ 为开始符号)

[外链图片转存中…(img-XG7rqZKy-1599200536479)]

每一个LR(1)项目与其后继项目由相同的向前搜索符

即A->a·xb,k 输入一个x后 A->ax·b,k k不变

[外链图片转存中…(img-GuySPhBn-1599200536479)]

分析表构造

Si为当前状态,a为点后面的符号(即下一个扫描的符号)

若 a 是非终结符,将加入符号后生成状态的数字放入GOTO[Si,a]中

若 a 是终结符,将加入符号后生成的状态放入ACTION[Si,a]中

若 a 是空(点后无符号),即归约项目:A->a · ∈Si,同时还有X->cA · d,若A->a为文法的第 j 个产生式,则对于任意输入符号b,若b∈FIRST(d),则ACTION][Si,a]=rj;(即若A->a ·归约以后,含A的式子后面跟的一定是A后面的d的FIRST集合,而不一定是A的FOLLOW集,因为A在别的产生式中可能还有FOLLOW的内容)

若S’->a. ACTION[S’,#]填Acc(S‘ 为开始符号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfxUnaZQ-1599200536480)(C:\Users\KoreyChan\AppData\Roaming\Typora\typora-user-images\image-20200903160629446.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值