编译原理期末速成一

2024-01-08 22:39:47

编译原理速成

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

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

  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 EE?E
  3. E → ( E ) E \rightarrow (E) E(E)
  4. E → i E \rightarrow i Ei

有如下产生式: ( i ? i + i ) (i * i + i) (i?i+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 E4??i 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)(E?E)(i?E)(i?E+E)(i?i+E)(i?i+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)(E?E+i)(E?i+i)(i?i+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∣11?0)? 对应的转换系统

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 5?a?5,, 5 ? ? 1 5\stackrel{\epsilon}{\longrightarrow}1 5???1 1 ? a 3 1\stackrel{a}{\longrightarrow}3 1?a?3,即 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 5?b?5 5 ? ? 1 5\stackrel{\epsilon}{\longrightarrow}1 5???1 1 ? b 4 1\stackrel{b}{\longrightarrow}4 1?b?4,即 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 5?a?5 5 ? ? 1 5\stackrel{\epsilon}{\longrightarrow}1 5???1 3 ? a 2 3\stackrel{a}{\longrightarrow}2 3?a?2 3 ? a 2 ? ? 6 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6 3?a?2???6 3 ? a 2 ? ? 6 ? ? Y 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6\stackrel{\epsilon}{\longrightarrow}Y 3?a?2???6???Y 1 ? a 3 1\stackrel{a}{\longrightarrow}3 1?a?3,即 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 5?b?5 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

文章来源:https://blog.csdn.net/qq_44458671/article/details/135466217
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。