编译原理期末速成一

编译原理速成

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

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

  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)* (0∣110) 对应的转换系统

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值