第4章词法分析
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CLASS VAL 标识符: 1 常整数: 2 实常数: 3
特殊符: n 0
NAMEL CONSL
单词的识别
词法分析的关键之一是如何识别单 词的问题,其中最重要的是标识符的 识别问题。
4.2 单词的描述工具
定义2.1 正则表达式 设Σ为给定字母表,RE表示Σ上正则
表达式之集,则定义: 1.Λ,ε∈RE 2.若a∈Σ,则a∈RE 3.若e1,e2∈RE,则
转换矩阵
a
b
+s0
s1
s2
s1
s3
s2
s2
s1
s3
-s3
s3
s3
状态转换图:
S1
a
a
+ S0
b
a
b
b
S2
可以识别=aa,abaaa等。
a|b S3 -
4.3.2 非确定自动机
定义2.5 NDA 一个非确定自动机(NDA)A是一个五元组
A=(S, ∑,δ,S0,F) S 是状态集{s0,s1,…,sn}(n≥1)。 ∑是字母表{a1,a2,…,an}(n≥1)。 δ是映射:S×∑→S,不要求是单值的 S0 是初始状态集(非空) F 是终止状态集,FS。
等价的DFA
a
a
A
a
C
b
E
S
ba
a
ab b
b
B
b
D
b
aF
总结:
① 对于简单的ε自动机,利用构 造算法消除ε边,然后进行确定化。
② 对于复杂的ε自动机,利用ε 闭包的算法进行处理。
4.3.4 确定自动机的化简
确定自动机的化简的步骤: εDA →NDA →DA →最小化DA
去除多余状态:从自动机的开始状 态出发,任何输入也不能达到的状态, 或从该状态到达不了终止状态。
词
语
法
法
charsequence 分
分
析 TOKEN 析
器
器
词 charsequence 法
分 析 器
TOKENsequence
词法分析器的设计
TOKEN的通常结构是一个二元组: CLASS VAL
TOKEN:
其中CLASS示种类部分,VAL是值部分
TOKEN结构的一种方法可如下图,其 中n是从4开始的编码,且一特殊符一 码。
{1,2,3}
A
{1,2,3,5,6,f} C
{1,2,3,6,f} F {1,2,3,6,f} F {1,2,3,5,6,f} C
Ib
{1,2,4}
B
{1,2,4}
B
{1,2,4,5,6,f} D
{1,2,4,6,f} E
{1,2,4,5,6,f} D {1,2,4,5,6,f} D {1,2,4,6,f} E
s1
_s2
s3
s0
_s3
s2
状态转换图如下:
b
a
S1
+
S0
b
-
a
S3
b
a
S2 -
定义2.4 (1) s’ a
设s’’A,=(则S,s∑’ a,δs,’’s0,F)
s’ s’’,s’’ a s’’’,则s’ a s’’’
(2) L(A)={β|s0 s’, s’∈F }
前一条表明自动机的推理作用,后 一条表明其词法分析的作用。
例子:Σ={a,b} L(a*)={ε,a,aa…} L(ba*)={b,ba,baa…} L(a|ba*)={a,b,ba…} L(aa|bb|ab|ba)={aa,bb,ab,ba}
例子:∑={a,b}
正则式e
L(e)
1.ab* 1.∑上所有以a为首后跟任意多 个(包括0个) b的字符串集
a(a|b)* 2.∑上所有以a为首的字符串集
定义2.6 设A是一个 NDAA=(S,∑,δ,s0,F),则定义:
L(A)={|s0 S’ , s0∈S0, S’∈F}
定义2.7 设A1和A2是同一字母表上的 自动机,如果有L(A1)=L(A2),则称A1和 A2等价。
例子:考虑下图所示的非确定自动机。 A2=(S,∑,δ,S0,F) S={0,1,2 } S0={0,1 } ∑={a,b} F={1,2} δ(0,a)={0,1} δ(0,b)={2 } δ(1,a)={ } δ(1,b)={1,2} δ(2,a)={1 } δ(2,b)={2 }
2a 3
+
0
1
6 7
4 b 5
a
- 10 b 9 b
8
① 计算ε闭包 ε-closure(0)={0,1,2,4,7}//由该状 态出发经过ε边所达到的状态。
a
b
+{0,1,2,4,7}
{0,1,2,4,7} a {3,8}
ε-closure({3,8})={1,2,3,4,6,7,8}
例子
a
a
i 12
b b
3a
a
5 6f
4
b
b
a
a
i 12
b b
3a
a
5 6f
4b
b
{i,1,2}
S
{1,2,3}
A
{1,2,4}
B
{1,2,3,5,6,f} C
{1,2,4,5,6,f} D {1,2,4,6,f} E {1,2,3,6,f} F
Ia
{1,2,3}
A
{1,2,3,5,6,f} C
2. 若I=[s1,…,sm]是A’的一个状态, a∈∑,则定义δ’(I,a)=Iaδ,其中δ为A 的转换函数。
3. 重复步骤2直至不出现新的状态I为
止。
4. 若I=[s1,s2,…sn]是A’的一状态,且 存在一个I使得S是A的终止状态,则令
I为 A’的终止状态。
例子:考虑下图所示的非确定自动机。
如果β∈L(A),则称β可被A所接受。 其中→表示映射,表示推导。
例子:标识符的正则式: 字母(字母|数字)*
状态转换图如下:
开始状态
0 字母
终止状态
分界符
1
2
字母或数字
可为每个状态设计一段处理程序, 得出标识符的分析程序。
入口 读入字符子程序
是字母
N
Y 读入字符子程序
Y 是字母|数字 N
出错处理 N
+0 -+1 -2
a a
0 +
a {0,1}
{1} b
1 -+ a
b
b {2} {1,2} {2}
b b
2 -
4.3.3 NFA转换为等价的DFA
定理2.2 对于每一个非确定自动机A,存在 一个确定自动机A’使得L(A)=L(A’)
aC
B
b
D
aC
A
B
b
D
证明:构造算法如下:
1. 令A’的初始状态为s’0=[s10,s20,… s0k],其中s10,s20,…s0k是A的全部初始 状态。
正则表达式所定义的集合,称为正 则集。
4.3 确定自动机 4.3.1 确定自动机
自动机应用:广泛应用在人工智能,推理 逻辑等领域。
无穷自动机
自动机
有穷自动机
确定自动机 非确定自动机
定义2.3 确定自动机(DA)A是一个五元组 A=(S,∑,δ,s0,F)
S 是状态集{s0,s1,…,sn}(n≥1) ∑是字母表{a1,a2,…,an}(n≥1) δ是映射:S×∑→S,且为单值的 s0 是初始状态,s0∈S F 是终止状态集,FS
第4章 词法分析
4.1 词法分析程序的设 词法分计析器
词法分析是任何编译程序的第一步 工作,因此编译程序都有完成词法分 析的程序部分,称这种程序为词法分 析器或扫描器。
词法分析器的共同特点是把每个单 词转换成其内部形式,称它为符号或 记号(TOKEN)。
词法分析器的功能可图示如下。其 charsequence表示字符序列。
-[QPZ] [P] QPZ
设PQ、P、QZ、Z、QPZ分别为A、B、C、D、 E。则转化为一个起点得到下图:
A+
0
1
B
0
C-
1
0
1,0
1
D-
-E 1
去除等价状态:按终止状态和非终止 状态可将其分为两部分:{A,B}, {C,D,E}。
4. 如果还有ε边,则肯定有ε闭路。 这时要把闭路中的点合并为一个点,边 也作相应处理。
例子:下图是从εDA到DA的过程
情况一:
A
ε
B
a
C
b
D
εa a
C
A
B
εb
b
D
a
a
A
B
b
b
情况二:
A
ε
--
B
A
情况三:
+ A
ε
+
B
A
C D
B
+ B
情况四:
+ S
ε
+ε S
Aε
B
A
+B
情况五:
S
a
S
ε
b A
B
a
b
+{0,1,2,4,7}{1,2,3,4,6,7,8}
{0,1,2,4,7} b {5} ε-closure({5})={1,2,4,5,6,7}
a
b
+{0,1,2,4,7}{1,2,3,4,6,7,8} {1,2,4,5,6,7}
② 转化为确定自动机:
转化如下:
ab
T0 ={0,1,2,4,7}
(e1|e2)∈RE,(e1e2)∈RE,(e1)*∈RE
例子: Σ={a,b}
正则式e b+ b*
L(e) {b, bb, bbb…} {ε,b, bb, bbb…}
例子: (a|b)*
(a|b)0 (a|b)1
{a,aa,ab,aaa…}
{ε} {a, b }
(a|b)2 =(a|b) (a|b) {aa,ab,ba,bb}
2. 设B直接后继为B1,B2,…,Bn,且有: B ai Bi (1≤i≤n)则作下面
工作: 2.1消除原ε边(节点保留):A ε B 2.2引进新边:A ai Bi
2.3如果B标有“-”,则给A标上“-”。
2.4如果存在一条从始点到A点的ε路, 则给B标上“+”。
3. 重复步骤2直至不出现步骤1所指的 ε边为止。
+T0 T1 T2
T1 ={1,2,3,4,6,7,8} T1 T1 T3
T2 ={1,2,4,5,6,7} T2 T1 T2
T3 ={1,2,4,5,6,7,9} T3 T1 T4
T4 ={1,2,4,5,6,7,10} -T4
T2
转换后的DA图如下:
b
2
ba
b
+ 0
a1
b
3b
4
a
a
a
NFA的确定化
+
e
-e
1
3 f2
f
+
c
-
1
b
3
a
2
去除等价状态:从状态A出发,能读 出某一字符串x而停于终态,从状态B出 发也能得出同一字符串停止于终态;反 之亦然。
例子:简化自动机
+
Q
0
+
P
1
1
1
-Z
1,0 +[PQ]
0 [P]
1 [QZ]
[P]
[Z]
-[QZ] [P] [QPZ]
-[Z] [P] [P]
每个DA均可用矩阵(状态转换矩阵) 或状态转换图来表示。
例子:A=(S,∑,δ,s0,F)
S={s0,s1,s2 ,s3} ∑={a,b} F={s2,s3}
δ(s0,a)=s1
δ(s0,b)=s2δ(s1Βιβλιοθήκη b)=s1δ(s2,a)=s3
δ(s2,b)=s0
δ(s3,a)=s2
a
b
+s0
s1
s2
s1
定义2.2 设e∈RE,则定义函数L(e)如 下:
L(Λ)= L(ε)= {ε} L(a)={a} L(e*)= L(e)*
L(e1|e2)= L(e1)∪L(e2) L(e1 e2)= L(e1)L(e2)
定理2.1 设e1 ,e2∈RE,则有: 1:L(e1|e2)=L(e2|e1) 2:L((e1|e2)|e3)=L(e1|(e2|e3)) 3:L((e1e2)e3)=L(e1(e2e3)) 4:L(e1(e2|e3))=L(e1e2|e1e3) 5:L((e1|e2)e3)=L(e1e3|e2e3) 6:L(εe1)=L(e1ε)=L(e1)
ε
b
a
A
例子:下图是从εDA到DA的过程
+
S
1
X
ε
ε
1
-
Z
0Y
1
1
转化过程如下:
11 X -
+
S
ε
1
0Y
1
1
-+
Z
+-
S
1
1
X -+
1
1
1
0Y
1
1
+-
Z
确定化:
0 +-SXZ Y
Y -SXY Y
-Z -SXYZ Y
-S Y
1 SXY Z SXYZ S SXYZ SXY
例子:求闭包,将εDA转化到DA
是分界符
出口 识别出一个标
Y
识符后的处理
例子:FA=({s0,s1,s2,s3},(a,b),f,S0,{s3}) 其中映射f为:
f(s0,a)= s1 f(s1,a)= s3 f(s2,a)= s1 f(s3,a)= s3
f(s0,b)= s2 f(s1,b)= s2 f(s2,b)= s3 f(s3,b)= s3
例子: 正则式e ab* ab+ a(a|b)+ a(a|b)*
L(e) {a,ab,abb,abbb…} {ab,abb,abbb…} {aa,ab,aaa…} {a,aa,ab,aaa…}
a(a|b)* {a,aa,ab,aaa…}
标识符:<字母>(<字母>|<数字>)*
语法图 文法 →自动机→状态图→编程 正则式
a
+ SP
b
-b
Z
b
P a
a -
-
SZ b
SPZ
b
为方便,将扩充自动机使得在边上有 ε符号。我们称这种自动极为ε-自动 机。并记为εDA或εNDA。
定理2.3 对任给εDA均可构造一个DA,使得这
两个自动机等价,既有L(εDA)=L(DA)
构造算法:
1. 首先找如下ε边,其中B没有ε输出 边: A ε B 如果没有这样边,则转步骤4。
b
b
a
-
Z
S+
+
P
b
b
由不确定自动机A构造等价的确定自 动机A‘过程如下图所示。
ab
a
b
+S P S,Z +[SP] [P] [SZ]