[NOTE]词法分析(1)

词法分析

文章目录

  • 词法分析
    • 目标
      • 词法-语法的接口
    • 正规文法
    • 正规式
      • 正规式和正规文法的转换
        • 正规式转正规文法
        • 正规文法转正规式
    • 有穷自动机
      • 确定有穷自动机
        • Usage
      • 不确定有穷自动机
        • Usage
      • 自动机的等价
      • 状态集映射和闭包运算
      • NFA到DFA(*)
        • 子集法:适用于 ξ \xi ξ类型的NFA
        • 列表法:适用于无 ξ \xi ξ的NFA
    • DFA的最小化

目标

扫描源程序,转换为基于单词理解的源程序(种类,单词)

词法-语法的接口

  1. 词法分析程序和语法分析程序各自独立一趟方式。即词法分析程序把字符流的源程序转换成单词流的内部程序形式,供语法分析程序之用。
  2. 词法分析程序和语法分析程序合并为一趟方式。即词法分析程序由反复语法分析程序调用,每调用一次从源程序中一个新单词返回给语法分析程序。

正规文法

在電腦科學中,正規文法是產生式規則取下述形式的一種形式文法(N, Σ, P, S):

  1. A -> a ,此處的A是N中的非終結符號,a是Σ中的終結符號;
  2. A -> aB,此處的A和B是N中的非終結符號,a是Σ中的終結符號;
  3. C -> ε,此處的C是N中的非終結符號。
    下面給出一個正規文法的例子: 文法G = (N, Σ, P, S),其中N = {S, A},Σ = {a, b, c},S是起始符號,P包含下述規則:
  • S -> aS
  • S -> bA
  • A -> ε
  • A -> cA

常用的符号:

  • l:<字母/数字>

  • d:<无符号整数>

正规式

就是正则表达式…

常用的:

∣ , ∗ |,* ,

正规式和正规文法的转换

正规式转正规文法

A → x ∗ y A\rightarrow x^*y Axy
A → x B A → y B → x B B → y A\rightarrow xB\\A\rightarrow y\\B\rightarrow xB\\B\rightarrow y AxBAyBxBBy
A → x ∣ y A\rightarrow x|y Axy
A → x A → y A\rightarrow x\\ A\rightarrow y AxAy

正规文法转正规式

产生式 正规式
1 A → x B A\rightarrow xB AxB B → y B\rightarrow y By A = x y A=xy A=xy
2 $A\rightarrow xA y$
3 A → x A\rightarrow x Ax A → y A\rightarrow y Ay $A=x

最后得到一个正规式.

See http://blog.GYsina.com.cn/s/blog_59a1e8de01009vsf.html

有穷自动机

See https://zh.wikipedia.org/wiki/%E7%A1%AE%E5%AE%9A%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E8%87%AA%E5%8A%A8%E6%9C%BA

确定有穷自动机

一个确定有穷自动机的五元组:

  • K 状态(节点)的集合
  • Σ \Sigma Σ:有穷字母表,状态转换的集合
  • f f f:状态转换函数,描述如何进行状态转换, K × Σ → K K\times \Sigma\rightarrow K K×ΣK.
  • S:开始状态
  • Z:结束状态/接受状态集

f f f也可以扩充为自身的闭包: K × Σ ∗ → K K\times\Sigma^*\rightarrow K K×ΣK映射.

描述: f ( A , b ) = B f(A,b)=B f(A,b)=B通过b从A转移到B.

Usage

確定有限狀態自動機從起始狀態開始,一個字元接一個字元地讀入一個字串 w ∈ Σ ∗ w ∈ Σ ∗ {\displaystyle w\in \Sigma ^{*}}w\in \Sigma ^{*} wΣwΣ(這裡的 ∗ ∗ {\displaystyle {}^{*}}{}^{*} 指示Kleene星號算子。),並根據給定的轉移函式一步一步地轉移至下一個狀態。在讀完該字串後,如果該自動機停在一個屬於F的接受狀態,那麼它就接受該字串,反之則拒絕該字串。

