第3章词法分析.docx
《第3章词法分析.docx》由会员分享,可在线阅读,更多相关《第3章词法分析.docx(45页珍藏版)》请在冰豆网上搜索。
第3章词法分析
第三章词法分析
知识结构:
功能
词法分析器的要求单词符号分类
词法分析单词内部形式
器的设计设计方发
词法分析器的设计状态图
词法分析器组成
正规表达式
单词描述工具正规集
词法分析器正规文法
确定有限自动机(DFA)
单词识别工具非确定有限自动机(NFA)
DFA的最小化
正规式与FA的等价转换
等价转换
正规文法与FA的等价转换
第一节对词法分析器的要求
一、词法分析器的功能
输入源程序,输出单词符号(二元式表示)。
二元式
(单词流)
源程序
(字符流)
词法分析器
输入输出
二、单词符号的分类
关键字:
是由程序语言定义的具有固定意义的标识符。
标识符:
用来表示各种名字,如变量等。
常数:
常数的类型有整型,实型等。
运算符:
算术运算符,关系运算符,逻辑运算符。
界限符:
逗号,分号等。
三、单词符号内部的表示形式
内部的单词符号TOKEN字(二元式),TOKEN字占用机器字的长度,依据信息量的多少而定。
1、TOKEN字结构
CLASS(单词种别码)
VALUE(单词符号得属性)
CLASS:
用整数表示。
VALUE:
表示单词符号的属性(符号表指针)。
2、TOKEN的作用
CLASS:
用于语法分析器对源程序结构的分析。
VALUE:
用于语义分析器对源程序具体操作的分析。
3、单词种别码划分原则
CLASS:
关键字,运算符,界限符(编译程序定义的符号)使用一字一种编码。
VALUE值省略。
VALUE:
标识符,常数(用户定义的符号),存放符号表常数表的指针。
标识符,常数每一类为一种编码。
例:
BEGINA:
=BEND;
词法分析结果:
符号表
名字属性
A
B
(BEGIN,----)
(A,K1)K1
(:
=,---)
(B,K3)K3
(END,---)
(;,---)
四、词法分析器的结构
1、一遍扫描(交互式结构)。
2、多遍扫描(独立式结构)。
第二节词法分析器的设计
一、设计步骤
1、确定词法分析器的接口关系;
2、确定单词分类和TOKEN字的结构;
3、对每一类单词构造状态转换图;
4、根据状态转换图设计算法。
二、功能描述
1、组织源程序输入;
2、按词法规则拼读单词符号,并转换成二元式;
3、删除注解行,空格和无用符号;
4、检查词法错误。
三、设计方法
1、输入(读取原文件)
原文件存储方式:
一种方式将原文件一次读入内存,另一种方式利用缓冲区技术将原文件分批读入内存。
缓冲区的设置:
输入(扫描)缓冲区,存放输入的原文件(双缓冲区)。
起点指针扫描指针
2、预处理
功能描述:
删除无用符号,出错信息的列表打印。
单词符号的识别:
⑴语句格式
①标识符不能被无效字符隔开。
②标识符与关键字,关键字与关键字之间用空格符隔开。
②标识符的个数不能超过限定的个数。
⑵单词符号的格式
①标识符,关键字的首字符必须是字母。
②常数的首字符必须是数字。
3、识别算法(P39)
标识符的识别;常数的识别;算符的识别;界符的识别。
四、状态转换图
1、状态转换图的表示形式
是一张有向图,结点代表状态(用○表示),结点间用箭弧线连接(),箭弧线上的符号,表示射出结点到达射入结点可能识别的输入符号,终态结点代表分析结束。
2
1
初态a
3
31
bc
d
⑴⊙初始状态,表示识别符号串的开始。
⑵双圈◎终态,表示识别符号串的结束。
⑶◎*表示多读入一个字符。
例1:
标识符的状态转换图
状态转换矩阵
状态
字母
数字
其它
0
1
1
1
1
2
2
0
1
21
字母其它*
字母,数字
例2:
标识符“AB1”的识别
2
1
0
1
1
AB1其它*
例4:
无符号数状态转换图
1
21
0
数字其它*状态转换矩阵
状态
数字
其它
0
1
1
1
2
2
数字
2、识别过程
从初态开始,逐步读入字符,转到下一个状态(或出错),直至终态(或不能到达终态出错)。
例3:
字符串“AB+12”的识别
23
1
0
1
AB+*
1
0
识别出单词AB,多读入一个字符+。
由另一张状态转换图识别单词符号+。
+
继续识别剩余字符12(数字):
2
1
0
1
12其它*
上述识别过程把AB+12字符串分解为三个单词符号“AB”、“+”、“12”。
3、状态转换图的实现
状态转换图非常容易用程序实现,每一个状态对应一段程序。
⑴不含回路的分叉状态结点的程序设计
J
字母
I
K
数字
L
其它符号
利用多分支语句CASE或选择语句IF...THEN...ELSE...。
⑵含回路状态结点的程序设计
J
I
其它
数字,字母
利用循环语句WHILE...DO。
⑶词法分析程序的组成
状态转换图是一种特殊的流程,它可直观清晰地描述单词符号的识别过程,只要把每一个结点加入语义动作,就构成了词法分析程序。
4、词法分析程序的组成(八个模块)
主控模块;初始化模块;判定源程序文件是否存在模块;从源程序文件中读一个字模快;拼读一个单词模块;查关键字模块;输出单词模块;错误处理模块。
第三节正规式、正规集、正规文法
一、正规式的定义
中的符号为正规式的基本符号,单个符号或由符号与运算符组成的表达式称正规式。
运算符优先级:
重复用“*”表示;
连接用“”表示或省略;
选择用“”表示。
例:
a,ab*,ab,(ab)c都是正规式。
二、正规集
由正规表达式所表示的字符串的集合称为正规集。
如正规式用V表示,正规集L(V)表示。
三、正规文法
正规文法是上下文无关文法的一种特殊情况,所有产生式的右部至多含有一个非终结符号,左线性文法,右线性文法都属于正规文法。
左线性文法:
AB
A
右线性文法:
AB
A其中:
A,BVN,V*T
四、正规式与正规集的递归定义
1、正规式与正规集的递归定义P46
⑴ε和Ф都是Σ上的正规式,正规集为{ε}和Ф。
⑵任何a∈Σ,a是上的正规式,正规集为{a}。
⑶假定U和V是上的正规式,正规集为L(U),L(V)
U∪V是正规式,正规集为L(U)∪L(V)。
UV是正规式,正规集为L(U)L(V)。
(U)*是正规式,正规集为(L(U))*。
例1:
令Σ={a,b},则
⑴正规式a|b的正规集是{a,b}。
⑵正规式(a|b)(a|b)的正规集是{aa,ab,ba,bb}。
⑶正规式a*的正规集是{ε,a,aa,aaa……}。
⑷正规式(a|b)*的正规集是{ε,a,b,aa,ab,ba,bb,aaa……}。
(a|b)*=(a*b*)*,即所有a和b的符号串集合。
⑸(a|b)*(aa|bb)(a|b)*的正规集是所有含有两个相继a或两个相继b的字符串集合。
例2:
={a,b,c……z,0,1,……9}
正规式(a|b…|z)(a|b|…z|0|1|…|9)*代表标识符。
2、正规式与正规集的等价性
若两个正规式代表的正规集相同,则认为正规式等价。
U=V,表示L(U)=L(V)
例3:
U=10*0*,L(U)={1}{0}*
V=10*,L(V)={1}{0}*
则10*0*=10*
例4:
b(ab)*=(ba)*b(ab)*≠a*b*
(a|b)*=(a*b*)*(a|b)*≠(a*|b*)
3、正规式的代数定律
(1)UV=VU交换律
(2)UVW=(UV)W结合律
(3)U(VW)=(UV)W结合律
(4)U(VW)=UVUW分配律
(5)εU=Uε=U
(6)U*=U+
(7)U**=U*
(8)U+=U*U=UU*
例1:
选择规则UV,则描述的正规集L(UV)=L(U)∪L(V)。
令U=a,V=b:
则L(UV)=L(U)∪L(V)=L(a)∪L(b)
={a}∪{b}={a,b}
例2:
连接规则UV,则描述的正规集L(UV)=L(U)L(V)。
令U=ab,V=c:
则L(UV)=L(U)L(V)=L(ab)L(c)
={a,b}{c}={ac,bc}
例3:
重复规则U*,则描述的正规集L(U*)=(L(U))*。
U*={}∪U1∪U2∪...∪Un
U=(aab)
L(U*)=(L(U))*=(L(aab))*=(L(a)∪L(ab))*
={a,ab}*
={a,ab}0∪{a,ab}1∪{a,ab}2∪
={}∪{a,ab}∪{a,ab}{a,ab}∪
={,a,ab,aa,aab,aba,abab,}
五、正规式与正规文法的转换
正规式与正规文法都有相同的表达能力,用以描述语言(单词符号)的结构,使得所描述的语言是等价的(即L(V)=L(G))。
1、正规式与正规文法的特点
正规式描述的语言结构清晰,简洁;而正规文法描述的语言于识别。
2、正规定义式
d1r1
d2r2
...
其中:
di为定义式的名字;ri是∪{d1,d2,...,di-1}构成的正规式;ri中不含有di,di+1,...。
3、正规式与正规文法的转换算法
例:
高级语言标识符的正规式
字母(字母数字)*
⑴根据正规定义式规则,给正规式分量、正规式定义名称
字母ABC
数字012
id字母(字母数字)*
⑵对定义式的子表达式定义名称
rid(字母数字)*
⑶对定义式的子表达式展开
(字母数字)*
=(字母数字)+
=(字母数字)(字母数字)*
=字母(字母数字)*数字(字母数字)*
⑷把展开式代入定义式
rid字母(字母数字)*数字(字母数字)*
⑸把rdi(字母数字)*代入定义式id、rid,将得到正规文法:
id字母rid
rid字母rid数字rid
其中:
id,ridVN;字母,数字VT。
六、正规文法与正规式的转换
建立正规文法的联立方程组,求描述同一语言的正规式。
1、右线性文法到正规式,使得L(G)=L(V)。
产生式XrXt,其中r,tVTXVN。
论断1:
方程X=rX+t,有形如X=r*t的解。
例:
文法G
SaSbAb
AaS
⑴立联立方程组
S=aS+bA+b①
A=aS②
⑵②式,代入①式
S=aS+baS+b
S=(a+ab)S+b
⑶由论断得方程解
S=(a+ab)*b
=(aab)*b
对于同一方程式采用不同的结合方式,可以得到不同形式的正规式,但是所描述的语言(正规集)是等价的。
S=aS+baS+b
=aS+(baS+b)
=a*(baS+b)
=a*baS+a*b
=(a*ba)*a*b
所以(a*ba)*a*b=(aab)*b。
2、左线性文法与正规式的转换算法
产生式XXrt,其中r,tVTXVN。
论断2:
方程X=Xr+t,有形如X=tr*的解。
例:
文法G
idid字母id数字字母
其中:
idVN;字母,数字VT。
建立方程
id=id字母+id数字+字母
=id(字母+数字)+字母
=字母(字母数字)*
3、正规文法与正规式的转换规则
⑴产生式AxB,By对应的正规式A=xy;
⑵产生式AxAy对应的正规式A=x*y;
⑶产生式Ax,Ay对应的正规式A=xy
例:
文法G
SaA,Sa
AaA,AdA,Aa,Ad
⑴根据规则⑶先有正规式
S=aAa
A=(aAdA)(ad)
⑵再将A的正规式变换为
A=(ad)A(ad)
⑶根据规则⑵将A的正规式变换为
A=(ad)*(ad)
⑷再将A式的结果代入S的正规式
S=a(ad)*(ad)a
⑸再利用正规式的代数性质得到的正规表达式为
S=a((ad)*(ad))
因为(ad)*(ad)=(ad)+,
所以S=a(ad)+a=a((ad)+)。
又因为(ad)+=(ad)*,
所以S=a(ad)*。
第四节有限自动机(FA)
有限自动机是具有离散输入和输出系统的一种数学模型,它能准确地识别正规文法所定义的语言和正规式表示的正规集,引入有限自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法。
有限自动机的分类:
⑴确定有限自动机(DFA)。
⑵非确定有限自动机(NFA)。
一、有限自动机的表示形式
⑴状态图
一个有限自动机可以用一个状态图(状态转换图)表示,即含有m个状态,n个输入符号,若f(ki,a)=kj,则从状态结点ki到状态结点kj画标记为a的弧。
弧上标记的符号表示当前识别的符号。
⑵状态表
一个有限自动机可以用一个矩阵表示,该矩阵的第一列表示状态,第一行表示输入字符,矩阵元素表示相应状态和输入字符到达的下一状态,即k行a列为f(k,a)的值。
二、有限自动机的应用
⑴翻译器
有限自动机(FAM)作为转换器将输入串变换为输出串。
M=(S,,R,,S0,F)
⑵串产生器
有限自动机(FAM)如果只有输出没有输入。
M=(S,R,,S0,F)
⑶串识别器
有限自动机(FAM)如果只有输入没有输出。
M=(S,,,S0,F)
其中:
S状态集;输入字母表;R输出字母表;状态转换函数;S0初态;F终态
三、有限自动机的工作原理
例:
有限自动机识别无符号实常数的过程
.
0
2
1
3
d.d
dd
⑴接受
从初始状态出发所识别的字符串结束时能够到达终态结点。
例:
35.67为有效字符串。
⑵阻塞(出错)
从初始状态出发所识别的字符串结束时没能到达终态结点。
例:
356.为无效字符串。
四、确定有限自动机DFA
确定有限自动机(DFAM)是一个五元组:
DFA(M)=(S,Σ,δ,s0,F),
其中:
⑴S是一个状态的有穷集—自动机所有状态的集合。
⑵是有穷字符集合,它的每一个元素为一个输入字符。
⑶δ状态转换函数δ(S,a)=S′,当现行状态为S,输入字符为a时,将转换到下一个状态S′。
S→S单值映照函数。
⑷S0S唯一的初始状态。
⑸FS终态集。
若DFAM上有m个状态,n个输入符号(中的元素有n个),则状态转换图上有m个状态结,每个状态结最多有n个射出弧线与后续的状态连接。
1
例DFAM状态矩阵表
状态
a
b
0
1
2
1
3
2
2
1
3
3
3
3
aa
0
3
baa,b
2
bb
该DFAM有4个状态{0,1,2,3}。
Σ={a,b}。
S0=0为初始状态。
F=3为终态。
为状态转换函数:
(0,a)=1,(0,b)=2
(1,a)=3,(1,b)=2
(2,a)=1,(2,b)=3
(3,a)=3,(3,b)=3
1、DFAM所识别的符号串
DFAM所识别的符号串ω:
对ω∈Σ*,若存在一条从初始状态结点到终态结点的道路,
在这条路上所有弧线标记符号连接成的符号串恰好是ω,则称ω为DFAM所识别。
上例DFAM所识别的符号串为Σ={a,b}上的含有二个相继a或二个相继b的符号串的集合。
例1:
“aab”是DFAM所能识别的符号串。
3
1
0
aab
不能被DFAM识别的符号串:
被识别的符号串不能从初始状态结点到终态结点,有下列两种情况:
⑴不能到达终态(已识别完)
例2:
“abab”不是该DFAM所能识别的符号串(上例)。
0
1
2
1
2
abab
其中:
2状态不是终态结点。
⑵某一状态射出弧线上标记与所识别的符号不同(多态性)。
例3:
给定DFAM
3
2
1
0
aba
b
“abb”不能被DFAM识别。
2、DFAM所识别的语言L(M)
DFAM所能识别的符号串的集合,称DFAM所识别的语言:
L(M)={(S0,)F,*}
例4:
L(M)={a开头的,a,b符号串}
DFAM=({1,2};{a,b},,1,{2})
1
2
aa,b
3、空字符串的识别
如果DFAM的初始状态又是终态,则空串可被DFAM识别。
例5:
2
1
aa
L(M)={,a,aa,aaa,……..}
1
例6:
a,b
L(M)={,任意的a,b符号串}
五、非确定有限自动机NFAM
1、非确定有限自动机的特性
⑴某一结点射出多条标记相同字符的弧线到达不同的结点。
11
0
aab
bb
(0,a)=0(0,a)=1两个状态(0,a)={0,1}
(0,b)=1
(1,b)=0(1,b)=1两个状态(1,b)={0,1}
⑵某一结点射出标记有ε字符的弧线。
2
1
0
a
εε
2、非确定有限自动机NFAM定义
NFA(M)=(S,Σ,δ,S0,F)
⑴S同上;
⑵Σ同上;
⑶δ是一个从S*到S的子集的映照,即δ:
S*2s;
⑷S0S为一个非空初态集;
⑸FS,为一个终态集(可空)。
3、NFAM与DFAM的区别
⑴NFAM状态转换函数具有多值性;
即δ(S,a)={S1,S2,………Sn}
⑵NFAM可以存在有ε弧;
SiSj
⑶NFAM可以有多个初态(初态集)
六、非确定有限自动机(NFAM)的识别
例M=({1,2。
3,4},{a,b,c}{},,1,{4})
1、映射函数值
(1,)={4},(2,)=,
(3,)=,(4,)=,
(1,a)={2,3},(2,a)={2},
(3,a)=,(4,a)=,
(1,b)=,(2,b)={4},
(3,b)=,(4,b)=,
(1,c)=,(2,c)=,
(3,c)={3,4},(4,c)=
2、构造对应的状态转换矩阵
字符
状态abc
1{4}{2,3}
2{2}{4}
3{3,4}
4
3、构造非确定有限自动机NFAM
a
2
ab
4
1
ac
3
c
4、非确定有限自动机NFAM识别的有效字符串
例1:
字符串“aaab”
a
4
2
ab
1
被识别的语言L(M)={anbn≥1}。
例2:
字符串“accc”
4
1
3
ac
c
被识别的语言L(M)={acnn≥1}。
所以L(M)={}{anbn≥1}{acnn≥1}。
第五节非确定有限自动机(NFAM)的确定化
一、非确定有限自动机(NFAM)确定化的目的
1、取消识别到达的状态结点;
2、合并识别相同字符到达的状态结点。
二、ε-CLOSURE(I)闭包的定义
假设I是NFAM的状态集的一个子集。
1、I的ε(ε-CLOSURE(I))定义:
⑴若SI,则Sε-CLOSURE(I);
⑵若SI,那么从S出发经过任意条弧而能到达的任何状态S都属于ε-CLOSURE(I)。
2、Ia定义:
假定I是NFAM的状态集的一个子集,a是中的一个字符,Ia的定义:
Ia=ε-CLOSURE(J)
其中:
J是所有那些可从ε-CLOSURE(I)中的某一状态出发,经过一条a弧线而到达的状态及由当前状态出发经空弧线连接到达状态的全体。
6
5
例aε
8
3
2
1
ε
εaε
7
4
aε
若I={1},
ε_CLOSURE(I)={1,2}
Ia={5,3,4,6,2,8,7}
若I={5},
ε_CLOSURE(I)={5,6,2}
Ia={3,8}
三、NFAM的确定化
构造一个与NFA(M)等价的DFAM`:
使得L(M)=L(M`)。
1、状态转换矩阵表的形式
若
中有k个元素a,状态转换矩阵形式为:
IIa1Ia2…Iak
CLOSURE(s0)
⑴第一列是DFAM中的初始状态,为NFAM中的初始状态集闭包(_CLOSURE(S0));
⑵用NFAM的初始状态集(空闭包)中的每一个状态,分别构造Ia1,Ia2,…Iak的后继状态子集。
每一个状态子集均为DFAM的一个状态。
⑶对新出现的状态子集置于第一列(作为DFAM的新状态),如同步骤⑵,直至没有出现新的状态子集为止。
2、由NFAM构造DFAM`的具体步骤:
⑴求NFAM的_CLOSURE(I);
⑵求Ix的_CLOSURE(J);(X);
⑶构造DFAM`的转换矩阵;
⑷确定DFAM`的初始状态和终态;
①含有NFAM初始状态的子集为DFAM`的初始状态结点;
②含有NFAM终态的子集为DFAM`的终态结点;
③不包含NFAM初始状态、终态的子集为DFAM`的内部状态结点;
④构造确定化有限自动机DFAM`,使得L(M)=L(M`)。
四、带弧NFA的确定化
例1:
a
2
ab
4
1
3
ac
c
其中:
*={,a,b,c}
S={1,2,3,4}
S0={1}
F={4}
⑴求NFAM的_CLOSURE(I)
I=_CLOSURE
(1)
={1,4}
令S0={1,4}。
⑵求Ix的_CLOSURE(J),(X,X=a,b,c)
Ia=_CLOSURE(J)
=_CLOSURE((1,a)U(4,a))
=_CLOSURE({2,3}U)
={2,3}
令S1={2,3}。
Ib=_CLOSURE(J)
=_CLOSURE((1,b)U(4,b))
=_CLOSURE(U)
=
Ic=_CLOSURE(J)
=_CLOSURE((1,c)U(4,c))
=_CLOSURE(U)
=
同理可求出从S1出发识别某一字符能到达的后继结点。
S1={2,3}
_CLOSURE(S1,a)
=(2,a)U(3,a)={2}
令S2={2