Upload
thane-robbins
View
46
Download
0
Embed Size (px)
DESCRIPTION
词法分析概述 正则表达式 自动机理论 词法分析器的设计与实现. 第二章 词法分析. 词法分析器的功能 词法分析器的地位. 1 词法分析器概述. 1.1 词法分析器的功能. 功能 读源程序的符号序列,逐个拼出 单词 ,并构造相应的 内部表示 ,同时检查源程序中的词法错误。 单词 所谓单词是指语言中具有 独立含义 的最小的语义单位。 Token 单词的内部表示。“程序语言的操作对象(只能)是该语言规定的各种数据。”编译程序是用某种程序语言书写的程序,其操作对象是一般程序中的各种语法单位。. 1.1.1 单词的分类. 1.1.2 Token 的结构. - PowerPoint PPT Presentation
Citation preview
词法分析概述正则表达式自动机理论
词法分析器的设计与实现
词法分析器的功能词法分析器的地位
2
1.1 词法分析器的功能• 功能 读源程序的符号序列,逐个拼出单词,
并构造相应的内部表示,同时检查源程序中的词法错误。
• 单词 所谓单词是指语言中具有独立含义的最小的语义单位。
• Token 单词的内部表示。“程序语言的操作对象(只能)是该语言规定的各种数据。”编译程序是用某种程序语言书写的程序,其操作对象是一般程序中的各种语法单位。
3
1.1.1 单词的分类
4
1.1.2 Token 的结构• Token 是单词在词法分析器中的内部结构• 构成:
• 特殊处理– 常数– 标识符– 特殊符号
5
Type Value
if (position > 10) rate = 3.14 * initial;if (position > 10) rate = 3.14 * initial;
<$if,->,<$open,->,<$id,position>,<$gt, ->,
<$num, 10>,<$close, ->, <$id, rate>,<$eq,->,
<$num, 3.14>,<$mult,->,<$id, initial>, <$semi,->
Line-num
1.2 词法分析器的接口
6
CharList 独 立
词法分析器
独 立
词法分析器 语法分析语法分析TokenList
附 属
词法分析器
附 属
词法分析器语法分析
call
Token
Char List
符号串基本概念正则表达式理论正则表达式在词法分析中的应用
7
2.1 基本概念• 字母表: ∑,元素的非空有穷集合。 • 符号串:由字母表中的符号组成的任何有
穷序列。或者如下定义:1. 空符号串(用 ε 表示)是上的符号串 2. 若 x 是上的符号串 ,a 是的元素 , 则 xa 是
上的符号串 3. y 是上的符号串 , 当且仅当它可以由 1 和 2
导出
8
思考
1. 符号串的长度如何定义?符号的个数
2. ε 和有何区别?符号串有无
3. 如何判断两个符号串相等?对应位置的符号相等(符号串的长度相同)
9
符号串的连接:设 x 和 y 均是字母表∑上的符号串,它们的连接是把 y 的所有符号顺序接在x 的符号之后所得到的符号串。
符号串的方幂:设 x 是字母表∑上的符号串,把 x 自身连接 n 次得到的符号串 z ,称作符号串 x 的 n 次幂,记作 z=xn 。
前缀和后缀:设 x 是字母表上的符号串, x=yz ,则 y 是 x 的前缀, z 是 x 的后缀,特别是当 z≠ 时, y 是 x 的真前缀; y≠ε 时,z 是 x 的真后缀。
子符号串:非空符号串 x ,删去它的前缀和后缀后所得到的符号串称为 x 的子符号串,简称子串。如果删去的前缀和后缀不同时为 ε,则称该子串为真子串。
10
思考1. 符号 x 的零次幂 x0= ?为什么?
空串,“零次连接得到的串”首先是符号串。
2. 符号串 abc 的前缀、真前缀、后缀、真后缀、子串、真子串分别是什么?
{,a,ab,abc} , {,a,ab} , {,c,bc,abc} ,{,c,bc} , {,a,b,c,ab,bc,abc},{,a,b,c,ab,bc}
11
符号串集合:若集合 A 中的所有元素都是某字母表上的符号串,则称 A 为该字母表上的符号串集合。
符号串集合的乘积:设 A 、 B 是两个符号串集合, AB 表示 A 与 B 的乘积,则定义
AB={xy|(x∈A)∧(y∈B)} 符号串集合的方幂:设 A 是符号串集合,则
称 Ai 是符号串集合 A 的方幂,其中 i 是非负整数。A0={}, A1=A, A2=AA, …, An=AA… A
符号串集合的正闭包: A+=A1∪A2∪A3 … 符号串集合的星闭包: A*= A0∪A1∪A2∪A3
…12
思考1. 符号串集合 X 的零次幂 X0=? 为什么?
由符号串集合的幂定义可知,对于 k 为任意正整数 X0 应该满足 X0 ·Xk= Xk· X0 =Xk ,所以……
2. 设 X 为给定的非空符号串集合,下面等式成立吗?
X+=X·X*
·X=X·= {ε}·X= X·{ε}=X
13
思考3. 设 X={a , b} , Y={c , d}
计算 XY , YX , X4 , Xn , X+ 。XY={ac,ad,bc,bd}YX={ca,cb,da,db}X4={a4,a3b,a2ba,aba2,ba3,a2b2,abab,baab,
baba,abba,b2a2,ab3,bab2,b2ab,b3a,b4}Xn={an,an-1b,an-2ba,an-3ba2,…,bn-1a,bn}X+={a,b,a2,ab,ba,b2,a3,a2b,aba,baa,ab2,
bab,b3,a4,…}
14
2.2 正则表达式理论• 描述程序设计语言中单词的一种简单
而且数学化的工具。• 表示符号串的构成模式。• 正则表达式 r 定义了一个符号串集合
S, S 内的每个符号串都与 r 所定义的模式相匹配, S 称为由 r 生成的语言L(r)
15
2.2.1 非形式化定义• 基本正则表达式
,, a• 正则表达式的运算– 选择
x|y– 连接
x·y– 重复
x*
16
思考1. 三种运算是否可以和算数运算类比?
| vs. +; · vs. ×; * vs. n
交换律 A|B=B|AAB≠BA 结合律 (A|B)|C= A|(B|C) A(BC)=(AB)C 分配律 A(B|C)=AB|AC (A|B)C=AC|BC 同一律 A=A=A 幂等律 A**=A*
2. 三种运算的优先级关系如何?| < · < *
17
2.2.2 正则表达式形式化定义• 正则表达式中出现的所有符号构成的集合
为该正则表达式的字母表,用表示。 • 则上的正则表达式递归定义如下:
1. 和是正则表达式;2. 对于任意符号 a ,则 a 是正则表达式;3. 若 r 和 s 是正则表达式,则 r|s , rs , r* 都
是正则表达式;4. 仅由有限次应用上述规则所构成的正则表达式
称为上的正则表达式。
18
2.2.3 正则集• 给定为给定的字母表,则每个上的正则表
达式将定义上的一个符号串集,称为它表示的正则集。用 R 表示上的正则表达式,用L(R) 表示 R 所表示的符号串集合,即函数L表示正则表达式到符号串集的映射。
• 是正则表达式即 R ,则有 L()={} 。
• 是正则表达式即 R ,则有 L()={} 。
19
• a 是正则表达式即 aR ,则 L(a)={a} 。
• A 和 B 是正则表达式,即 AR , BR ,则有
A | BR , L(A | B) = L(A)L(B)
ABR , L( AB ) = L(A)L(B)
A* R , L( A*) = L(A)*
( A )R , L( (A) ) = L(A)
20
当(和)不在Σ 中时
实例 1
• ={ a,b }
21
正则表达式 e
1. ab*
2. a(a|b)*
L(e)
1. 上所有以 a 为首后跟任意多个(包括 0 个) b 的符号串集
2. 上所有以 a 为首的符号串集
实例 2
• 设字母表 ={0 , 1} ,求二进制数字集合且为 2 的倍数。1. 所有上定义的串的正则表达式为( 1|0 ) *
2. 则二进制数表示为 1 ( 1|0 ) *|03. 其中能被二整除的表示为 1 ( 1|0 ) *0|0
22
实例 3
• 设字母表 ={x , y , z} ,1. 出现的第一个 x 之前没有 y 的符号串;2. 包含偶数个 x 的所有符号串。
z*x(x|z)*y ( x|y|z ) *| ( x|z ) *
((y|z)*x(y|z)*x)*(y|z)*
23
思考• 设字母表 ={a , b} ,求
1. 含有奇数个 a 的串的正则表达式2. 有相同个数 a 和 b的串对应的正则表达式。(b*ab*a)*ab*
无法描述“有相同个数 a 和 b”
• 如何用正则表达式描述单词?
24
2.3 正则表达式在词法分析中的应用 • 设 I为字母集合 {a , b,…, z} ,其正
则表达式为 a|b|…|z• 设 D 为数字集合 {0 , 1 ,…, 9} ,其
正则表达式为 0|1|…|9• 则标识符的正则表达式为 I(I|D)*
• 常数的正则表达式为 (+|-|)D+(.D+|)• 特殊符号的正则表达式为……
25
有瑕疵
2.3.1 扩充的正则表达式 • 一次或多次重复 : A+
• 任何符号 :“·”在字母表中任何符号 .• 符号范围 : [0--9] [a--z] [A--Z]• 不在给定范围内的符号 : [^ a]• 可选 : A?
26
2.3.2 单词描述• 保留字 如 begin=begin• 标识符 letter=[a-zA-Z] digit=[0-9] identifier=letter(letter|digit)*
• 数字 整数 Int = [1-9]Digit*|0 实数 real = Int ( .Digit*|ε )
• 特殊符号 +|-|…
27
思考• 正则表达式的描述能力有局限性吗?– 不能表示描述配对或嵌套结构
例:算术表达式的定义1 ) n E 2 )( E) E 3 ) E+E
E– 不能用于描述“ 重复 (对称 )” 结构
例: {w c w | w 是包含符号 a 和 b 的串 } 无法用正则表达式表示(保证两边 w 是相同的)。
28
词法分析简介正则表达式
29