词法分析
文章目录
目标
扫描源程序,转换为基于单词理解的源程序(种类,单词)
词法-语法的接口
- 词法分析程序和语法分析程序各自独立一趟方式。即词法分析程序把字符流的源程序转换成单词流的内部程序形式,供语法分析程序之用。
- 词法分析程序和语法分析程序合并为一趟方式。即词法分析程序由反复语法分析程序调用,每调用一次从源程序中一个新单词返回给语法分析程序。
正规文法
在電腦科學中,正規文法是產生式規則取下述形式的一種形式文法(N, Σ, P, S):
- A -> a ,此處的A是N中的非終結符號,a是Σ中的終結符號;
- A -> aB,此處的A和B是N中的非終結符號,a是Σ中的終結符號;
- C -> ε,此處的C是N中的非終結符號。
下面給出一個正規文法的例子: 文法G = (N, Σ, P, S),其中N = {S, A},Σ = {a, b, c},S是起始符號,P包含下述規則:
- S -> aS
- S -> bA
- A -> ε
- A -> cA
常用的符号:
-
l:<字母/数字>
-
d:<无符号整数>
正规式
就是正则表达式…
常用的:
正规式和正规文法的转换
正规式转正规文法
正规文法转正规式
产生式 | 正规式 | |
---|---|---|
1 | ||
2 | $A\rightarrow xA | y$ |
3 | $A=x |
最后得到一个正规式.
See http://blog.GYsina.com.cn/s/blog_59a1e8de01009vsf.html
有穷自动机
确定有穷自动机
一个确定有穷自动机的五元组:
- K 状态(节点)的集合
- :有穷字母表,状态转换的集合
- :状态转换函数,描述如何进行状态转换, .
- S:开始状态
- Z:结束状态集/接受状态集
也可以扩充为自身的闭包: 映射.
描述: 通过b从A转移到B.
Usage
確定有限狀態自動機從起始狀態開始,一個字元接一個字元地讀入一個字串 (這裡的 指示Kleene星號算子。),並根據給定的轉移函式一步一步地轉移至下一個狀態。在讀完該字串後,如果該自動機停在一個屬於F的接受狀態,那麼它就接受該字串,反之則拒絕該字串。
一个确定有穷自动机的接受的串集合是L(M),
不确定有穷自动机
一个不确定有穷自动机的五元组:
- 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
当 的集中至少有一个是接受状态,称该符号串是可识别的.
自动机的等价
自动机以接受符号串的集合判定等价.
状态集映射和闭包运算
是非确定自动机下的闭包运算,
假定I是NFA M的状态集的一个子集, 我们定义
ε_CLOSURE(I)为:
- 若s∈I,则s∈ ;
- 若s∈I,那么从**s出发经过任意条ε弧而能到达的任何状态s’**都属于 .
- 状态集 称为I的ε_闭包.
eg.
求
在NFA M下
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 可以达到的那些状态构成的。
子集法:适用于 类型的NFA
设 则与之等价的 , 其中
- ,全部子集的集合
- 状态转换集合不变
- :M(q,a)是从q经由a抵达的集合
- :开始状态集是S的 闭包
- :终结集为 和原终结集的交集.
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/
具体步骤:
- K’=empty
- 并加入K’
- 对于K’的每一个新增状态q,计算每一个转换状态a的转换目的地p: .如果 ,添加状态.
- Loop 3 until 无新状态
- 接受状态集(包含任何一个原接受状态的子集(新状态)的集合)
E.g.
- S’={0,1,2,4,7}
- S’的2->{3,6,1,7}(A) with a
- S’的4->{5,6,1,7}(B) with b
- S’的7->{8}© with a
- A’s 7->C with a
- B’s 7->C with a
- C’s 8->{9}(D) with b
- D’s 9->{10}(E) with b
- E is end set.
列表法:适用于无 的NFA
See: https://blog.51cto.com/luochen2015/1867470
DFA的最小化
是指寻找与之等价的、状态个数达到最小的DFA M’。这样的DFA M’,称为最小化的DFA。
等价: ,当且仅当 .也就是说状态p和等价状态q经过相同的路径(途径状态也相同)到达终结状态.
1.兼容性(一致性)——同是终态或同是非终态;2.传播性(蔓延性)——从s出发读入某个a和从t出发经过某个a并且经过某个b到达的状态等价。
See: https://www.cnblogs.com/wendellyi/p/3695489.html
最小化的定义: 1.没有多余的状态(死状态)2.没有两个状态是相互等价的.
步骤:
- 划分为{终结状态}/{非终结状态}
- 考察终结态可分:标准:经由相同路径到达同一外部大状态的可以划分为一类
- 考察非终结态
- Until不可再分
- 归并,一个大状态用一个小状态代表.
对于是否可以再分,有一个形式化的定义.
任意的c属于字符集合Σ,si经由c到达sx,以及sj经由c到达sy,那么sx和sy均属于的状态集合pt。如果有任何状态sk属于pt,dk经由c到达dz,dz不属于pt,那么dk不能再继续留在pt中。
E.g.
- {CDEF},{SBA}
- CDEF没有导向外部的 不做分割
- {S,B}->A(SBA) by a,{A}->C(DCEF) by a,分割;
- {S}->B(SB) by b, {B}->D(DCEF) by b, 分割;
- 最后结果:{S},{A},{B},{CDEF}