一个确定有穷自动机的接受的串集合是L(M), L ( M ) = { α ∣ α ∈ Σ ∗ , f ′ ( S , α ) ∈ Z } L(M)=\{\alpha|\alpha\in\Sigma^*,f'(S,\alpha)\in Z\} L(M)={ααΣ,f(S,α)Z}

不确定有穷自动机

一个不确定有穷自动机的五元组:

  • K
  • Σ \Sigma Σ
  • f f f K × Σ { ξ } → ρ ( K ) K\times\Sigma \{\xi\}\rightarrow\rho(K) K×Σ{ξ}ρ(K)映射. ρ ( K ) \rho(K) ρ(K)是K的幂集.
  • S:开始状态集
  • Z:接收状态集

所谓的不确定就是同样的状态,同样的输入,导向的下一个状态是一个集合.

函数的扩充也是基于幂集运算.
KaTeX parse error: No such environment: equation at position 21: …,a\beta)=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \left\{ …

Usage

f ′ ( I , a β ) f'(I,a\beta) f(I,aβ)的集中至少有一个是接受状态,称该符号串是可识别的.

自动机的等价

自动机以接受符号串的集合判定等价.
L ( M 1 ) = L ( M 2 ) L(M_1)=L(M_2) L(M1)=L(M2)

状态集映射和闭包运算

ξ _ c l o s u r e ( I ) \xi \_closure(I) ξ_closure(I)是非确定自动机下的闭包运算,

假定I是NFA M的状态集的一个子集, 我们定义
ε_CLOSURE(I)为:

  • 若s∈I,则s∈ ξ _ c l o s u r e ( I ) \xi \_closure(I) ξ_closure(I)
  • 若s∈I,那么从**s出发经过任意条ε弧而能到达的任何状态s’**都属于 ξ _ c l o s u r e ( I ) \xi \_closure(I) ξ_closure(I).
  • 状态集 ξ _ c l o s u r e ( I ) \xi \_closure(I) ξ_closure(I)称为I的ε_闭包.

eg.

ξ _ c l o s u r e ( { 3 , 8 } ) \xi \_closure(\{3,8\}) ξ_closure({3,8})在NFA M下
[NOTE]词法分析(1)_第1张图片

3:3,6,7,0,1,2,4

8:8,None

NFA到DFA(*)

将 NFA 转换成等价的 DFA 里, NFA 到相应的 DFA 的构造的基本思想是让 DFA 的每一个状态对应 NFA 的一组状态。也就是说让 DFA 使用它的状态去记录在 NFA 读入一个输入符号后可能达到的所有状态,在读入输入符号之后, DFA 处在 a 1 a 2 …a n 那样一个状态,该状态表示这个 NFA 的状态的一个子集 T , T 是从 NFA 的开始状态沿着某个标记为 a 1 a 2 …a n 可以达到的那些状态构成的。

子集法:适用于 ξ \xi ξ类型的NFA

N F A M = ( K , Σ , f , S , Z ) NFA M=(K,\Sigma,f,S,Z) NFAM(K,Σ,f,S,Z)则与之等价的 D F A M ′ = ( K ′ , Σ ′ , f ′ , S ′ , Z ′ ) DFA M'=(K' ,\Sigma',f',S',Z') DFAM(K,Σ,f,S,Z), 其中

  • K ′ = ρ ( K ) K'=\rho(K) K=ρ(K),全部子集的集合
  • Σ ′ = Σ \Sigma '=\Sigma Σ=Σ 状态转换集合不变
  • f ′ ( q , a ) = ξ _ c l o s u r e ( M ( q , a ) ) f'(q,a)=\xi\_closure(M(q,a)) f(q,a)=ξ_closure(M(q,a)):M(q,a)是从q经由a抵达的集合
  • S ′ = ξ _ c l o s u r e ( S ) S'=\xi\_ closure(S) S=ξ_closure(S):开始状态集是S的 ξ \xi ξ闭包
  • KaTeX parse error: Undefined control sequence: \and at position 17: …'=\{q|q\in K',q\̲a̲n̲d̲ ̲Z \not =\phi\}:终结集为 ρ ( K ) \rho (K) ρ(K)和原终结集的交集.

