一、 语言和文法
1、字母表、符号串、语言
字母表:符号(字母、数字、各种标点和运算符等)的非空有限集合。
符号串:定义在某个字母表上,由该字母表中的符号组成的有限长度的符号序列。空串用 ε \varepsilon ε 表示。
符号串的运算:
- 字符串 α \alpha α 的长度: ∣ α ∣ |\alpha| ∣α∣,表示 α \alpha α 中出现的符号的个数。 ∣ ε ∣ = 0 |\varepsilon|=0 ∣ε∣=0
- 字符串 α \alpha α 的前缀:从符号串 α \alpha α 的末尾删除任意个字符后得到的符号串,包括 ε \varepsilon ε 和 α \alpha α
- 字符串 α \alpha α 的后缀:从符号串 α \alpha α 的开头删除任意个字符后得到的符号串,包括 ε \varepsilon ε 和 α \alpha α
- 字符串 α \alpha α 的子串:从符号串 α \alpha α 的开头/末尾删除任意个字符后得到的符号串
- 符号串 α \alpha α 的真前缀、真后缀、真子串:从 α \alpha α 的前缀、后缀、子串中分别删掉 α \alpha α
- 符号串 α \alpha α 的子序列:从符号串 α \alpha α 中删除任意个符号后得到的符号串,被删的符号可以不连续
- 符号串的连接:拼起来。 ε α = α ε = α \varepsilon\alpha=\alpha\varepsilon=\alpha εα=αε=α
- 符号串 α \alpha α 的 n n n 次幂: n n n 个 α \alpha α 拼起来。 α 0 = ε \alpha^0=\varepsilon α0=ε
语言:在某个确定字母表上的符号串的集合。
语言的运算:
- 语言 L L L 和语言 M M M 的并: L ∪ M = { s ∣ s ∈ L 或 s ∈ M } L\cup M=\left\{ s|s\in L\text{或}s\in M \right\} L∪M={s∣s∈L或s∈M}
- 语言 L L L 和语言 M M M 的连接: L M = { LM=\{ LM={ s t st st ∣ s ∈ L , t ∈ M } |s\in L,t\in M\} ∣s∈L,t∈M}
- 语言 L L L 的 n n n 次幂: L n = L L n − 1 , L 0 = { ε } L^n=LL^{n-1},L^0=\left\{ \varepsilon \right\} Ln=LLn−1,L0={ε}
- 语言 L L L 的 Kleene 闭包: L ∗ = L 0 ∪ L 1 ∪ L 2 ∪ L 3 ∪ ⋯ L^*=L^0\cup L^1\cup L^2\cup L^3\cup \cdots L∗=L0∪L1∪L2∪L3∪⋯
- 语言 L L L 的正闭包: L + = L 1 ∪ L 2 ∪ L 3 ∪ ⋯ L^+=L^1\cup L^2\cup L^3\cup \cdots L+=L1∪L2∪L3∪⋯
2、文法及其形式定义
文法的形式定义:
💡 文法描述的语言是唯一的,但用于描述语言的方法不唯一
文法的分类:根据对产生式的施加条件不同进行划分,文法由强到弱,逐级包含
约定:“文法” 默认为上下文无关文法
巴科斯范式元符号:
- “ : : = ” “::=” “::=”:定义为 / 由……组成
- “ < . . . > ” “<...>” “<...>”:非终结符号
- “ ∣ ” “|” “∣”:或
文法的书写约定:
终结符号 | 非终结符号 | 文法符号 | 终结符号串 | 文法符号串 |
---|---|---|---|---|
a b c a\ b\ c a b c 等 | A B C S 等,S 常作开始符号 | X Y Z X\ Y\ Z X Y Z 等 | u v z u\ v\ z u v z 等 | α β γ \alpha\ \beta\ \gamma α β γ 等 |
正体字符串:id if then 等 | 小写斜体字符串: e x p r t e r m expr\ term expr term 等 | |||
+ − ∗ / +\ -\ *\ / + − ∗ / 等 | ||||
( ) , : = (\ )\ ,\ :\ = ( ) , : = 等 | ||||
1 2 … 9 | ||||
ε \varepsilon ε ∅ 等 |
通常,可以直接用产生式的集合代替四元组来描述文法,第一个产生式的左部符号是文法的开始符号。
3、推导和短语
推导:
假定
A
→
γ
A\rightarrow\gamma
A→γ 是一个产生式,则有
α
A
β
⇒
α
γ
β
\alpha A\beta\Rightarrow\alpha\gamma\beta
αAβ⇒αγβ,
“
⇒
”
“\Rightarrow”
“⇒” 表示一步推导
如果有直接推导序列
α
1
⇒
α
2
⇒
.
.
.
⇒
α
n
\alpha_1\Rightarrow\alpha_2\Rightarrow...\Rightarrow\alpha_n
α1⇒α2⇒...⇒αn,则记作
α
1
⇒
∗
α
n
\alpha _1\overset{*}{\Rightarrow}\alpha _n
α1⇒∗αn,
“
⇒
∗
”
“\overset{*}{\Rightarrow}”
“⇒∗” 表示 0 步或多步推导,
“
⇒
+
”
“\overset{+}{\Rightarrow}”
“⇒+” 表示 1 步或多步推导
如果
α
⇒
∗
β
\alpha \overset{*}{\Rightarrow}\beta
α⇒∗β,且在每一步推导中都替换
α
\alpha
α 中最左边的非终结符号,则称为最左推导,记作
α
⇒
∗
l
m
β
\alpha \underset{\mathrm{lm}}{\overset{*}{\Rightarrow}}\beta
αlm⇒∗β
如果
α
⇒
∗
β
\alpha \overset{*}{\Rightarrow}\beta
α⇒∗β,且在每一步推导中都替换
α
\alpha
α 中最右边的非终结符号,则称为最右推导,记作
α
⇒
∗
r
m
β
\alpha \underset{\mathrm{rm}}{\overset{*}{\Rightarrow}}\beta
αrm⇒∗β
最右推导也称规范推导
句型:对于文法
G
=
(
V
T
,
V
N
,
S
,
φ
)
G=(V_T,V_N,S,\varphi)
G=(VT,VN,S,φ),如果
S
⇒
∗
α
S\overset{*}{\Rightarrow}\alpha
S⇒∗α,则称
α
\alpha
α 为文法
G
G
G 的一个句型
句子:仅含有终结符的句型是文法的句子
语言:文法
G
G
G 的所有句子组成的集合,记作
L
(
G
)
L(G)
L(G)
短语:对于文法
G
=
(
V
T
,
V
N
,
S
,
φ
)
G=(V_T,V_N,S,\varphi)
G=(VT,VN,S,φ),
如果
S
⇒
∗
α
A
δ
⇒
+
α
β
δ
S\overset{*}{\Rightarrow}\alpha A\delta\overset{+}{\Rightarrow}\alpha\beta\delta
S⇒∗αAδ⇒+αβδ,则称
β
\beta
β 是句型
α
β
δ
\alpha\beta\delta
αβδ 关于非终结符号
A
A
A 的短语
如果
S
⇒
∗
α
A
δ
⇒
α
β
δ
S\overset{*}{\Rightarrow}\alpha A\delta\ {\Rightarrow}\ \alpha\beta\delta
S⇒∗αAδ ⇒ αβδ,则称
β
\beta
β 是句型
α
β
δ
\alpha\beta\delta
αβδ 关于非终结符号
A
A
A 的直接短语
句柄:一个句型的最左直接短语称为该句型的句柄
4、分析树及二义性
分析树 / 推导树:推导的图形表示,内部结点由非终结符号标记,叶结点由非终结符号或终结符号标记
💡 一颗分析树可以对应多个推导过程
分析树的子树:如果子树的根结点的标记是非终结符号 A A A,则该子树为 A A A-子树
子树与短语的关系:
- 分析树所有叶结点从左到右排列起来,构成一个句型
- 分析树的一颗子树所有叶结点从左到右排列起来,构成该句型的一个相对于子树根节点的短语
- 分析树的一颗只有父子两代的子树所有叶结点从左到右排列起来,构成该句型的一个相对于子树根节点的直接短语
- 分析树中最左边的直接短语就是该句型的句柄
【例】画出如下推导的分析树,说明该句型的短语、直接短语和句柄。
【答】 分析树如下:
短语有:
i
1
∗
(
i
2
+
T
)
i_1*(i_2+T)
i1∗(i2+T)、
i
1
i_1
i1、
i
2
i_2
i2、
(
i
2
+
T
)
(i_2+T)
(i2+T)、
i
2
+
T
i_2+T
i2+T
直接短语有:
i
1
i_1
i1、
i
2
i_2
i2
句柄为:
i
1
i_1
i1
二义性:
如果一个文法的某个句子(或句型)有不止一颗分析树与之对应,则这个句子(或句型)是二义性的。含有二义性句子(或句型)的文法是二义性文法。
如果两个文法产生的语言相同,则称这两个文法是等价的。
有时可以一个二义性的文法变换为一个与之等价的但无二义性的文法,有时不能,若一种语言不存在无二义性的文法,这样的语言称为二义性的语言。
5、文法变换
1)文法二义性的消除
【例】有文法如下图,判断是否有二义性,若有则进行消除。
【答】 对于句子
i
f
e
1
t
h
e
n
i
f
e
2
t
h
e
n
o
t
h
e
r
1
e
l
s
e
o
t
h
e
r
2
\mathrm{if}\ e_1 \mathrm{then}\ \mathrm{if}\ e_2\ \mathrm{then}\ other_1\ \mathrm{else}\ other_2
if e1then if e2 then other1 else other2 有以下两颗不同的分析树“
故这个文法是二义性的。
可以通过规定 “else 必须匹配离它最近的那个未与 else 匹配的 then”,即最近最后匹配原则来消除二义性。
将文法改写为:
根据改写后的文法,上述句子只有一颗分析树:
2)左递归的消除(暂时先空下)
二、有限自动机
含义:具有离散输入和输出的一种数学模型,系统可以处于有限个内部状态的任何一个中。
分类:
确定的有限自动机(
D
F
A
\mathrm{DFA}
DFA)—— 后继状态唯一
非确定的有限自动机(
N
F
A
\mathrm{NFA}
NFA)—— 后继状态不唯一
描述形式:状态转换图、状态转换矩阵/表
1、DFA
字符串识别:对
Σ
\Sigma
Σ 上的任何符号串
ω
∈
Σ
∗
\omega \in \Sigma ^*
ω∈Σ∗,若存在一条从初态结点到终态结点的路径,该路径上每条边的标记连接成的符号串恰好是
ω
\omega
ω,则称
ω
\omega
ω 能为
D
F
A
M
\mathrm{DFA}\ M
DFA M 所识别。
语言识别: D F A M \mathrm{DFA}\ M DFA M 所能识别的符号串全体记为 L ( M ) L(M) L(M),称为 D F A M \mathrm{DFA}\ M DFA M 所识别的语言。 L ( M ) = ( ω ∣ ω ∈ Σ ∗ , 并且存在 q ∈ F , 使 δ ( q 0 , ω ) = q ) L\left( M \right) =\left( \omega |\omega \in \varSigma ^*,\text{并且存在}q\in F,\text{使}\delta \left( q_0,\omega \right) =q \right) L(M)=(ω∣ω∈Σ∗,并且存在q∈F,使δ(q0,ω)=q)
【例】设有
D
F
A
M
=
(
{
0
,
1
}
,
{
A
,
B
,
C
,
S
,
f
}
,
S
,
{
f
}
,
δ
)
{\mathrm{DFA}\ M=\left( \left\{ 0,1 \right\} ,\left\{ A,B,C,S,f \right\} ,S,\left\{ f \right\} ,\delta \right) }
DFA M=({0,1},{A,B,C,S,f},S,{f},δ),其中
δ
(
S
,
0
)
=
B
δ
(
A
,
0
)
=
f
δ
(
B
,
0
)
=
C
δ
(
C
,
0
)
=
f
δ
(
S
,
1
)
=
A
δ
(
A
,
1
)
=
C
δ
(
B
,
1
)
=
f
δ
(
C
,
1
)
=
f
\delta \left( S,0 \right) =B\,\ \ \ \, \delta \left( A,0 \right) =f\,\ \ \ \, \delta \left( B,0 \right) =C\,\ \ \ \, \delta \left( C,0 \right) =f \\ \delta \left( S,1 \right) =A\,\ \ \ \, \delta \left( A,1 \right) =C\,\ \ \ \, \delta \left( B,1 \right) =f\,\ \ \ \, \delta \left( C,1 \right) =f
δ(S,0)=B δ(A,0)=f δ(B,0)=C δ(C,0)=fδ(S,1)=A δ(A,1)=C δ(B,1)=f δ(C,1)=f
M
M
M的状态转换图为:
M
M
M的状态转换矩阵为:
L
(
M
)
=
{
10
,
110
,
111
,
01
,
000
,
001
}
L\left( M \right) =\left\{ 10,110,111,01,000,001 \right\}
L(M)={10,110,111,01,000,001}
2、NFA
字符串识别:对
Σ
\Sigma
Σ 上的任何符号串
ω
∈
Σ
∗
\omega \in \Sigma ^*
ω∈Σ∗,若存在一条从初态结点到终态结点的路径,该路径上每条边的标记连接成的符号串恰好是
ω
\omega
ω,则称
ω
\omega
ω 能为
N
F
A
M
\mathrm{NFA}\ M
NFA M 所识别。
语言识别: N F A M \mathrm{NFA}\ M NFA M 所能识别的符号串全体记为 L ( M ) L(M) L(M),称为 N F A M \mathrm{NFA}\ M NFA M 所识别的语言。
【例】设有
N
F
A
M
=
(
{
a
,
b
}
,
{
0
,
1
,
2
,
3
}
,
0
,
{
3
}
,
δ
)
{\mathrm{NFA}\ M=\left( \left\{ a,b \right\} ,\left\{ 0,1,2,3 \right\} ,0,\left\{ 3 \right\} ,\delta \right) }
NFA M=({a,b},{0,1,2,3},0,{3},δ),其中
δ
(
0
,
a
)
=
{
0
,
1
}
δ
(
0
,
b
)
=
{
0
}
δ
(
1
,
b
)
=
{
2
}
δ
(
2
,
b
)
=
{
3
}
\delta \left( 0,a \right) =\left\{ 0,1 \right\} \,\ \ \ \, \delta \left( 0,b \right) =\left\{ 0 \right\} \,\ \ \ \, \delta \left( 1,b \right) =\left\{ 2 \right\} \,\ \ \ \, \delta \left( 2,b \right) =\left\{ 3 \right\}
δ(0,a)={0,1} δ(0,b)={0} δ(1,b)={2} δ(2,b)={3}
M
M
M的状态转换图为:
M
M
M的状态转换矩阵为:
L
(
M
)
=
{
(
a
∣
b
)
∗
a
b
b
}
L\left( M \right) =\left\{ \left( a|b \right) ^*abb \right\}
L(M)={(a∣b)∗abb}
3、NFA 的确定化【重点】
结论:对于任意一个 N F A M \mathrm{NFA}\ M NFA M,都存在一个与之等价的 D F A D \mathrm{DFA}\ D DFA D,即 L ( M ) = L ( D ) L(M)=L(D) L(M)=L(D).
方法一:转换函数构造法
step1:假设 N F A M = ( Σ , Q , q 0 , F , δ ) \mathrm{NFA}\ M = (\Sigma, Q,q_0,F,\delta) NFA M=(Σ,Q,q0,F,δ), D F A D = ( Σ , Q ′ , q 0 , F ′ , δ ′ ) \mathrm{DFA}\ D = (\Sigma, Q',q_0,F',\delta') DFA D=(Σ,Q′,q0,F′,δ′),其中:
- Q ′ Q' Q′ 为 Q Q Q 的幂集,即 Q Q Q 的一切子集组成的集合
- F ′ F' F′ 为含有 M M M 终态的 Q Q Q 的所有子集组成的集合
- δ ′ ( { q 1 , q 2 , ⋯ , q k } , a ) = δ ( q 1 , a ) ∪ δ ( q 2 , a ) ∪ ⋯ ∪ δ ( q k , a ) \delta '\left( \left\{ q_1,q_2,\cdots ,q_k \right\} ,a \right) =\delta \left( q_1,a \right) \cup \delta \left( q_2,a \right) \cup \cdots \cup \delta \left( q_k,a \right) δ′({q1,q2,⋯,qk},a)=δ(q1,a)∪δ(q2,a)∪⋯∪δ(qk,a)
step2:去掉无用的状态 ∅
【例】 请构造与
N
F
A
M
=
(
{
a
,
b
}
,
{
A
,
B
}
,
A
,
{
B
}
,
δ
)
\mathrm{NFA}\ M=(\{a,b\},\{A,B\},A,\{B\},\delta)
NFA M=({a,b},{A,B},A,{B},δ) 等价的
D
F
A
D
\mathrm{DFA} D
DFAD,对应的状态转换图如下:
【答】 假设
N
F
A
M
=
(
Σ
,
Q
,
q
0
,
F
,
δ
)
\mathrm{NFA}\ M = (\Sigma, Q,q_0,F,\delta)
NFA M=(Σ,Q,q0,F,δ),
D
F
A
D
=
(
Σ
,
Q
′
,
q
0
,
F
′
,
δ
′
)
\mathrm{DFA}\ D = (\Sigma, Q',q_0,F',\delta')
DFA D=(Σ,Q′,q0,F′,δ′),
其中
Σ
=
{
a
,
b
}
,
Q
=
{
A
,
B
}
,
q
0
=
A
,
F
=
{
B
}
\Sigma=\{a,b\},Q=\{A,B\},q_0=A,F=\{B\}
Σ={a,b},Q={A,B},q0=A,F={B},则
- Q ′ = { ∅ , { A } , { B } , { A , B } } Q'=\{∅,\{A\},\{B\},\{A,B\}\} Q′={∅,{A},{B},{A,B}}
- F ′ = { { B } , { A , B } } F'=\{\{B\},\{A,B\}\} F′={{B},{A,B}}
-
δ
′
(
∅
,
a
)
=
∅
\delta '\left( ∅,a \right) =∅
δ′(∅,a)=∅(删)
δ ′ ( ∅ , b ) = ∅ \delta '\left( ∅,b \right) =∅ δ′(∅,b)=∅(删)
δ ′ ( { A } , a ) = δ ( A , a ) = { A , B } \delta '\left( \left\{ A \right\} ,a \right) =\delta \left( A,a \right) =\left\{ A,B \right\} δ′({A},a)=δ(A,a)={A,B}
δ ′ ( { A } , b ) = δ ( A , b ) = { B } \delta '\left( \left\{ A \right\} ,b \right) =\delta \left( A,b \right) =\left\{ B \right\} δ′({A},b)=δ(A,b)={B}
δ ′ ( { B } , a ) = δ ( B , a ) = ∅ \delta '\left( \left\{ B \right\} ,a \right) =\delta \left( B,a \right) =∅ δ′({B},a)=δ(B,a)=∅(删)
δ ′ ( { B } , b ) = δ ( B , b ) = { A , B } \delta '\left( \left\{ B \right\} ,b \right) =\delta \left( B,b \right) =\left\{ A,B \right\} δ′({B},b)=δ(B,b)={A,B}
δ ′ ( { A , B } , a ) = δ ( A , a ) ∪ δ ( B , a ) = { A , B } ∪ ∅ = { A , B } \delta '\left( \left\{ A,B \right\} ,a \right) =\delta \left( A,a \right) \cup \delta \left( B,a \right) =\left\{ A,B \right\} \cup ∅=\left\{ A,B \right\} δ′({A,B},a)=δ(A,a)∪δ(B,a)={A,B}∪∅={A,B}
δ ′ ( { A , B } , b ) = δ ( A , b ) ∪ δ ( B , b ) = { B } ∪ { A , B } = { A , B } \delta '\left( \left\{ A,B \right\} ,b \right) =\delta \left( A,b \right) \cup \delta \left( B,b \right) =\left\{ B \right\} \cup \left\{ A,B \right\} =\left\{ A,B \right\} δ′({A,B},b)=δ(A,b)∪δ(B,b)={B}∪{A,B}={A,B}
最后得到
D
F
A
D
\mathrm{DFA}\ D
DFA D的状态转换矩阵和状态转换图如下:
方法二:子集构造法(我喜欢这个)
step1:用状态子集构造 N F A M \mathrm{NFA}\ M NFA M 的状态转换矩阵,即列出每个状态子集,以及该子集相对于每个输入符号的后继子集
step2:对矩阵中的状态子集重新命名,如改成0、1、2、……
【例】题目同上道例题。
【答】 用状态子集构造 N F A M \mathrm{NFA}\ M NFA M 的状态转换矩阵:
重命名:
4、DFA 对 δ \delta δ 的扩充定义
前面定义的 δ \delta δ 是作用于一个输入字符和一个状态上,现在扩充定义是作用在一个输入字符串和一个状态上:
对任何 a ∈ Σ , q ∈ Q a\in \varSigma ,q\in Q a∈Σ,q∈Q,定义: δ ( q , ε ) = q \delta \left( q,\varepsilon \right) =q δ(q,ε)=q δ ( q , ω a ) = δ ( δ ( q , ω ) , a ) \delta \left( q,\omega a \right) =\delta \left( \delta \left( q,\omega \right) ,a \right) δ(q,ωa)=δ(δ(q,ω),a)
5、DFA 的化简【重点】
含义: D F A D \mathrm{DFA}\ D DFA D 化简就是寻找一个状态数比较少的 D F A D ′ \mathrm{DFA}\ D' DFA D′,使 L ( D ) = L ( D ′ ) L(D)=L(D') L(D)=L(D′)
结论:存在唯一最少状态的 D F A D ′ ′ \mathrm{DFA}\ D'' DFA D′′,使 L ( D ) = L ( D ′ ′ ) L(D)=L(D'') L(D)=L(D′′)
状态等价与状态可区分:设 s , t ∈ Q s,t\in Q s,t∈Q,若对任何 ω ∈ Σ ∗ \omega\in \Sigma^* ω∈Σ∗, δ ( s , w ) ∈ F \delta(s,w)\in F δ(s,w)∈F 当且仅当 δ ( t , w ) ∈ F \delta(t,w)\in F δ(t,w)∈F,则称状态 s s s 和 t t t 是等价的,否则 s s s 和 t t t 是可区分的。
化简方法:
step1:将状态集合 Q Q Q 分割成一些互不相交的子集:使每个子集中的任何两个状态是等价的,而任何两个属于不同子集的状态是可区分的。
step2:在每个子集中人去一个状态作作为代表,删掉子集中其余状态,并将射向集合中其他节点的边改为射向代表节点的边
step3:删除无用状态,即到不了终结状态的状态
状态集合的分割:
step1:将状态集合 Q Q Q 划分为两个子集:终结状态子集 F F F 和非终结状态子集 G G G
step2:取每个输入符号 a a a,对每个子集再进行划分,使子集中相对于该符号能够转换到同一子集的状态作为一个新的子集
step3:重复 step2,直到每个子集都不能再划分为止
【例】最小化下面状态转换图描述的
D
F
A
D
\mathrm{DFA}\ D
DFA D.
【答】 首先进行分割:
①
F
=
{
E
}
G
=
{
A
,
B
,
C
,
D
}
F=\{E\}\ \ \ \ G=\{A,B,C,D\}
F={E} G={A,B,C,D}
②
F
=
{
E
}
G
=
{
A
,
B
,
C
}
G
′
=
{
D
}
F=\{E\}\ \ \ \ G=\{A,B,C\}\ \ \ \ G'=\{D\}
F={E} G={A,B,C} G′={D}
③
F
=
{
E
}
G
=
{
A
,
C
}
G
′
=
{
D
}
G
′
′
=
{
B
}
F=\{E\}\ \ \ \ G=\{A,C\}\ \ \ \ G'=\{D\}\ \ \ \ G''=\{B\}
F={E} G={A,C} G′={D} G′′={B}
最终分割为四个子集:
{
E
}
,
{
A
,
C
}
,
{
D
}
{
B
}
\{E\},\{A,C\},\{D\}\,\{B\}
{E},{A,C},{D}{B}
再进行代表化,取
E
,
A
,
D
,
B
E,A,D,B
E,A,D,B 分别为
{
E
}
,
{
A
,
C
}
,
{
D
}
{
B
}
\{E\},\{A,C\},\{D\}\,\{B\}
{E},{A,C},{D}{B} 的代表状态,重新连边:
没有无用状态,即该图为最小化后的
D
F
A
D
\mathrm{DFA}\ D
DFA D。
6、具有 ε \varepsilon ε-转移的 NFA 及去 ε \varepsilon ε-转移
具有
ε
\varepsilon
ε-转移的 NFA
M
M
M 的状态转换图中可能有标记为
ε
\varepsilon
ε 的边
当
δ
(
q
,
ε
)
=
{
q
1
,
q
2
,
⋯
q
k
}
\delta \left( q,\varepsilon \right) =\left\{ q_1,q_2,\cdots q_k \right\}
δ(q,ε)={q1,q2,⋯qk} 时,从
q
q
q 出发有
k
k
k 条标记为
ε
\varepsilon
ε 的边分别指向
q
1
,
q
2
,
⋯
q
k
q_1,q_2,\cdots q_k
q1,q2,⋯qk.
【例】 有
N
F
A
M
=
(
{
a
,
b
}
,
{
0
,
1
,
2
,
3
,
4
}
,
0
,
{
2
,
4
}
,
δ
)
\mathrm{NFA} M=\left( \left\{ a,b \right\} ,\left\{ 0,1,2,3,4 \right\} ,0,\left\{ 2,4 \right\} ,\delta \right)
NFAM=({a,b},{0,1,2,3,4},0,{2,4},δ),其中
δ
(
0
,
ε
)
=
{
1
,
3
}
δ
(
1
,
a
)
=
{
1
,
2
}
δ
(
3
,
b
)
=
{
3
,
4
}
\delta \left( 0,\varepsilon \right) =\left\{ 1,3 \right\} \,\, \delta \left( 1,a \right) =\left\{ 1,2 \right\} \,\, \delta \left( 3,b \right) =\left\{ 3,4 \right\}
δ(0,ε)={1,3}δ(1,a)={1,2}δ(3,b)={3,4}
该 NFA
M
M
M 的状态转换矩阵和状态转换图分别为:
该 NFA
M
M
M 所识别的语言是
L
(
M
)
=
{
a
+
∣
b
+
}
L(M)=\{a^+|b^+\}
L(M)={a+∣b+}
定理:对任何一个具有 ε \varepsilon ε-转移的 NFA M M M,都存在一个等价的不具有 ε \varepsilon ε-转移的 NFA N N N
引入操作: ε _ c l o s u r e ( q ) \varepsilon\_\mathrm{closure}(q) ε_closure(q) 表示从状态 q q q 出发,经过 ε − \varepsilon- ε−道路(路径上所有边的标记连起来是 ε \varepsilon ε 的道路)可以到达的所有状态的集合,集合中包含 q q q 本身。求解时可用栈思想
构造不具有 ε \varepsilon ε-转移的 NFA N N N 的方法:
- 假设 N = ( Σ , Q , q 0 , F ′ , δ ′ ) N=(\Sigma ,Q,q_0,F',\delta ') N=(Σ,Q,q0,F′,δ′)
- F ′ F' F′ 为 F F F 与 ε _ c l o s u r e ( q ) \varepsilon\_\mathrm{closure}(q) ε_closure(q) 中包含终态的所有状态 q q q 的并
- δ ′ ( q , a ) = { q ′ ∣ q ′ 从为从 q 出发,经过标记为 a 的道路所能达到的状态 } \delta '\left( q,a \right) =\left\{ q'|q'\text{从为从}q\text{出发,经过标记为}a\text{的道路所能达到的状态} \right\} δ′(q,a)={q′∣q′从为从q出发,经过标记为a的道路所能达到的状态},再删掉结果为 ∅ 的部分
【例】构造与上道例题中的 NFA M M M 等价的不具有 ε \varepsilon ε-转移的 NFA N N N。
【答】 原 NFA
M
M
M 的状态转换矩阵和状态转换图分别为:
F
=
{
2
,
4
}
F=\{2,4\}
F={2,4}
ε
_
c
l
o
s
u
r
e
(
0
)
=
{
0
,
1
,
3
}
\varepsilon\_\mathrm{closure}(0)=\{0,1,3\}
ε_closure(0)={0,1,3}
F
∩
ε
_
c
l
o
s
u
r
e
(
0
)
=
F\cap\varepsilon\_\mathrm{closure}(0)=
F∩ε_closure(0)=∅,则
F
′
=
F
=
{
2
,
4
}
F'=F=\{2,4\}
F′=F={2,4}
删掉无用状态 ∅ 后,NFA
N
N
N 的状态转换矩阵和状态转换图分别为:
7、对具有 ε \varepsilon ε-转移的 NFA 确定【重点】
结论:对任何一个具有 ε \varepsilon ε-转移的 NFA M M M,都存在一个等价的 DFA D D D
引入操作:
- ε _ c l o s u r e ( T ) = ⋃ i = 1 n ε _ c l o s u r e ( q i ) , 其中 q i ∈ T \varepsilon \_\mathrm{closure(}T)=\bigcup\nolimits_{i=1}^n{\varepsilon \_closure(q_i)\ ,\text{其中}q_i\in T} ε_closure(T)=⋃i=1nε_closure(qi) ,其中qi∈T
- m o v e ( T , a ) = { q ∣ δ ( q i , a ) = q , 其中 q i ∈ T } \mathrm{move}\left( T,a \right) =\left\{ q|\delta \left( q_i,a \right) =q,\text{其中}q_i\in T \right\} move(T,a)={q∣δ(qi,a)=q,其中qi∈T}
方法:
注:DTT 为
D
D
D 的状态转换矩阵
【例】有 NFA
M
M
M 的状态转换图如下,请构造等价的 DFA
N
N
N
【答】 由题知
Σ
=
{
a
,
b
}
\Sigma=\{a,b\}
Σ={a,b}
令
A
=
ε
_
c
l
o
s
u
r
e
(
0
)
=
{
0
,
1
,
2
,
4
,
7
}
A=\varepsilon\_\mathrm{closure}(0)=\{0,1,2,4,7\}
A=ε_closure(0)={0,1,2,4,7}
D
T
T
[
A
,
a
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
A
,
a
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
3
,
8
}
)
=
{
1
,
2
,
3
,
4
,
6
,
7
,
8
}
=
B
\mathrm{DTT}[A,a]=\varepsilon\_\mathrm{closure}(\mathrm{move}(A,a))=\varepsilon\_\mathrm{closure}(\{3,8\})=\{1,2,3,4,6,7,8\}=B
DTT[A,a]=ε_closure(move(A,a))=ε_closure({3,8})={1,2,3,4,6,7,8}=B
D
T
T
[
A
,
b
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
A
,
b
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
5
}
)
=
{
1
,
2
,
4
,
5
,
6
,
7
}
=
C
\mathrm{DTT}[A,b]=\varepsilon\_\mathrm{closure}(\mathrm{move}(A,b))=\varepsilon\_\mathrm{closure}(\{5\})=\{1,2,4,5,6,7\}=C
DTT[A,b]=ε_closure(move(A,b))=ε_closure({5})={1,2,4,5,6,7}=C
D
T
T
[
B
,
a
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
B
,
a
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
3
,
8
}
)
=
B
\mathrm{DTT}[B,a]=\varepsilon\_\mathrm{closure}(\mathrm{move}(B,a))=\varepsilon\_\mathrm{closure}(\{3,8\})=B
DTT[B,a]=ε_closure(move(B,a))=ε_closure({3,8})=B
D
T
T
[
B
,
b
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
B
,
b
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
5
,
9
}
)
=
{
1
,
2
,
4
,
5
,
6
,
7
,
9
}
=
D
\mathrm{DTT}[B,b]=\varepsilon\_\mathrm{closure}(\mathrm{move}(B,b))=\varepsilon\_\mathrm{closure}(\{5,9\})=\{1,2,4,5,6,7,9\}=D
DTT[B,b]=ε_closure(move(B,b))=ε_closure({5,9})={1,2,4,5,6,7,9}=D
D
T
T
[
C
,
a
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
C
,
a
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
3
,
8
}
)
=
B
\mathrm{DTT}[C,a]=\varepsilon\_\mathrm{closure}(\mathrm{move}(C,a))=\varepsilon\_\mathrm{closure}(\{3,8\})=B
DTT[C,a]=ε_closure(move(C,a))=ε_closure({3,8})=B
D
T
T
[
C
,
b
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
C
,
b
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
5
}
)
=
C
\mathrm{DTT}[C,b]=\varepsilon\_\mathrm{closure}(\mathrm{move}(C,b))=\varepsilon\_\mathrm{closure}(\{5\})=C
DTT[C,b]=ε_closure(move(C,b))=ε_closure({5})=C
D
T
T
[
D
,
a
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
D
,
a
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
3
,
8
}
)
=
B
\mathrm{DTT}[D,a]=\varepsilon\_\mathrm{closure}(\mathrm{move}(D,a))=\varepsilon\_\mathrm{closure}(\{3,8\})=B
DTT[D,a]=ε_closure(move(D,a))=ε_closure({3,8})=B
D
T
T
[
D
,
b
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
D
,
b
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
5
,
10
}
)
=
{
1
,
2
,
4
,
5
,
6
,
7
,
10
}
=
E
\mathrm{DTT}[D,b]=\varepsilon\_\mathrm{closure}(\mathrm{move}(D,b))=\varepsilon\_\mathrm{closure}(\{5,10\})=\{1,2,4,5,6,7,10\}=E
DTT[D,b]=ε_closure(move(D,b))=ε_closure({5,10})={1,2,4,5,6,7,10}=E
D
T
T
[
E
,
a
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
E
,
a
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
3
,
8
}
)
=
B
\mathrm{DTT}[E,a]=\varepsilon\_\mathrm{closure}(\mathrm{move}(E,a))=\varepsilon\_\mathrm{closure}(\{3,8\})=B
DTT[E,a]=ε_closure(move(E,a))=ε_closure({3,8})=B
D
T
T
[
E
,
b
]
=
ε
_
c
l
o
s
u
r
e
(
m
o
v
e
(
E
,
b
)
)
=
ε
_
c
l
o
s
u
r
e
(
{
5
}
)
=
C
\mathrm{DTT}[E,b]=\varepsilon\_\mathrm{closure}(\mathrm{move}(E,b))=\varepsilon\_\mathrm{closure}(\{5\})=C
DTT[E,b]=ε_closure(move(E,b))=ε_closure({5})=C
共构造出 A 、 B 、 C 、 D 、 E A、B、C、D、E A、B、C、D、E 五种状态,其中 A A A 为初态, E E E 为终态,因为 E E E 中包含原终态 10.
所构造的 DFA
D
D
D 的状态转换矩阵和状态转换图如下图所示:
8、正规表达式(简称正规式)
正规表达式表示的语言叫做正规集
规定优先级可省括号:闭包(*)>连接>并(|)
【例】如果
Σ
=
{
a
,
b
}
\Sigma=\{a,b\}
Σ={a,b}
三、正规表达式与有限自动机的等价性
定理:对于任何一个正规表达式 r r r,都存在一个有限自动机 M M M,使 L ( r ) = L ( M ) L(r)=L(M) L(r)=L(M)
1、正规表达式向 FA 的转换
首先将转换图进行拓广:令每条有向边的标记可以是一个正规表达式
方法:不断将
r
r
r 按照以下规则进行分裂、加入新的节点,直到所有有向边的标记都是基本符号为止
【例】为正规表达式
(
a
∣
b
)
∗
a
b
b
(a|b)^*abb
(a∣b)∗abb 构造等价的 NFA
【答】
2、FA 向正规表达式的转换
首先,在 FA M M M 中增加两个节点 s s s 和 f f f 作为新的初态结点和终结结点,并分别与原来的初态结点和终结结点用 ε \varepsilon ε 边相连
方法:反复利用下面替换规则,逐步消去中间结点,直到只剩下
s
s
s 和
f
f
f
【例】为下面的 NFA
M
M
M 构造等价的正规表达式
r
r
r
【答】
四、正规文法与有限自动机的等价性
定理:
- 对于每一个右线性文法 G G G 或左线性文法 G G G,都存在一个等价的有限自动机 M M M
- 对于每一个 DFA M M M,都存在一个等价的右线性文法 G G G 和左线性文法 G ′ G' G′
1、右线性文法向有限自动机的转换
设有右线性文法 G = ( V T , V N , S , φ ) G=(V_T,V_N,S,\varphi) G=(VT,VN,S,φ),与之等价的有限自动机 M = ( Σ , Q , q 0 , F , δ ) M=(\Sigma ,Q,q_0,F,\delta) M=(Σ,Q,q0,F,δ)
- Σ = V T \Sigma=V_T Σ=VT
- Q = V N ∪ { f } Q=V_N\cup\{f\} Q=VN∪{f}
- q 0 = S q_0=S q0=S
- F = { f } F=\{f\} F={f}, f f f 为新添加的符号
-
δ
\delta
δ:
若有 A → a A\rightarrow a A→a,则有 δ ( A , a ) = f \delta(A,a)=f δ(A,a)=f
若有 A → a A 1 ∣ a A 2 ∣ . . . ∣ a A k A\rightarrow aA_1|aA_2|...|aA_k A→aA1∣aA2∣...∣aAk,则有 δ ( A , a ) = { A 1 , A 2 , . . . , A k } \delta(A,a)=\{A_1,A_2,...,A_k\} δ(A,a)={A1,A2,...,Ak}
其中 A ∈ V N , A i ∈ V N ( i = 1 , 2 , . . . , k ) , a ∈ V T ∪ { ε } A\in V_N,A_i\in V_N(i=1,2,...,k),a\in V_T\cup\{\varepsilon\} A∈VN,Ai∈VN(i=1,2,...,k),a∈VT∪{ε}
对关系的形象描述:对于右线性文法 G G G 和字符串 ω ∈ L ( G ) \omega\in L(G) ω∈L(G),在最左推导的过程中,每一次利用产生式都相当于在有限自动机 M M M 中向终态方向前进一步
2、左线性文法向有限自动机的转换
设有左线性文法 G = ( V T , V N , S , φ ) G=(V_T,V_N,S,\varphi) G=(VT,VN,S,φ),与之等价的有限自动机 M = ( Σ , Q , q 0 , F , δ ) M=(\Sigma ,Q,q_0,F,\delta) M=(Σ,Q,q0,F,δ)
- Σ = V T \Sigma=V_T Σ=VT
- Q = V N ∪ { q 0 } Q=V_N\cup\{q_0\} Q=VN∪{q0}
- q 0 q_0 q0:新添加的符号
- F = { S } F=\{S\} F={S}
-
δ
\delta
δ:
若有 A → a A\rightarrow a A→a,则有 δ ( q 0 , a ) = A \delta(q_0,a)=A δ(q0,a)=A
若有 A 1 → A a , A 2 → A a , . . . , A k → A a A_1\rightarrow Aa,A_2\rightarrow Aa,...,A_k\rightarrow Aa A1→Aa,A2→Aa,...,Ak→Aa,则有 δ ( A , a ) = { A 1 , A 2 , . . . , A k } \delta(A,a)=\{A_1,A_2,...,A_k\} δ(A,a)={A1,A2,...,Ak}
其中 A ∈ V N , A i ∈ V N ( i = 1 , 2 , . . . , k ) , a ∈ V T ∪ { ε } A\in V_N,A_i\in V_N(i=1,2,...,k),a\in V_T\cup\{\varepsilon\} A∈VN,Ai∈VN(i=1,2,...,k),a∈VT∪{ε}
【例】试构造与如下右线性文法
G
=
(
{
a
,
b
}
,
{
S
,
B
}
,
S
,
φ
)
G=\left( \left\{ a,b \right\} ,\left\{ S,B \right\} ,S,\varphi \right)
G=({a,b},{S,B},S,φ) 等价的有限自动机
M
M
M,其中,
【答】 设 FA
M
=
(
Σ
,
Q
,
q
0
,
F
,
δ
)
M=(\Sigma ,Q,q_0,F,\delta)
M=(Σ,Q,q0,F,δ)
3、有限自动机向右线性文法的转换
设有有限自动机 M = ( Σ , Q , q 0 , F , δ ) M=(\Sigma ,Q,q_0,F,\delta) M=(Σ,Q,q0,F,δ),与之等价的右线性文法 G = ( V T , V N , S , φ ) G=(V_T,V_N,S,\varphi) G=(VT,VN,S,φ)
- V T = Σ V_T=\Sigma VT=Σ
- V N = Q V_N=Q VN=Q
- S = q 0 S=q_0 S=q0
-
φ
\varphi
φ:
若有 δ ( A , a ) = B \delta(A,a)=B δ(A,a)=B,则
如果 B ∉ F B\notin F B∈/F:则有 A → a B A\rightarrow aB A→aB
如果 B ∈ F B\in F B∈F:则有 A → a B ∣ a A\rightarrow aB | a A→aB∣a
【例】设有 DFA
M
=
(
{
a
,
b
}
,
{
q
0
,
q
1
,
q
2
,
q
3
}
,
q
0
,
{
q
3
}
,
δ
)
M=(\{a,b\},\{q_0,q_1,q_2,q_3\},q_0,\{q_3\},\delta)
M=({a,b},{q0,q1,q2,q3},q0,{q3},δ),其中
δ
\delta
δ 如下:
构造与之等价的右线性文法。
【答】 设等价的右线性文法为
G
=
(
V
T
,
V
N
,
S
,
φ
)
G=(V_T,V_N,S,\varphi)
G=(VT,VN,S,φ)
对于
φ
\varphi
φ,
由于
q
1
,
q
2
∉
{
q
3
}
q_1,q_2\notin\{q_3\}
q1,q2∈/{q3},则有
q
0
→
a
q
1
q_0\rightarrow aq_1
q0→aq1
q
2
→
a
q
2
q_2\rightarrow aq_2
q2→aq2
q
0
→
b
q
2
q_0\rightarrow bq_2
q0→bq2
q
1
→
b
q
1
q_1\rightarrow bq_1
q1→bq1
由于
q
2
∈
{
q
3
}
q_2\in\{q_3\}
q2∈{q3},则有
q
1
→
a
q
3
∣
a
q_1\rightarrow aq_3|a
q1→aq3∣a
q
2
→
b
q
3
∣
b
q_2\rightarrow bq_3|b
q2→bq3∣b
由于没有从
q
3
q_3
q3 开始的产生式,故
q
3
q_3
q3 是无用的状态。总上所述,则有:
G
=
(
{
a
,
b
}
,
{
q
0
,
q
1
,
q
2
}
,
q
0
,
φ
)
G=(\{a,b\},\{q_0,q_1,q_2\},q_0,\varphi)
G=({a,b},{q0,q1,q2},q0,φ)
其中
φ
:
\varphi:
φ:
q
0
→
a
q
1
∣
b
q
2
q_0\rightarrow aq_1|bq_2
q0→aq1∣bq2
q
1
→
b
q
1
∣
a
q
3
∣
a
q_1\rightarrow bq_1|aq_3|a
q1→bq1∣aq3∣a
q
2
→
a
q
2
∣
b
q
3
∣
b
q_2\rightarrow aq_2|bq_3|b
q2→aq2∣bq3∣b
五、正规表达式与正规文法的等价性
1、正规定义式
作用:将一个正规表达式转换为一个等价的正规文法
【例】用正规表达式
l
e
t
t
e
r
(
l
e
t
t
e
r
∣
d
i
g
i
t
)
∗
letter(letter|digit)^*
letter(letter∣digit)∗ 可以表示 Pascal 语言的标识符集合,如果引进一个名字
i
d
id
id 来表示它,而
l
e
t
t
e
r
letter
letter 和
d
i
g
i
t
digit
digit 也表示两个正规表达式的名字,则标识符集合可以表示为如下正规定义式:
2、表示的缩写
- r ∗ = r + ∣ ε r^*=r^+|\varepsilon r∗=r+∣ε (闭包)
- r + = r r ∗ r^+=rr^* r+=rr∗ (正闭包)
- r ? = r ∣ ε r?=r|\varepsilon r?=r∣ε (可选)
- [ a b c ] = a ∣ b ∣ c [abc]=a|b|c [abc]=a∣b∣c (表示)如 a ∣ b ∣ . . . ∣ z a|b|...|z a∣b∣...∣z 可以缩写为 [ a − z ] [a-z] [a−z]
3、正规表达式转换为等价的正规文法
💡 正规文法的产生式与正规定义式中的正规定义是两个不同的概念。
正规文法的产生式:定义了一个符合特定形式的文法符号串
正规定义:定义一个正规表达式
【例】给出产生 Pascal 语言标识符的正规文法。
【答】 首先写出正规定义式:
将第 3 个正规定义进行改造:为
(
l
e
t
t
e
r
∣
d
i
g
i
t
)
∗
(letter|digit)^*
(letter∣digit)∗ 取一个名字
r
i
d
rid
rid
由于:
则有:
即有: