[NOTE]词法分析(1)

词法分析

目标

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

词法-语法的接口

  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
A x B A y B x B B y A\rightarrow xB\\A\rightarrow y\\B\rightarrow xB\\B\rightarrow y
A x y A\rightarrow x|y
A x A y A\rightarrow x\\ A\rightarrow y

正规文法转正规式

产生式 正规式
1 A x B A\rightarrow xB B y B\rightarrow y A = x y A=xy
2 $A\rightarrow xA y$
3 A x A\rightarrow x A y A\rightarrow y $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 :状态转换函数,描述如何进行状态转换, K × Σ K K\times \Sigma\rightarrow K .
  • S:开始状态
  • Z:结束状态/接受状态集

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

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

Usage

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

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

不确定有穷自动机

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

  • K
  • Σ \Sigma
  • f f K × Σ { ξ } ρ ( K ) K\times\Sigma \{\xi\}\rightarrow\rho(K) 映射. ρ ( K ) \rho(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) 的集中至少有一个是接受状态,称该符号串是可识别的.

自动机的等价

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

状态集映射和闭包运算

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

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

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

eg.

ξ _ c l o s u r e ( { 3 , 8 } ) \xi \_closure(\{3,8\}) 在NFA M下
KeTO0A.png

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) 则与之等价的 D F A M ( K , Σ , f , S , Z ) DFA M'=(K' ,\Sigma',f',S',Z') , 其中

  • K = ρ ( K ) K'=\rho(K) ,全部子集的集合
  • Σ = Σ \Sigma '=\Sigma 状态转换集合不变
  • f ( q , a ) = ξ _ c l o s u r e ( M ( q , a ) ) f'(q,a)=\xi\_closure(M(q,a)) :M(q,a)是从q经由a抵达的集合
  • S = ξ _ c l o s u r e ( S ) S'=\xi\_ closure(S) :开始状态集是S的 ξ \xi 闭包
  • Z = { q q K , q Z ϕ } Z'=\{q|q\in K',q\cap Z \not =\phi\} :终结集为 ρ ( K ) \rho (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) 并加入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)) .如果 p ∉ K p\not\in K' ,添加状态.
  4. Loop 3 until 无新状态
  5. 接受状态集(包含任何一个原接受状态的子集(新状态)的集合)

E.g.
KeTO0A.png

  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 ,当且仅当 α Σ , 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 .也就是说状态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.

KmkBr9.png

  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}
    在这里插入图片描述
发布了80 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/POTASSIUM711/article/details/102654664
今日推荐