Examples See: https://blog.csdn.net/u012359618/article/details/42456771

See Also: https://zhuanlan.zhihu.com/p/31158595

https://blog.crimx.com/2014/03/16/nfa-to-dfa/

具体步骤:

  1. K’=empty
  2. S ′ = ξ _ e n c l o s u r e ( S ) S'=\xi\_ enclosure(S) S=ξ_enclosure(S)并加入K’
  3. 对于K’的每一个新增状态q,计算每一个转换状态a的转换目的地p: f ′ ( q , a ) = p = ξ _ e n c l o s u r e ( M ( q , a ) ) f'(q,a)=p=\xi\_ enclosure(M(q,a)) f(q,a)=p=ξ_enclosure(M(q,a)).如果 p ∉ K ′ p\not\in K' pK,添加状态.
  4. Loop 3 until 无新状态
  5. 接受状态集(包含任何一个原接受状态的子集(新状态)的集合)

E.g.
[NOTE]词法分析(1)_第2张图片

  1. S’={0,1,2,4,7}
  2. S’的2->{3,6,1,7}(A) with a
  3. S’的4->{5,6,1,7}(B) with b
  4. S’的7->{8}© with a
  5. A’s 7->C with a
  6. B’s 7->C with a
  7. C’s 8->{9}(D) with b
  8. D’s 9->{10}(E) with b
  9. E is end set.

列表法:适用于无 ξ \xi ξ的NFA

See: https://blog.51cto.com/luochen2015/1867470

DFA的最小化

是指寻找与之等价的、状态个数达到最小的DFA M’。这样的DFA M’,称为最小化的DFA。

等价: p ∈ K , q ∈ K p\in K,q\in K pK,qK,当且仅当 ∀ α ∈ Σ ∗ , f ( p , α ) ∈ Z   e q u a l s   t o   f ( q , α ) ∈ Z \forall \alpha\in\Sigma ^*,f(p,\alpha)\in Z\ equals\ to\ f(q,\alpha )\in Z αΣ,f(p,α)Z equals to f(q,α)Z.也就是说状态p和等价状态q经过相同的路径(途径状态也相同)到达终结状态.

1.兼容性(一致性)——同是终态或同是非终态;2.传播性(蔓延性)——从s出发读入某个a和从t出发经过某个a并且经过某个b到达的状态等价。

See: https://www.cnblogs.com/wendellyi/p/3695489.html

最小化的定义: 1.没有多余的状态(死状态)2.没有两个状态是相互等价的.

步骤:

  1. 划分为{终结状态}/{非终结状态}
  2. 考察终结态可分:标准:经由相同路径到达同一外部大状态的可以划分为一类
  3. 考察非终结态
  4. Until不可再分
  5. 归并,一个大状态用一个小状态代表.

对于是否可以再分,有一个形式化的定义.
  任意的c属于字符集合Σ,si经由c到达sx,以及sj经由c到达sy,那么sx和sy均属于的状态集合pt。如果有任何状态sk属于pt,dk经由c到达dz,dz不属于pt,那么dk不能再继续留在pt中。

E.g.

[NOTE]词法分析(1)_第3张图片

  1. {CDEF},{SBA}
  2. CDEF没有导向外部的 不做分割
  3. {S,B}->A(SBA) by a,{A}->C(DCEF) by a,分割;
  4. {S}->B(SB) by b, {B}->D(DCEF) by b, 分割;
  5. 最后结果:{S},{A},{B},{CDEF}
    [NOTE]词法分析(1)_第4张图片

你可能感兴趣的:(编译原理)