29
词词词词词词 词词词词词 词词词词词 词词词词词词词词词词词

第二章 词法分析

Embed Size (px)

DESCRIPTION

词法分析概述 正则表达式 自动机理论 词法分析器的设计与实现. 第二章 词法分析. 词法分析器的功能 词法分析器的地位. 1 词法分析器概述. 1.1 词法分析器的功能. 功能 读源程序的符号序列,逐个拼出 单词 ,并构造相应的 内部表示 ,同时检查源程序中的词法错误。 单词 所谓单词是指语言中具有 独立含义 的最小的语义单位。 Token 单词的内部表示。“程序语言的操作对象(只能)是该语言规定的各种数据。”编译程序是用某种程序语言书写的程序,其操作对象是一般程序中的各种语法单位。. 1.1.1 单词的分类. 1.1.2 Token 的结构. - PowerPoint PPT Presentation

Citation preview

Page 1: 第二章 词法分析

词法分析概述正则表达式自动机理论

词法分析器的设计与实现

Page 2: 第二章 词法分析

词法分析器的功能词法分析器的地位

2

Page 3: 第二章 词法分析

1.1 词法分析器的功能• 功能 读源程序的符号序列,逐个拼出单词,

并构造相应的内部表示,同时检查源程序中的词法错误。

• 单词 所谓单词是指语言中具有独立含义的最小的语义单位。

• Token 单词的内部表示。“程序语言的操作对象(只能)是该语言规定的各种数据。”编译程序是用某种程序语言书写的程序,其操作对象是一般程序中的各种语法单位。

3

Page 4: 第二章 词法分析

1.1.1 单词的分类

4

Page 5: 第二章 词法分析

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

Page 6: 第二章 词法分析

1.2 词法分析器的接口

6

CharList 独 立

词法分析器

独 立

词法分析器 语法分析语法分析TokenList

附 属

词法分析器

附 属

词法分析器语法分析

call

Token

Char List

Page 7: 第二章 词法分析

符号串基本概念正则表达式理论正则表达式在词法分析中的应用

7

Page 8: 第二章 词法分析

2.1 基本概念• 字母表: ∑,元素的非空有穷集合。 • 符号串:由字母表中的符号组成的任何有

穷序列。或者如下定义:1. 空符号串(用 ε 表示)是上的符号串 2. 若 x 是上的符号串 ,a 是的元素 , 则 xa 是

上的符号串 3. y 是上的符号串 , 当且仅当它可以由 1 和 2

导出

8

Page 9: 第二章 词法分析

思考

1. 符号串的长度如何定义?符号的个数

2. ε 和有何区别?符号串有无

3. 如何判断两个符号串相等?对应位置的符号相等(符号串的长度相同)

9

Page 10: 第二章 词法分析

符号串的连接:设 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

Page 11: 第二章 词法分析

思考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

Page 12: 第二章 词法分析

符号串集合:若集合 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

Page 13: 第二章 词法分析

思考1. 符号串集合 X 的零次幂 X0=? 为什么?

由符号串集合的幂定义可知,对于 k 为任意正整数 X0 应该满足 X0 ·Xk= Xk· X0 =Xk ,所以……

2. 设 X 为给定的非空符号串集合,下面等式成立吗?

X+=X·X*

·X=X·= {ε}·X= X·{ε}=X

13

Page 14: 第二章 词法分析

思考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

Page 15: 第二章 词法分析

2.2 正则表达式理论• 描述程序设计语言中单词的一种简单

而且数学化的工具。• 表示符号串的构成模式。• 正则表达式 r 定义了一个符号串集合

S, S 内的每个符号串都与 r 所定义的模式相匹配, S 称为由 r 生成的语言L(r)

15

Page 16: 第二章 词法分析

2.2.1 非形式化定义• 基本正则表达式

,, a• 正则表达式的运算– 选择

x|y– 连接

x·y– 重复

x*

16

Page 17: 第二章 词法分析

思考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

Page 18: 第二章 词法分析

2.2.2 正则表达式形式化定义• 正则表达式中出现的所有符号构成的集合

为该正则表达式的字母表,用表示。 • 则上的正则表达式递归定义如下:

1. 和是正则表达式;2. 对于任意符号 a ,则 a 是正则表达式;3. 若 r 和 s 是正则表达式,则 r|s , rs , r* 都

是正则表达式;4. 仅由有限次应用上述规则所构成的正则表达式

称为上的正则表达式。

18

Page 19: 第二章 词法分析

2.2.3 正则集• 给定为给定的字母表,则每个上的正则表

达式将定义上的一个符号串集,称为它表示的正则集。用 R 表示上的正则表达式,用L(R) 表示 R 所表示的符号串集合,即函数L表示正则表达式到符号串集的映射。

• 是正则表达式即 R ,则有 L()={} 。

• 是正则表达式即 R ,则有 L()={} 。

19

Page 20: 第二章 词法分析

• 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

当(和)不在Σ 中时

Page 21: 第二章 词法分析

实例 1

• ={ a,b }

21

正则表达式 e

1. ab*

2. a(a|b)*

L(e)

1. 上所有以 a 为首后跟任意多个(包括 0 个) b 的符号串集

2. 上所有以 a 为首的符号串集

Page 22: 第二章 词法分析

实例 2

• 设字母表 ={0 , 1} ,求二进制数字集合且为 2 的倍数。1. 所有上定义的串的正则表达式为( 1|0 ) *

2. 则二进制数表示为 1 ( 1|0 ) *|03. 其中能被二整除的表示为 1 ( 1|0 ) *0|0

22

Page 23: 第二章 词法分析

实例 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

Page 24: 第二章 词法分析

思考• 设字母表 ={a , b} ,求

1. 含有奇数个 a 的串的正则表达式2. 有相同个数 a 和 b的串对应的正则表达式。(b*ab*a)*ab*

无法描述“有相同个数 a 和 b”

• 如何用正则表达式描述单词?

24

Page 25: 第二章 词法分析

2.3 正则表达式在词法分析中的应用 • 设 I为字母集合 {a , b,…, z} ,其正

则表达式为 a|b|…|z• 设 D 为数字集合 {0 , 1 ,…, 9} ,其

正则表达式为 0|1|…|9• 则标识符的正则表达式为 I(I|D)*

• 常数的正则表达式为 (+|-|)D+(.D+|)• 特殊符号的正则表达式为……

25

有瑕疵

Page 26: 第二章 词法分析

2.3.1 扩充的正则表达式 • 一次或多次重复 : A+

• 任何符号 :“·”在字母表中任何符号 .• 符号范围 : [0--9] [a--z] [A--Z]• 不在给定范围内的符号 : [^ a]• 可选 : A?

26

Page 27: 第二章 词法分析

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

Page 28: 第二章 词法分析

思考• 正则表达式的描述能力有局限性吗?– 不能表示描述配对或嵌套结构

例:算术表达式的定义1 ) n E 2 )( E) E 3 ) E+E

E– 不能用于描述“ 重复 (对称 )” 结构

例: {w c w | w 是包含符号 a 和 b 的串 } 无法用正则表达式表示(保证两边 w 是相同的)。

28

Page 29: 第二章 词法分析

词法分析简介正则表达式

29