第三章 词法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
词法规则简单,容易被理解; 从它容易构造高效识别程序; 可由正则表达式构造词法分析程序; 可用于其他各种信息流的处理。
9
1、正则表达式的定义
设为字母表,则的正则表达式按照下列规则递归 地定义: (1) 都是上的正规式,表示为L()={}; (2)是上的正规式,表示为L()={}; (3) 对于任何a ,a是上的一个正规式,表示为L(a)={a} ; (4) (递归定义)若r和s都是上的正规式,则
令I={1},求ε-closure(I)=?
a
(2,) (29,) (10,’a’) (23,)
(11,’1’的二进制)
(30,) (10,’b’) (17,) (11,’10’的二进制) (26,)
常数1
右括号) 标识符b 赋值号= 常数10 分号;
6
3、单词的识别
在词法分析中,可以 用状态转换图来识别 单词。 状态转换图是有限的有 向图,结点表示状 态,用圆圈表示;结 点之间可以用有向边 连接,有向边上可标 记字符。
36
第四节 由正则式构造有穷自动机
A为有穷状态自动机,e为正则表达式,则存 在 L(A)=|e|,即正则表达式与有穷自动机 之间具有等价性。
任何两个有穷自动机M和M’,若它们识别的语 言相同(L(M)=L(M’)),则称M和M’等价。
37
一、由正则表达式构造等价的NFA M
2、对正则式采用如下规则构造对应的NFA M。 1、由正则表达式R表示成如图所示的拓广转换图。 3、逐步运用上述3个规则不断在1、图中增加新 结点进行分解,直到每条有向边上仅标识有Σ 中 R 的一个字母或ε 为止,则NFA M构造完成。 r1 X Y ε ε Sj Sk Si r1|r2 r1r2 r* r1 r2 Sj Sj Sk Si Si Sj Si r r2
例如
x 0 y 2 1
7
词法分析程序的设计
对于状态图中每一个状态构造一段代码,代码功 能为: (1)从输入串中读入一个字符; (2)判明读入的字符与由此状态出发的哪条弧 上的标记相匹配,则转至相匹配的那条弧所指 向的状态。 (3)均不匹配时便失败。
8
第二节 正则表达式
正则表达式是一种适合描述符号的表示法,可 由它定义正规集。 正规集即为正规式所描述的串的集合。一般用 L()表示。 采用正则表达式的原因:
34
a S
b
A
a b
a a Z
a
B a
b
对于输入字符串babbabb,运行该NFA
步骤 当前状态 1 S 输入的其余部分 可能的后继 选择 babbabb B B
2
3
B
A
abbabb
bbabb
A,B
B
A
B
4 5 6 7
B Z A B
babb abb bb b
Z A,Z B Z
Z A B Z
35
பைடு நூலகம்
练习:某操作系统下合法的文件名为 device:name.extention 其中第一部分(device:)和第三部分 (.extention)可缺省,若device、 name和extention都是字母串,长度不 限,但至少为1,画出识别这种文件名 的DFA。
第三章 词法分析
词法分析概述 正则表达式与有穷状态自动机 词法分析程序的实现 词法分析程序的自动生成
1
第一节 词法分析程序
词法分析是编译过程中的第一个阶段,其任务 是:从左到右逐个字符地对源程序进行扫描, 产生一个个单词符号。
源程序 (字符串形式) 中间程序 (单词符号串形式)
问题:1、什么是单词符号? 2、单词符号该如何表示? 3、如何识别出单词?
14
3、正则表达式的等价
如果正则表达式r与s表示的正则集相同,即值相 等,则称它们是等价的。记为 r=s 例:b{ab}={ba}b {a|b}={{a}{b}}
15
例:判断下述正规式之间是否等价。 1)(a|b)* 与 a*|b* 2)(ab)* 与 a*b* 3)(a|b)* 与 (a*b*)*
38
举例
对给定正规式b*(d|ad)(b|ab)+, 构造其NFA M。
b ε ε a d a b d b
b ε
a
ε
b
39
为了使得NFA确定化,我们首先给出两个定义:
定义1:集合I的ε-闭包:
令I是一个状态集的子集,定义ε-closure(I)为: 1)若s∈I,则s∈ε-closure(I); 2)若s∈I,则从s出发经过任意条ε弧能够到达的 任何状态都属于ε-closure(I)。 状态集ε-closure(I)称为I的ε-闭包 例:如图所示的状态图:
(r)是上的正规式,表示集合L( ( r ) )=L( r ) ;
rs是上的正规式,表示集合L( r|s )=L( r ) ∪L( s ); rs是上的正规式,表示集合L( rs )=L( r ) L( s );
r*是上的正规式,表示集合L(r* )=(L( r ) )*。
10
例: 令={a,b}, 上的正规式和相应 的正规集的例子有:
32
DFA与NFA的区别
DFA 唯一 单个状态 NFA 一个或多个 状态集合
开始状态 映像
33
举例
与右图所示对应的有一个NFA , N=({S,A,B,Z},{a,b},M,{S}, {Z}) 其中M: M(S,a)={A} M(S,b)={B}
M(A,a)={Z} M(A,b)={B} M(B,a)={A,B} M(B,b)={Z} M(Z,a)={A,Z}
25
2、确定的有穷状态自动机
一个确定的有穷自动机(DFA)D是一个五元组 D=(K,Σ,M,S,F),其中 K:有穷非空的状态集合; Σ:有穷非空的输入符号字母表; M:转换函数,是在K×Σ→K上的映像,即,如M(ki,a) =kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a 时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态; S: S∈K是唯一的一个初态; F: F K是非空的终态集合。
2
1、单词符号
单词符号是程序语言的基本语法单位,一般分为下面5种: 关键字(基本字):(个数确定,可全体编为一类,也 可一字一类) 标识符:(个数不确定,作为一类) 常数:各种类型的常数 。(个数不确定,按类型分类) 运算符:如+、-、*、/、<等。(个数确定,一符一类) 界符:如,、;、(、)、: 等。(个数确定,一符一类) 注意:一种语言的单词如何分类、怎样编码,主要取决于 技术上的方便。
* return(relop, LT)
4 return(relop, EQ)
= other 7 *
return(relop, GE)
8
return(relop, GT)
23
例3:标识符识别的状态转换图。
letter或digit 开始
1
letter
2
other
3
return(id)
24
思考:
无符号浮点数的状态转换图。
3
2、单词的表示形式
词法分析程序输出的单词符号通常用二元式表示: (单词种别,单词自身的值) 单词种别:表示单词种类,常用整数编码,它是语 法分析需要的 单词自身的值:是编译中其他阶段所需要的信息
如果一个种别只含一个单词符号,那么该单词符号的种 别编码就完全代表它自身的值。 如果一个种别含有多个单词符号,那么还应给出该单词 符号的自身值:标识符自身值是标识符自身的字符串; 常数自身值是常数的二进制数值。
21
状态转换图举例
例1:字符串必须以空格开始和结束,中间 可以有0个或任意多个由a~z组成的字符 串。
a~z
1 ““ 2 ““ 3
22
例2:Pascal语言中关系运算符识别的状态转换图。 = 2 > other > 5 6 3 return(relop, LE)
1
< 开始 0 =
return(relop, NE)
19
序
有穷自动机是依据某些输入而改变状态的 机器或程序。可以用状态转换图来表示。 有穷自动机是有向图这种通用结构的一个 实例,在动态数据结构和高级搜索方面有 许多应用。
20
1、状态转换图
有向图,结点表示状态,用圆圈表示; 结点之间可以用有向边连接,有向边上 标记影响状态改变的可能输入的字符;
17
举例
1、在字母表Σ ={a,b,c}中,考虑仅包括一个b的 所有串的集合。 2、给出字母表Σ ={a,b,c}上的一个正则表达式, ((b|c)*a(b|c)*a)*(b|c)* 简要描述它所生成的语言。 3、试为Pascal语言的注释部分编写正则表达式。
18
第三节 有穷状态自动机(FA)
状态转换图 确定有穷状态自动机(DFA) 非确定有穷状态自动机(NFA) 把NFA变为DFA DFA的化简
b
2
b
31
非确定有穷状态自动机
一个非确定的有穷自动机(NFA)D是一个 五元组:N=(K,Σ,M,S,F)其中 K:有穷非空的状态集合; Σ:有穷非空的输入字母表; M:转换函数,是在K×Σ到K的子集所组成 集合的映像, M(R, T)={Q1,Q2,….Qn} S: SK是非空的初态集合; F: FK是非空的终态集合.
4
单词符号 begin if then while do end identifier digit +
……
种 别 1 2 3 4 5 6 10 11 13
5
它所输出的单词符号是:
基本字if 左括号( 标识符a 大于号>
例如:程序段 if(a>1) b=10; 假定基本字、运 算符、界符都是 一符一种。
正规式 a ab ab (ab)(ab) a 正规集 {a} {a,b} {ab} {aa,ab,ba,bb} { ,a,a, ……任意个a的串}
11
(ab) 表示正规集 { ,a,b,aa,ab …… 所有由a和b组成的串} (ab) (aabb)(ab) 表示正规集{上所有含有两个相继的a或两个 相继的b组成的串}
12
例:若={a,b}, 则字符串集合 S={anban|n≠0}可以用正规式描述吗?
13
2、程序设计语言中的正规式实例
令Σ ={letter,digit},则Σ 上的正规式 r=letter(letter|digit)* 可以用来表示标识符。 令Σ ={d,.,e,+,-},则Σ 上的正规式 r=d*(.dd*|ε )(e(+|-|ε )dd*|ε ) 可以用来表示无符号浮点数。其中d表 示digit, 即0-9数字。
29
转换矩阵
a 0 1 2 3 1 3 1 3 b 2 2 3 3
状态转换图 a 0 b 1 a a 3 a
b
2
b
b
易存储
30
从状态转换图看,从初态出发,沿任一条 路径到达接受状态,这条路径上的弧上的标
记符号连接起来构成的符号串被接受(识别)。
DFA M所能识别的字的全体即L(M)。 字集V是正规的 if V=L(M) a 0 b 1 a a 3 b a
答:1)、2)不等价,3)等价
16
4、正则表达式的性质
设e、e1、e2、e3均为正则表达式,则 e|= |e=e e= e= (零正则表达式) e=e=e (单位正则表达式) e1|e2=e2|e1 (交换律) e1|(e2|e3)= (e1|e2)|e3 e1(e2e3)=(e1e2)e3 (结合律) e1(e2|e3)= e1e2|e1e3 (e1|e2)e3= e1e3|e2e3 (分配律)
26
从状态转换图构造DFA
例1:从下面状态图构造DFA。
DFA D=({S,Z,A,B},{a, a b},M,S,{Z}), A a 其中M定义为: M(S,a)=A S a b Z M(S,b)=B b b M(A,a)=Z B M(A,b)=B M(B,a)=A M(B,b)=Z M(Z,a)=Z
a
27
从正则表达式构造有穷自动机
例2:构造一个识别语言(a|b)*ab 的有穷自动 a 机。 开始 0 a 1 状 态 b 2 输 入 符 号
b
a
{0, 1}
b
{0} {2}
28
0 1 2
例 设DFA M=({0,1,2, 3}, {a,b} ,f, 0,{3}) 其中 f(0,a)=1,f(1,a)=3 f(2,a)=1,f(3,a)=3 f(0,b)=2,f(1,b)=2 f(2,b)=3,f(3,b)=3