第 4 章 词法分析
DESCRIPTION
第 4 章 词法分析. 4.1 词法分析程序的设计. 词法分析器. 词法分析是任何编译程序的第一步工作,因此编译程序都有完成词法分析的程序部分,称这种程序为 词法分析器 或 扫描器 。. 词法分析器的共同特点是把每个单词转换成其内部形式,称它为 符号 或 记号 (TOKEN) 。. 词 法 分 析 器. 语 法 分 析 器. charsequence. TOKEN. 词法分析器的功能可图示如下。其 charsequence 表示字符序列。. 词 法 分 析 器. charsequence. TOKEN sequence. - PowerPoint PPT PresentationTRANSCRIPT
第第 44 章章词法分析词法分析第第 44 章章
词法分析词法分析
词法分析器词法分析器 词法分析是任何编译程序的第一步工作,因此编译程序都有完成词法分析的程序部分,称这种程序为词法分析器或扫描器。 词法分析器的共同特点是把每个单词转换成其内部形式,称它为符号或记号记号 (TOKEN) 。
4.1 词法分析程序的设计
词法分析器的功能可图示如下。其charsequence 表示字符序列。
词法分析器
语法分析器
charsequenceTOKEN
词法分析器
charsequence TOKENsequence
词法分析器的设计
TOKEN 的通常结构是一个二元组 : CLASS VAL
TOKEN:
其中 CLASS 示种类部分, VAL 是值部分 TOKEN 结构的一种方法可如下图,其中 n是从 4开始的编码,且一特殊符一码。
1标识符:
2常整数:
3实常数:
0n特殊符:
CLASS VAL NAMEL
CONSL
单词的识别
词法分析的关键之一是如何识别单词的问题,其中最重要的是标识符的识别问题。
4.2 4.2 单词的描述工具单词的描述工具
定义 2.1 正则表达式 设 Σ为给定字母表 ,RE 表示 Σ上正则表达式之集 ,则定义: 1.Λ,ε∈RE 2. 若 a∈Σ, 则 a∈RE 3. 若 e1,e2∈RE, 则 (e1|e2)∈RE,(e1e2)∈RE,(e1)*∈RE
例子: Σ={a,b}
正则式 e L(e) b+ {b, bb, bbb…} b* {ε,b, bb, bbb…}
例子:(a|b)* {a,aa,ab,aaa…}
(a|b)0 {ε}(a|b)1 {a, b }
(a|b)2 =(a|b) (a|b) {aa,ab,ba,bb}
定义 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)
例子: 正则式 e L(e) ab* {a,ab,abb,abbb…} ab+ {ab,abb,abbb…} a(a|b)+ {aa,ab,aaa…} a(a|b)* {a,aa,ab,aaa…}
语法图文法正则式
→自动机→状态图→编程
a(a|b)* {a,aa,ab,aaa…}
标识符: <字母 >(< 字母 >|< 数字 >)*
例子:Σ={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}
L(e)正则式 e
2.∑上所有以 a为首的字符串集a(a|b)*
1.∑上所有以 a为首后跟任意多个 (包括 0个 ) b 的字符串集
1.ab*
正则表达式所定义的集合,称为正则集。
4.3 4.3 确定自动机确定自动机
定义 2.3 确定自动机 (DA)A 是一个五元组A=(S,∑,δ,s0,F)
自动机有穷自动机
无穷自动机确定自动机
非确定自动机
自动机应用:广泛应用在人工智能,推理逻辑等领域。
4.3.1 4.3.1 确定自动机确定自动机
每个 DA 均可用矩阵 (状态转换矩阵 )或状态转换图来表示。
S 是状态集 {s0,s1,…,sn}(n≥1) ∑是字母表 {a1,a2,…,an}(n≥1) δ 是映射: S×∑→S, 且为单值的 s0 是初始状态, s0∈S F 是终止状态集, FS
例子: 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
s2_s3
s0s3_s2
s1s1
s2s1+s0
ba
状态转换图如下:
S0
-
ab
b
b
a
S1
S3
-+
S2
a
前一条表明自动机的推理作用,后一条表明其词法分析的作用。
如果β∈L(A), 则称 β可被 A所接受。其中→表示映射,表示推导。
定义 2.4 设 A=(S,∑,δ,s0,F)(1) s’ s’’ ,则 s’ s’’ s’ s’’ , s’’ s’’’ ,则 s’ s’’’(2) L(A)={β|s0 s’, s’∈F }
a a
a a
例子:标识符的正则式 : 字母 (字母|数字 )*
状态转换图如下:0 1 2
开始状态
字母或数字
字母 分界符终止状态
可为每个状态设计一段处理程序,得出标识符的分析程序。
读入字符子程序入口
是字母 N 出错处理Y
读入字符子程序
是字母 | 数字Y
N 是分界符
N
Y识别出一个标识符后的处理
出口
例子 :FA=({s0,s1,s2,s3},(a,b),f,S0,{s3})其中映射 f为:f(s0 , a)= s1 f(s0 , b)= s2
f(s1 , a)= s3 f(s1 , b)= s2
f(s2 , a)= s1 f(s2 , b)= s3
f(s3 , a)= s3 f(s3 , b)= s3
s3s3-s3
s3s1s2
s2s3s1
s2s1+s0
ba转换矩阵
状态转换图:S1
S2
S0+ S3 -
a
b
b a
a
b
a|b
可以识别 =aa , abaaa 等。
4.3.2 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 。
定义 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 }
{2}{1}-2{1,2}-+1{2}{0,1}+0ba
1
0a
b
-2
a b
b-+
+
a
b
定理 2.2 对于每一个非确定自动机 A,存在一个确定自动机 A’使得 L(A)=L(A’)
A Ba
b
C
D
Ba
b
C
D
4.3.3 NFA4.3.3 NFA 转换为等价的转换为等价的 DFADFA
证明:构造算法如下:1. 令 A’的初始状态为 s’0=[s1
0,s20,
… s0k], 其中 s1
0,s20,…s0
k 是 A的全部初始状态。 2. 若 I=[s1,…,sm] 是 A’的一个状态, a∈∑,则定义 δ’(I,a)=Ia
δ, 其中 δ为 A的转换函数。 3. 重复步骤 2直至不出现新的状态 I为止。
4. 若 I=[s1,s2,…sn] 是 A’的一状态,且存在一个 I使得 S是 A的终止状态,则令 I为 A’的终止状态。
例子:考虑下图所示的非确定自动机。
由不确定自动机 A构造等价的确定自动机 A‘过程如下图所示。
Z-
abb
bb
S P+
+
P-ZZ+PS,ZP+Sba
非确定自动机 A SPZ[P]-[SPZ]
[P]-[Z]
[SPZ][P]-[SZ][Z][P][SZ][P]+[SP]ba
确定自动机 A’
由上述表格可以得出确定自动机 A’ 。确定自动机如下图所示。
为方便,将扩充自动机使得在边上有 ε符号。我们称这种自动极为 ε-自动机。并记为 εDA 或 εNDA 。
Z P
a
b
-SP
a
b
b
+
-
SPZ
SZa
b
b
-
定理 2.3 对任给 εDA 均可构造一个 DA, 使得这两个自动机等价,既有 L(εDA)=L(DA)构造算法:
1. 首先找如下 ε边,其中 B 没有 ε输出边: 如果没有这样边,则转步骤 4。
A Bε
2. 设 B 直接后继为 B1,B2,…,Bn, 且有 :
(1≤i≤n) 则作下面工作:
B Biai
A Bε2.1消除原 ε边 (节点保留 ):2.2引进新边:A Bi
ai
2.3如果 B标有“ -”,则给 A标上“ -”。2.4如果存在一条从始点到 A 点的 ε路,则给 B标上“ +”。
3. 重复步骤 2直至不出现步骤 1所指的 ε边为止。
4. 如果还有 ε边,则肯定有 ε闭路。这时要把闭路中的点合并为一个点,边也作相应处理。
例子:下图是从 εDA到 DA 的过程
A Ba
b
εC
D
情况一:
A Ba
b
C
D
εa
εb
A Ba
b
C
D
a
b
A Bε
情况二:-
A B- -
A Bε
情况三:+
A B+ +
S Aε
情况四:+
Bε
S A+
B+
ε
情况五:
S AB
ε
a
ε
b
S A
ba
例子:下图是从 εDA到 DA 的过程
X
Y
S Z
1
ε
0
1
1
ε1+ -
转化过程如下:
X
YS Z
1
ε
01
1
1+- +1
-
X
YS Z
1
01
1
1+ -
- +
11
1
+ -
确定化:
SXYZY-SXYZ
S-ZSXYZY-SXYZY
SXYY+-SXZ
10
SXYY-S
例子:求闭包,将 εDA 转化到 DA
a
b
a+
-
bb
10
2
4
3
56 7
8910
① 计算 ε闭包ε-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 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}
转化如下:T0 ={0,1,2,4,7} T1 ={1,2,3,4,6,7,8}T2 ={1,2,4,5,6,7} T3 ={1,2,4,5,6,7,9}T4 ={1,2,4,5,6,7,10}
T4T1T3
T2-T4
T2T1T2
T3T1T1
T2T1+T0
ba
② 转化为确定自动机:
a
+ -
b
0
2
1 3 4
a
a
a
a
b
b
b
b转换后的 DA图如下:
NFA 的确定化
例子
4
f
3
5 621i
a a aa
bb b b
Ia Ib{i,1,2} {1,2,3} {1,2,4}{1,2,3} {1,2,3,5,6,f} {1,2,4}{1,2,4} {1,2,3} {1,2,4,5,6,f}
{1,2,3,5,6,f} {1,2,3,5,6,f} {1,2,4,6,f}
{1,2,4,5,6,f} {1,2,3,6,f} {1,2,4,5,6,f}{1,2,4,6,f} {1,2,3,6,f} {1,2,4,5,6,f}{1,2,3,6,f} {1,2,3,5,6,f} {1,2,4,6,f}
S A BA C BB A D
C C E
D F DE F DF C E
4
f
3
5 621i
a a aa
bb b b
等价的 DFA
a
C
DB
A E
F
S b
a
a
a
a
ab
b
b
b
b
a
b
F
总结:① 对于简单的 ε自动机,利用构
造算法消除 ε边,然后进行确定化。② 对于复杂的 ε自动机,利用 ε
闭包的算法进行处理。
确定自动机的化简的步骤:εDA →NDA →DA →最小化 DA
去除多余状态:从自动机的开始状态出发,任何输入也不能达到的状态,或从该状态到达不了终止状态。
1 2f
e+ -3
f
e
4.3.4 确定自动机的化简
去除等价状态:从状态 A出发,能读出某一字符串 x 而停于终态,从状态B出发也能得出同一字符串停止于终态;反之亦然。
1
2a
+ -3
b
c
例子:简化自动机
Q11
+P
Z1,0
0
1
+
-
QPZ[P]-[QPZ]
[P][P]-[Z][QPZ][P]-[QZ][Z][P][QZ][P]+[PQ]10
设 PQ 、 P、 QZ 、 Z、 QPZ分别为 A、B、 C、 D、 E 。则转化为一个起点得到下图:
A
1,01
-CB
1
0
0
1
+
-D E
0
1-
去除等价状态:按终止状态和非终止状态可将其分为两部分: {A,B} ,{C,D,E} 。
{A,B} {A},{B}01
1{C,D,E} {C,E},{D} 所以 CE 等价。
A
1,0
-CB
1
0
1
+
-D
0
1
最终得到的状态图如下:
例子:将下图中的 DFA M最小化。
1
-a+
-
-a
a
aaa
a
b
b
b
b
b
b
b
3
5
6 4
7
2
按终止状态和非终止状态可将其分为两部分: {1,2,3,4} , {5,6,7} 。
a{1,2,3,4} {1,2},{3,4}
{3,4} {3},{4} 。其中 1,2 等价aa
{5,6,7} {5},{6,7} 。其中 6,7 等价a
在 1,2 和 6,7 之中去除一个即可得到最小化的 DA。
1a
+
-
-a a
a
b b
b
b
b
3
5
6 4
a
例子:确定化和最小化下面自动机
a
1
+-b 3
5
2
4
0
a
a
a
b
b
b
b
b
a
a
a b+-0 1 2 1 1 4 2 1 3 4 0 5 3 3 2 5 5 4
由此可知该自动机为确定自动机。 根据状态分为: {0}{1,2,3,4,5}
{1,2,3,4,5} {1,5}{2,3,4}ba
{2,3,4} {2}{3,4}aba
{3,4} {3}{4}a
所以 1、 5 状态等价。
a
1
+-b 32
4
0
a
a
ab
b
ba
b
最小化自动机如下图:
例子:将下图最小化,并描述它所标识的语言。
6
b
2
+ a 3
4
1
b
c
a
b b
c-
7-
5
b
b
d
ad
根据状态分为 {1,2,3,4,5} 和 {6,7}两组。{1,2,3,4,5} {3,4}{1,2,5}
b
所以, 1、 2 状态等价, 3、 4 状态等价, 6、 7 状态等价。
{1,2,5} {1,2}{5}
bab
最小化结果为:
6+ a 3
5
1
a
b b
c-
db
例子:设有正则表达式 e为 :(a|b)*(aa|bb)(a|b)*
构造确定有穷自动机 A,使 L(A)=L(e)
解:求 e 的转换系统
S 1 2(a|b)*Zaa|bb (a|b)*
+ -
首先,利用求闭包的方法转化为确定自动机。得出如下表格 :
S 1 2
b
Za
4 3
b
aa
b6
5
b
a+ -
S 1 2
a|b
Z
aa 4 3
bb a|b-+
{3,1,6,4,Z}{3,1,5,2,4,Z}-{3,1,5,4,Z}
{3,1,6,2,4,Z}{3,1,5,4,Z}-{3,1,6,4,Z}
{3,1,6,2,4,Z}{3,1,5,4,Z}-{3,1,6,2,4,Z}
{3,1,6,4,Z}{3,1,5,2,4,Z}-{3,1,5,2,4,Z}
{3,1,6,2,4,Z}{3,1,5}{3,1,6}
{3,1,6}{3,1,5,2,4,Z}{3,1,5}
{3,1,6}{3,1,5}+{S,3,1}
ba
Move([s,3,1],a)=(3,5)-closure(3,5)=[1,3,5]
0
1
2
a3
b b4
5
6
b
b
b
b
ba
aa
aa
a
+
-
-
-
-
得到确定自动机如下图 :
0
1
2
a3
b b
b
b
a
a a+
-
化简后如下图,其中 3, 4, 5, 6四个状态等价。
4.4 4.4 自动机与正则表达式的关系自动机与正则表达式的关系定理 2.4 对于任一确定自动机 A,
存在以正则表达式 e,使得 L(A)=L(e) 。反之亦然。证明: () 设 A为给定确定自动机 ,则构造相应正则表达式的主要算法如下图。
代之以
1 2 3
1 3
1 2
代之以 1 2|
代之以
1 2 3
1 3*
()由给定正则表达式β构造相应自动机的主要方法是:首先构造如下扩展转换图
X W+ -
然后利用下列规则加进节点和边,直至得到 ε-自动机为止。
代之以
i k j
i j
i j
代之以i j|
代之以
i k j
i j*
在运用上述转换规则前引入一新结点 W,并从所有终止结点引出 ε边到 W结点,并令 w为唯一的终止结点。他显然等价于原自动机。
正则式至自动机的转换系统:即一种特殊的状态图,具有唯一的开始状态 S和唯一的终止状态 Z,没有弧引至 S ,也没有弧自 Z 引出,弧可以用 ε标记。
S1
S2
+ Z1
X
-
-Z2+
S1
S2
+Z1
X
-
Z2
S
Z
例子:将自动机 DA转化为正则式
2
3
14
ac
df
e+-b
-
2
3
14
ac
df
e+ -
bW
2
3
14
a|bc
df
e+ -W
2
3
14
a|bc|d
f
e+ -W
3
1
4
+ -W
(a|b)(d|c)*e(a|b)(d|c)*f
(a|b)(d|c)*(e|f)1
+ -W
2
3
14
(a|b)(c|d)*
f
e+ -W
例子:考虑将前例中的正则式 : (a|b)(d|c)* (e|f) 转换化为自动机如下图:
X+ -
W(a|b)(d|c)*(e|f)
X+ -
W1 2(a|b) (d|c)* (e|f)
3 2X 1a
c
df
e+ -
bW
3X 1a
c
df
e+ -
bW
3 2X 1a c
d f
e+ -
bW
f
e
3X 1
a c
df
e+ -
b
W
c
d
e f
4.4 正则文法与自动机定理 3.7 3型文法的句型形如 ωX, 其中 ω∈VT
+ , X∈(VN∪VT) 。定理 3.8 3型文法与产生式的形式为 A→ωB或 C→ω型的文法等价 ,其中 ω∈VT
+ 。
例子 : S→abS|aaB|d B→bbB|b转化: S→aS’|aR|d S’→bS R→aB B→bB’|b B’→bB
定理 3.9 3型文法与自动机等价
自动机 A=(S , ,, s0 , F)
3型文法 G=(VN , VT , P, Z)
转换规则: ① 文法没有表示终止的符号,需要添加一个大写字母,表示结束状态。 ② 大写字母对应自动机的状态集。 ③ 小写字母对应自动机的字母表。 ④ 文法的初始符为初始状态。 ⑤ 产生式 B→b转换为
bB -
产生式 Z→bB转换为 b
Z B
⑥ 去掉多余状态
例子 :设有 3型文法如下 G1:Z→aZ|bB|c B→dB|b等价自动机 A1=(S,Σ,δ,s0,F) 如下 : S= { Z,B,K } Σ= { a,b,c,d} S0= { Z} F= { K} δ(Z,a)=Z, δ(Z,b)=B, δ(Z,c)=K, δ(B,d)=B, δ(B,b)=K
ca db
bK
BZ+
-
注意:如果给定文法可以化简应进行化简再转换。
1.Y为非终止状态: X→aY2.Y为有输出边的终止状态 X→aY|a3.Y为无输出边的终止状态 X→a
自动机 A=(S , ,, s0 , F)
3型文法 G=(VN , VT , P, Z)
aX Y
例子 :自动机 A2 如下图 ,求等价 3型文法
bb
b a
aa
B
M
Zb
R-
+
-
-
等价 3型文法 G2=(VN,VT,P,S) 如下 : VN= { Z,B,M} R 是终止状态没有输出边去掉
VT= { a,b } S=Z P= { Z→aM|bB|a|b B→aB|bZ|a|b M→bM|b|a }说明 : Z→aM|a Z→bB|b
例子 : 设有文法如下: G[S] : S→A|bB A→c B→dD D→ε 构造等价自动机。化简文法: S→c|bB B→dD B→d
c
db
d
K
BS+
-
D
c
b
d
K
BS+
-
例子 : 自动机如下所示 ,求与之等价的正则文法。
1 2a 3b
a+ -b
a b+1 2 2 2,3-2,3 2 2,3
G=({A,B,C},{a,b},P,A), 其中 P为: A→aB B→bC|b C→aC|a|aB
A Ba Cb
a
+-
a
4.6 词法分析程序的生成器
这里介绍一种以正则表达式作为输入的词法分析程序生成器,称为 LEX。
单词的描述 词法分析程序生成器
LEX 源程序 LEXCompiler
词法分析程序
1. 一个 LEX 源程序由下面两段组成:
辅助定义 ( 可略 )转换规则段
辅助定义段形式: D1=R1
D2=R2
…… Dn=Rn
例如:设 VT={A,B,……Z,0,1,……9}letter=A|B|……|Z
digit=0|1|……|9identifer=letter(letter|digit)*
第三个式子不能在一、二之前。
转换规则形式: P1 {A1} P2 {A2} …… …… Pn {An}
例子:要构造具有此变换功能的词法分析器,可编写 LEX 源程序如下:辅助定义段 Letter=A|B|……|Z Digit=0|1|……|9转换规则段 IF {return 3 } THEN {return 4 } ELSE {return 5 } > {return 34}
:= {return 38} ( {return 20} ) {return 21} + {return 24} * {return 26}letter(letter|digit)* {return,0, 标识符自身值 }digit(digit)* {return,1, 常量值 }…… ……
2. LEX compiler 所完成的工作:(a)对于每条转换规则 Pi( 正则式 )构造 NFA 自动机。(b)引进新的开始状态,由此出发通过 m 条弧,将 m 个 NFA连成一个 NFA 。(c)运用子集法将 NFA化为 FA。例子:试利用 LEX compiler 自动生
成一个能识别无符号数 d…d.d…dESd…d的词法分析程序。
准备提交给生成的 LEX 源程序为 辅助定义段: digit=0|1|…|9 (d) Sign=+|-|E (S)
转换规则段: dd* {A1} d*.dd* {A2} d*ESdd* {A3} d*.dd*ESdd* {A4}
当 LEX 生成器接受上述 LEX 源程序后,它依次完成几个步骤: (a) 构造四个 Pi对应的 NFA
d d1 2A1
d d4 5A2 3●
d
d d8 9A3 6
d
7 SE
d
d
12
15
A4 10d
11●
E
S 1413
d
d
(b) 合并为一个 NFAd d1 2
0
d d4 53●
d
d d8 96
d
7 SE
d
d
12
15
10d
11●
E
S 1413
d
d
(c)相应 FA开始状态 {0,1,3,6,10}用子集法。
1515151499
141398
135,125,12
[7]7
8[4,11]
4,11
[2,3,6,10]2,3,6,10
5,12
[0,1,3,6,10]
2,3,6,10,4,11,7
IEISI.IdI
重新命名如下:
HIJ
HIJ
IGHF
GEEFD
ECDBBDBA
IEISI.IdI
得到状态图:
d
d
C
BA
D
E
F H
I
G
J
dE
●●
E
dd
d
E S
d
S
d
化简自动机:{非终极符 } d{A,C,F,I}{D,G}
{A,C,F,I}.d{A}{C,F,I}
{C,F,I}dESd {C}{F,I}
所以, D和 G等价、 F 和 I等价。 同理, H和 J等价。得到化简的状态图如下:
d
d
C
BA
D
E
F H
dE
●●
E
dd
E
S
d
4.8 状态转换图
设计词法分析器时首先要构造状态转换图,它是一自动机即一张有向图,由一些结点和连接它们的箭弧以及弧上的字符组成。在这些结点中有一结点是初始结点,还有一个或多个终止结点。称有向图的结点为状态。
下面以‘指数部分’为例,介绍从词法图到状态转换图的方法。‘指数部分’的词法图如下:
E
+
-
d
首先在词法图的入口和出口处各设一结点。分别称为状态转换图的初始和终止结点。
a b
a b若有 情形而弧上没有一结点,则其弧上设一新结点:
把 改成 a a
“清除”空弧 ( 非出口弧 )
从上图到确定状态转换图的过程如下图所示。
E
+
-
d1● ● ●●
23
4
1● ● ●●
23
4E d
d
+
-
● ● ●●E d
d+
-
d
1● ● ●●
23
4E d
d+
-
dd
图 (d) 的缺点是终止结点有输出边。它不能反映何时结束。为此我们要求终止结点没有输出边。当然,我们也可直接画出所需状态转换图。但最好的方法是机械的去构造它。
E d
d+
-
d
1 2 3 4
4.9 状态转换图的实现 考虑 PASCAL 语言的子情况。具体情况如下图所示:
-WHILEWHILE-$ENDEND-$BEGINBEGIN
CONSL地址$REAL实常数CONSL地址$INT整常数NAMEL地址$ID标识符VAL 助记符 单词
65
321
Class
4
-$PLUS+-$SEM1;-$DO DO
-$STAR*-$ASSIG:=
9
7
1110
8
-$LE<=-$LT<-$:
12
1413
其中单词的状态转换图如下图所示,l 表示字母, d表示数字。
l,d空白l #
d#d
#
+
*
=:
#
=<
#
;
例子 : X1:=X1+1; Begin YY:=0.5; ZZ:=YY*X1 End; While X1<100 DO X1:=X1经词法分析后所得到的 TOKEN 序列如下 (假定 NAMEL 表和 CONSL 表序号均从 0000 开始 ):
-$ASSIG13
0002$ID12
-$SEMI11
0001$REAL10
-$ASSIG9
0001$ID8
-$BEGIN7
-$SEMI6
0000$INT5
-$PLUS4
0000$ID3
-$ASSIG2
0000$ID1
0000$ ID26
-$ ASSIG25
0000$ID24
-$DO23
0002$INT22
-$LT21
0000$ID20
-$WHILE19
-$SEMI18
-$END17
0000$ID16
-$STAR15
0001$ID14
同时被生成的 NAMEL 表和 CONSL 表分别如下图:
ZZ0002YY0001X10000
NAMEL 表
100的 =进制0002
0.5 的 =进制0001
1 的 =进制0000CONSL 表