编译原理期末复习(上)

编译原理期末复习(上)

本质上基本上等价于 parser 的构造,请记住编译原理(特别是大部分学校里开设的编译原理课程)并不能真正教会你编译的原理.

上下文无关文法 & 语法分析树

上下文无关文法的四个要素

  1. 一组终结符(常用小写字母表示)
  2. 一组非终结符(常用大写字母表示)
  3. 一个开始符号(也是非终结符)
  4. 一组产生式 ( s o m e t h i n g → s o m e t h i n g something \rightarrow something somethingsomething

语法分析树

对于各元素,对于各非终结符,选择合适的产生式进行展开

有下列语法:

  1. E → E + E E \rightarrow E+E EE+E
  2. E → E ∗ E E\rightarrow E * E EEE
  3. E → ( E ) E \rightarrow (E) E(E)
  4. E → i E \rightarrow i Ei

有如下产生式: ( i ∗ i + i ) (i * i + i) (ii+i)

步骤如下:

  1. 选择产生式 2

    E
    (
    E1
    )
  2. 选择产生式 0

    E
    (
    E1
    )
    E2
    +
    E3
  3. 选择产生式 1,3

    E
    (
    E1
    )
    E2
    E4
    *
    E5
    +
    E3
    i
  4. 使用产生式 3

    E
    (
    E1
    )
    E2
    E4
    i
    *
    E5
    i
    +
    E3
    i

短语、直接短语、句柄、素短语

E
(
E1
)
E2
E4
*
E5
i
+
E3
E6
短语

同一个双亲节点的叶子节点

E 2 E_2 E2 的短语 E 4 ∗ i E_4 * i E4i E 4 E_4 E4 的短语 i i i

直接短语

双亲结点的叶子结点在同一层

对于这棵子树, E 5 E_5 E5 有直接短语 i i i E 4 E_4 E4 有直接短语 E 6 E_6 E6

句柄

最下层,最左侧的直接短语

句柄是 E 4 E_4 E4 的后继结点 E 6 E_6 E6

素短语
  1. 至少一个终结符
  2. 不包含其他素短语

故有素短语 i i i

最左素短语

i i i

是否为二义性文法

即判定 L ( G ) L(G) L(G) 中是否存在句子不止对应一个最左 / 最右推导

无二义性文法中,产生的每个句子只能对应一颗语法树

仍然对应上段文法,有同样正确的语法树

E
(
E1
)
E2
i
*
E3
E4
i
+
E5
i

说明此文法具有二义性

最左与最右推导

最左推导

每次替换时

  1. 从左侧开始寻找非终结符
  2. 每次利用一个产生式,对一个终结符进行替换
  3. 到没有终结符为止

E → ( E ) → ( E ∗ E ) → ( i ∗ E ) → ( i ∗ E + E ) → ( i ∗ i + E ) → ( i ∗ i + E ) E \rightarrow (E) \rightarrow (E*E)\rightarrow (i*E)\rightarrow (i*E+E) \rightarrow (i*i+E) \rightarrow (i*i+E) E(E)(EE)(iE)(iE+E)(ii+E)(ii+E)

最右推导

每次替换时

  1. 从右侧开始寻找非终结符
  2. 每次利用一个产生式,对一个终结符进行替换
  3. 到没有终结符为止

E → ( E ) → ( E + E ) → ( E + i ) → ( E ∗ E + i ) → ( E ∗ i + i ) → ( i ∗ i + i ) E \rightarrow (E) \rightarrow(E+E) \rightarrow (E+i) \rightarrow (E*E+i) \rightarrow (E*i + i) \rightarrow (i*i+i) E(E)(E+E)(E+i)(EE+i)(Ei+i)(ii+i)

化简文法

  1. S S S 开始,删除永远消不掉的符号
  2. 删除推空 A → ϵ A \rightarrow \epsilon Aϵ
  3. 删除非终结符推非终结符 A → B A \rightarrow B AB

状态转换图

状态转换图基本形态

i
j
1
2
3

状态1时候是情况 i,则 → 2 \rightarrow 2 2

状态1时候是情况 j,则 → 3 \rightarrow 3 3

DFA 与 NFA

DFA 确定有穷自动机

五元式 M = { S , ϵ , δ , S 0 , F } M = \{S,\epsilon,\delta,S_0,F\} M={S,ϵ,δ,S0,F}

紫皮《编译原理》使用的是 M = { K , ∑ , f , S , Z } M = \{K,\sum,f,S,Z\} M={K,,f,S,Z},trivial

S S S:状态的集合(如上图中的 1 , 2 , 3 1,2,3 1,2,3

ϵ \epsilon ϵ:有穷字符集(如上图中的 i , j i,j i,j

δ \delta δ:映射,即跳转时选择分支的规则

S 0 S_0 S0:初始状态(即上图中的 1),可以为空

F F F:最终状态(即上图中的 2 , 3 2,3 2,3

NFA 不确定有穷自动机

初始状态 $S_0 $ 不能为空,其他同 DFA

构造正规式系统

规则

以右递归的方式,运用三个裂解规则

  • 规则 1

    对于

    AB
    i
    j

    A
    B
    i
    k
    j
  • 规则 2

    对于

    AIB
    i
    j

    A
    B
    i
    j
  • 规则 3

    对于

    A*
    i
    j

    ε
    A
    ε
    i
    k
    j
构造正规式相应的转换系统

构造下列正规式 ( 0 ∣ 11 ∗ 0 ) ∗ (0|11*0)* (0110) 对应的转换系统

0I11*0 *
S
Z

运用规则 3

ε
0I11*0
ε
S
1
Z

运用规则 2

ε
11*0
0
ε
S
1
Z

运用规则 1

ε
1
1*0
0
ε
S
1
2
Z

运用规则3

ε
1
1
ε
ε0
0
ε
S
1
2
3
Z

运用规则 1

ε
1
1
ε
ε
0
0
ε
S
1
2
3
4
Z

状态转换矩阵

DFA 的状态转移矩阵
a
b
b
a
a
b
a,b
0
1
2
3

见紫皮《编译原理》P48 图 3.3 同理

有状态转移矩阵

ab
012
132
213
333
NFA 的状态转移矩阵
ε
a,b
ε
a
b
ε
a
b
a,b
ε
X
5
1
3
4
2
6
Y

其状态转移矩阵包括 3 3 3 类集合

  1. 对于 I I I

    • 对于初始状态:经过任意个 ϵ \epsilon ϵ 时转化得到的状态 I I I
    • 对于非初始状态:前面的推导中出现的新的状态集(没出现过的 I a , I b Ia,I_b Ia,Ib
  2. 对于 I a I_a Ia

    经过

    • 一个 a a a+ (跟着)任意个 ϵ \epsilon ϵ

    • 任意个 ϵ \epsilon ϵ

      时转化得到的状态 I a I_a Ia

  3. 对于 I b I_b Ib

    经过

    • 一个 b b b+ (跟着)任意个 ϵ \epsilon ϵ

    • 任意个 ϵ \epsilon ϵ

      时转化得到的状态 I a I_a Ia

写到不再有新的状态集可以加入 X 为止

  • I I I I a I_a Ia I b I_b Ib
    { X , 5 , 1 } \{X,5,1\} {X,5,1} { 5 , 3 , 1 } \{5,3,1\} {5,3,1} { 5 , 4 , 1 } \{5,4,1\} {5,4,1}
    1. 初始状态 x X ⟶ ϵ 5 X\stackrel{\epsilon}{\longrightarrow}5 Xϵ5 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5ϵ1,即 I = { X , 5 , 1 } I = \{X,5,1\} I={X,5,1}
    2. 对于 I I I 中的每一个元素 5 ⟶ a 5 5\stackrel{a}{\longrightarrow}5 5a5,, 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5ϵ1 1 ⟶ a 3 1\stackrel{a}{\longrightarrow}3 1a3,即 I a = { 5 , 3 , 1 } I_a = \{5,3,1\} Ia={5,3,1}
    3. 对于 I I I 中的每一个元素,有 5 ⟶ b 5 5\stackrel{b}{\longrightarrow}5 5b5 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5ϵ1 1 ⟶ b 4 1\stackrel{b}{\longrightarrow}4 1b4,即 I b = { 5 , 4 , 1 } I_b = \{5,4,1\} Ib={5,4,1}
  • I I I I a I_a Ia I b I_b Ib
    { 5 , 3 , 1 } \{5,3,1\} {5,3,1} { 5 , 3 , 1 , 2 , 6 , Y } \{5,3,1,2,6,Y\} {5,3,126Y} { 5 , 4 , 1 } \{5,4,1\} {5,4,1}
    1. 加入新状态 I = { 5 , 3 , 1 } I = \{5,3,1\} I={5,3,1}
    2. 对于 I I I 中的每一个元素,有 5 ⟶ a 5 5\stackrel{a}{\longrightarrow}5 5a5 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5ϵ1 3 ⟶ a 2 3\stackrel{a}{\longrightarrow}2 3a2 3 ⟶ a 2 ⟶ ϵ 6 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6 3a2ϵ6 3 ⟶ a 2 ⟶ ϵ 6 ⟶ ϵ Y 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6\stackrel{\epsilon}{\longrightarrow}Y 3a2ϵ6ϵY 1 ⟶ a 3 1\stackrel{a}{\longrightarrow}3 1a3,即 I a = { 5 , 1 , 2 , 6 , Y , 3 } I_a = \{5,1,2,6,Y,3\} Ia={5,1,2,6,Y,3}
    3. 对于 I I I 中的每一个元素,有 5 ⟶ b 5 5\stackrel{b}{\longrightarrow}5 5b5 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5ϵ1 1 ⟶ ϵ 4 1\stackrel{\epsilon}{\longrightarrow}4 1ϵ4
  • 加入新状态 I = { 5 , 4 , 1 } I = \{5,4,1\} I={5,4,1}

  • 加入新状态 I = { 5 , 3 , 1 , 2 , 6 , Y } I = \{5,3,1,2,6,Y\} I={5,3,1,2,6,Y}

  • 加入新状态 I = { 5 , 4 , 1 , 6 , Y } I = \{5,4,1,6,Y\} I={5,4,1,6,Y}

  • 加入新状态 I = { 5 , 4 , 1 , 2 , 6 , Y } I = \{5,4,1,2,6,Y\} I={5,4,1,2,6,Y}

  • 加入新状态 I = { 5 , 3 , 1 , 6 , Y } I = \{5,3,1,6,Y\} I={5,3,1,6,Y}

NFA 转化为 DFA

将 NFA 中的状态转移矩阵标号

  1. I I I 列记作 $0\sim 6 $
  2. I a , I B I_a,I_B Ia,IB 根据 I I I 的标记写出

此时这个 NFA 的状态转移矩阵已经构成了一个新的 DFA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《编译》——复习资料,可适用于课程学习资料、期末复习资料、自主学习资料等等,复习资料共218页,内容丰富,干货十足! 主要内容包括: 一、概述 1 1.1 课程介绍 1 1.2 编译过程 3 1.3 高级语言程序简介 11 二、程序语言概论 14 2.1 程序语言的定义 14 2.2 文法的形式化定义和分类 18 2.3 文法和语言 22 2.4 语法分析树 29 三、词法分析_1 33 3.1 词法分析概述 33 3.2 词法分析程序的设计 38 3.3 正规式与自动机 41 3.3.1 正规式与正规集 41 3.3.2 确定有限自动机(DFA) 44 3.3.3 非确定有限自动机(NFA) 49 3.4 单元测试 51 四、词汇分析_2 52 4.1正则式和有限自动机的等价 52 五、词法分析_3 59 5.1 DFA的化简 59 六、词法分析_4 62 6.1 词法分析器的自动生成 62 6.2 词法分析程序实现实例 64 七、语法分析—自上而下分析_1 71 7.1 词法分析简介 71 7.2 自顶向下分析简介 73 7.3 消除左递归和回溯 76 八、语法分析—自上而下分析_2 80 8.1 LL(1)分析法 80 8.2 FIRST集和FOLLOW集的构造 82 8.3 单元测试 85 九、语法分析—自上而下分析_3 86 9.1 LL(1)分析表的构造 86 9.2 递归子程序的原理 89 9.3 单元测试 95 十、语法分析—自下而上分析_1 96 10.1 自下而上分析方法的基本思想 96 10.2 分析树与规范规约 99 10.3 符号栈的使用 103 10.4 单元测试 105 十一、语法分析—自下而上分析_2 106 11.1 算符优先文法 106 11.2 优先表构造 109 11.3 算符优先分析算法 112 10.4 单元测试 115 十二、语法分析—自下而上分析_3 116 12.1 LR分析器 116 12.2 LR分析过程 119 12.3 单元测试 132 十三、语法分析—自下而上分析_4 133 13.1 构造识别前缀的DFA 133 13.2 LR(0)项目集规范族构造 140 13.3 由DFA构造LR(0)分析表 146 13.4 单元测试 150 十六、属性文法和语法翻译制导 151 16.1 L-属性文法和自顶向下翻译 151 16.2 自下而上计算继承属性 159 十七、语义分析和中间代码产生_1 166 17.1 语义分析的任务 166 17.2 中间代码的生成 168 17.3 算术表达式和赋值语句 175 17.4 单元测试 178 十八、语义分析和中间代码产生_2 179 18.1 布尔表达式的作用和文法描述 179 18.2 做控制用布尔表达式的翻译(回填) 181 18.3 控制流语句的翻译 186 18.4 控制流语句的翻译(回填) 189 十九、代码优化_1 194 19.1 什么是代码优化 194 19.2 基本块及流图 199 19.3 单元测试 202 二十、代码优化_2 203 20.1 基本块的DAG表示及其作用 203 二十一、重要知识点 213 1. 考试内容及分数分布 213 2. 名词解释 214 3. 简答题 215 4. 结语 216
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值