3.1. 词法分析器的设计
3.1.1. 词法分析器的任务
输入源程序,输出单词符号
单词符号是最小的语义单位。
3.1.2. 词法分析器输出形式
词法分析器所输出的单词符号通常表示为二元式(单词种别,单词符号的属性)
单词的种类
种类 | 说明 |
---|
关键字 | 又称基本字、保留字,是由程序语言定义的具有固定意义的标识符 |
标识符 | 用来标识各种名字,如变量名、数组名、过程名、函数名等 |
常数 | 整型、实型、字符型等,如 0 , abc |
运算符 | 如算术运算符、逻辑运算符、关系运算符 |
界限符 | , ; ( ) [ ] { } = /* */ 等 |
除以上外,还包括编辑符,如空格符、回车符、换行符、制表符等
单词的属性值
书上好像并没有看到有什么比较有价值的东西😅
3.2. 词法分析器的手工打造
3.2.1. 确定的有限自动机
定义 3.1 一个确定的有限自动机(DFA)M 是一个五元组 M=(S,Σ,δ,s0,F),式中
- S 是一个有限集,它的每一个元素称为一个状态
- Σ 是一个有穷字母表,它的每个元素称为一个输入字符
- δ 是一个从 S×Σ 到 S 的单值部分映射。δ(s,a)=s′ 表示在目前状态 s 下输入字符为 a 时,将转换到下一个状态 s′,s′ 被称为 s 的一个后继状态
- s0∈S 是唯一的初态
- F⊆S 是一个终态,可空
例如 有 DFA M=({0,1,2,3},{a,b},δ,0,{3}),其中,δ 定义为
δ(0,a)=1δ(2,a)=1δ(0,b)=2δ(2,b)=3δ(1,a)=3δ(3,a)=3δ(1,b)=2δ(3,b)=3
可以画出状态转换矩阵,此时可以看出其定义中第三条的含义
以及状态转换图
3.2.2. 构造单词的确定有限自动机
3.2.3. 编写一个 C 语言词法分析器
留给实验部分
3.3. 有限自动机及其化简
3.3.1. 不确定有限自动机
定义 3.2 一个不确定有限自动机(NFA)M 是一个五元组 M=(S,Σ,δ,S0,F),其中
- S 是一个有限集,它的每一个元素称为一个状态
- Σ 是一个有穷字母表,它的每个元素称为一个输入字符
- δ 是一个从 S×Σ∗ 到 S 的子集映射,即 δ:S×Σ∗→2S
- S0⊆S 是一个非空初态集
- F⊆S 是一个终态集(可空)
DFA 是 NFA 的特例,而 NFA 是 DFA 概念的推广
3.3.2. 不确定有限自动机的化简
对任意给定的 NFA,都能相应构造一个 DFA 使它们接受相同的语言
定义 3.3 假定 I 是 NFA M 的状态集子集,定义 I 的 ε-Closure(I) 如下
- 若 q∈I ,则 q∈ε-Closure(I)
- 若 q∈I,则从 q 触发经过任意条 ε 弧而能到达的任何状态 q′,有 q′∈ε-Closure(I)
性质 3.1 假定 I={I1,I2,⋯,Ii} 是 NFA M 的状态集的子集,对 a∈Σ,有 δ(I,a)=δ(I,ε∗aε∗) 成立,且 δ(I,a)=⋃j=1iδ(Ij,ε∗aε∗)
定理 3.1 对任意一 NFA M,都存在一个 DFA M′,使得 L(M′)=L(M)
例 3.3 将 NFA M 确定化
新生成的状态 \ 输入 | a | b | c |
---|
ε-Closure({0})={0,2,3} | {1 } | ∅ | {2,3 } |
{1 } | ∅ | {3 } | ∅ |
{2,3 } | ∅ | ∅ | {2,3 } |
{3 } | ∅ | ∅ | ∅ |
我们令每一行的首元素分别为新的状态 0, 1, 2, 3,接着考察哪些状态可以作为终态
- 因为原始的 NFA 中,3 是终态,因此,在新的状态集合中,只要是包含原始终态的集合,都可以作为终态。
- 例如上表中,line 0, line 2, line 3 的集合都包含原始 NFA 的终态 3 ,因此这 3 行生成的新状态都可以作为新的终态。
3.3.3. 确定有限自动机的化简
对一个 NFA M,当把它确定化后,得到的 DFA 可能包含较多的状态,有些状态有可能是多余或者等价的。因此应该对 DFA 进行化简。
多余状态 从初态出发,任何可识别的输入串也不能到达的状态。
设 DFA M=(S,Σ,δ,s0,F),对 s,t∈S,若对任何 α∈Σ∗,均有 δ(s,α)∈F 当且仅当 δ(t,α)∈F,则称状态 s 和 t 等价
定义 3.4 对一个 DFA M,若能找到一个状态比 M 少的 DFA M′,使得 L(M)=L(M′),且 M′ 满足
- M′ 中没有多余的状态
- M′ 的状态集中,没有两个状态是互相等价的
则称该 DFA M′ 是一个最小化的 DFA,也称 DFA 的化简
DFA M 最小化的具体步骤
- 将 DFA M 的状态集 S 划分为两个子集:终态集 F 和非终态集 F~,形成初始划分 Π
- 对 Π 建立新的分划 Πnew,对 Π 中的每个状态子集 G,进行如下变换
- 把 G 划分成新的子集,使 G 的两个状态 s 和 t 属于同一个子集,当且仅当对任何输入符号 a,状态 s 和 t 转换到的状态都属于 Π 的同一个子集
- 用 G 划分出来的所有新子集替换为 G,形成新的划分 Πnew
- 如果 Πnew 和 Π 相等,则执行第 4 步;否则,令 Π=Πnew,重复第 2 步
- 划分结束后,对划分中的每个状态子集,选出一个状态作为“代表”,删去其他一切等价的状态,并把射向其他状态的箭弧改为射向这个“代表”的状态
DFA 最小化的核心:将不等价的状态拆分
例 对于有限自动机
由于状态 0, 1 经过 a, b 落在同一个子集,可以发现它们无法拆分,因此 0 和 1 状态等价。可以将状态机化简为右边的形式。
例 3.6 将图中 DFA 最小化
- 按照终态和非终态划分,得到两个子集 Π1={A,B,F},Π2={C,D,E,G}
- 对 Π1,状态 A,B 均与 F 可区别,因为 AbT,BbT,而 F↛bT(T 表示终止态),因此 Π1 划分为 Π11={A,B},Π12={F}。
- 进一步,A,B 是两个可区别的状态,因为 AbbT,B↛bbT,进而将 Π1 分为三个子集 {A }, {B }, {F }
- 对 Π2={C,D,E,G},用输入 b 可将其划分为 Π21={C,E},Π22={D,G}
- 进一步,可将 Π21 划分为 {C }, {E }
于是划分为了以下子集
{A }, {B }, {F }, {C }, {E }, {D,G }
3.4. 正规文法、正规式和有限自动机之间的关系
3.4.1. 正规式与正规集
定义 设有字母表 Σ,在 Σ 上的正规式,它们所表示的正规集的递归定义:
- ε 和 ∅ 都是 Σ 上的正规式,它们所表示的正规集分别为 {ε} 和 ∅
- 任何 a∈Σ,a 是 Σ 上的一个正规式,它所表示的正规集为 {a }
- 假设 e1,e2 是 Σ 上的正规式,它们所表示的正规集分别为 L(e1),L(e2),则
- e1∣e2 是 Σ 上的正规式,它所表示的正规集为 L(e1∣e2)=L(e1)∪L(e2)
- e1e2 是 Σ 上的正规式,它所表示的正规集为 L(e1e2)=L(e1)L(e2)
- (e1)⋅ 是 Σ 上的正规式,它所表示的正规集为 L((e1)⋅)=L(e1)⋅
谁是 Σ 的正规式 | 正规集 |
---|
ε | {ε} |
∅ | ∅ |
a | {a } |
e1 和 e2 是 Σ 上的正规式 | 它们所表示的正规集分别为 L(e1) 和 L(e2) |
e1∣e2 | L(e1∣e2)=L(e1)∪L(e2) |
e1e2 | L(e1e2)=L(e1)L(e2) |
(e1)⋅ | L((e1)⋅)=L(e1)⋅ |
性质
- 交换律 U∣V=V∣U
- 结合律 U∣(V∣W)=(U∣V)∣W,U(VW)=(UV)W
- 分配率 U(V∣W)=UV∣UW,(V∣W)U=VU∣WU
- εU=Uε=U
例
正规式 | 正规集 |
---|
a∣b | {a,b } |
(a∣b)(a∣b) | {aa,ab,ba, } |
a⋅ | {ε,a,aa,aaa,⋯} |
(a∣b)∗ | {ε,a,b,aa,ab,ba,bb,aaa,⋯} |
a∣a∗b | {a,b,ab,aab,aaab,⋯} |
3.4.2. 正规式与正规文法的关系
1. 正规式转换为正规文法
字母表 Σ 上的正规式 U 到正规文法 G[Z]=(VN,VT,P,Z) 的转换方法
- 令 VT=Σ,将 Z→U 加入到 P 中
- 对 P 中的每条产生式规则 V→U,while (!(U=ε∥U=a(a∈Σ))) 执行
条件 | V→U 修改为 |
---|
U=e1∣e2 | V→A∣B,A→e1,B→e2 |
U=e1e2 | V→e1B,B→e2 |
U=(e1)⋅e2 | V→e1V,V→e2 |
例 3.10 将正规式 (a∣b)∗a(a∣b) 转换为相应的正规文法
由 1. 有
VT={a,b},P={Z→(a∣b)∗a(a∣b)}
由 2.3. 有
Z→aZ∣bZ,Z→a(a∣b)
继续由 2.2. 有
Z→aZ∣bZ,Z→aB,B→(a∣b)
即
P={Z→aZ∣bZ,Z→aB,B→(a∣b)}
例 3.11 将正规式 (a∣b)a∗(a∣b) 转换为相应的正规文法
⇒⇒VT={a,b},P={Z→(a∣b)a∗(a∣b)}Z→(a∣b)B,B→a∗(a∣b)Z→aB∣bB,B→aB,B→a∣b
因此有
P={Z→aB∣bB,B→aB,B→a∣b}
2. 正规文法转换为正规式
- 将正规文法中的每个非终结符表示成它的一个正规式方程,获得一个联立方程组
- 求解
- 若 x=αx∣β,则解为 x=α∗β
- 若 x=xα∣β,则解为 x=βα∗
例 3.12 设有正规文法 G[Z],求出该文法生成语言的正规式
ZBA→Zc∣Bc→Bb∣Ab→Aa∣a
方程组有
⎩⎨⎧Z=Zc+BcB=Bb+AbA=Aa+a
求解有
ABZ=aa∗=Bb+a{a}b=aa∗bb∗=Zc+Bc=Zc+aa∗bb∗c=aa∗bb∗cc∗
故该正规式的正规集就是文法 G[Z] 定义的语言 {aibjck∣i,j,k⩾1}
3.4.3. 正规文法与有限自动机之间的转换
1. 右线性文法转换为有限自动机
它对应着文法的推导过程
设 G[Z]=(VN,VT,P,Z) 是一个右线性文法,其产生式规则具有形式 A→aB∣a∣ε,由 G 构造相应的有限自动机 M=(S,Σ,δ,s0,F) 的步骤
- 令 s0= {Z },将每个非终结符看作 M 中的一个状态,并增加一个终态 Y 且 Y∈/VN,令 F= {Y },即可得 S=VN∪F,令 Σ=VT
- 对 G 中每一个形如 A→ε 的产生式规则,令 δ(A,ε)=Y
- 对 G 中每一个形如 A→a 的产生式规则,令 δ(A,a)=Y
- 对 G 中每一个形如 A→aB 的产生式规则,令 δ(A,a)=B
这样构造的 M 大多数情况下是一个 NFA
例 3.14 设有文法 G[Z],试构造有限自动机
ZA→0Z∣1A∣ε→0Z∣ε
M=(\{Z,A,Y\},\{0,1\},\delta,\{Z\},\{Y\})$$
\begin{aligned}
\delta(Z,0)=Z && \delta(Z,1)=A && \delta(Z,\varepsilon)=Y\
\delta(A,0)=Z && \delta(A,1)=\varnothing && \delta(A,\varepsilon)=Y
\end{aligned}
![](./assets/compile_10.svg)
#### 2. 左线性文法转换为有限自动机
> 它对应着文法的==归约过程==
设 $G[Z]=(V_\mathrm{N},V_\mathrm{T},P,Z)$ 是一个右线性文法,其产生式规则具有形式 $A\to Ba\mid a\mid\varepsilon$,由 $G$ 构造相应的有限自动机 $M=(S,\Sigma,\delta,s_0,F)$ 的步骤
1. 令 $s_0=\{Z\}$,将每个非终结符看作 $M$ 中的一个状态,并增加一个==初态 $X$== 且 $X\notin V_\mathrm{N}$,令 $s_0=\{X\}$,即可得 $S=V_\mathrm{N}\cup \{X\}$,令 $\Sigma=V_\mathrm{T}$
2. 对 $G$ 中每一个形如 $A\to \varepsilon$ 的产生式规则,令 $\delta(X,\varepsilon)=A$
3. 对 $G$ 中每一个形如 $A\to a$ 的产生式规则,令 $\delta(X,a)=A$
4. 对 $G$ 中每一个形如 $A\to Ba$ 的产生式规则,令 $\delta(B,a)=A$
这样构造的 $M$ 大多数情况下是一个 NFA
**例 3.14** 设有文法 $G[Z]$,试构造有限自动机
\begin{aligned}
Z&\to Z0\mid A1\mid\varepsilon\
A&\to Z0\mid\varepsilon
\end{aligned}
M=({Z,A,X},{0,1},\delta,{X},{Z})$$
δ(Z,0)=Zδ(Z,0)=Aδ(A,1)=Zδ(Z,1)=∅δ(A,0)=∅δ(X,ε)=Aδ(X,ε)=Z
3. 有限自动机转换为正规文法
对于给定的有限自动机 M,构造文法 G 使得 L(G)=L(M)
- 令 VT=Σ,VN=S,Z=s0
- 若 Z 是一个终态,则将产生式规则 Z→ε 加到 P 中
- 对 δ(A,a)=B,若 B∈/F,则将 A→aB 加到 P 中;否则,将 A→aB∣A→a 或 A→aB,B→ε 加到 P 中。特别的,若 δ(A,a)=A,则将 A→aA∣ε 加到 P 中。
例 3.16 对以下状态图,构造文法 G
G[Z]P:=({Z,A,B,C},{a,b},P,Z)Z→aA∣bBA→aC∣bB∣aB→aA∣aB∣bC∣bC→aC∣aA∣ε
3.4.4. 正规式与有限自动机之间的转换
1. 由正规式构造有限自动机
TODO: 画个例子
2. 由正规式构造有限自动机
TODO: 画个例子
3.5. 词法分析程序自动生成器 Lex
似乎是留给实验了