第三章 词法分析

合集下载

第三章词法分析

第三章词法分析

sort
字母 数字 / 界符

RECOGID RECOGDIG HANDLCOM RECOGDEC RECOGSTR
LOOKUP
第三章词法分析
17
一、 手工构造识别单词的DFA m
根椐DFA识别单词的定义,在研究给定程 序语言单词结构的基础上,能直接构造出识 别它的DFA m。例如:对于C语言
整数:非空数字串。
第三章 词法分析
第三章词法分析
编译器的各个阶段:
编译器是分

阶段执行的。 号

每个阶段将

源程序从一

种表示转换
成另一种表

编译的各
个阶段
源程序
词法分析器
语法分析器
错 误

语义分析器


中间代码生成器
代码优化器
代码生成器
第三章词法分析
2
3. 1 词法分析程序的设计:
词法分析器的功能,输出,把它组 织成单独程序
if <12 ,
>
I
<25 , 符号表入口 >
> <39 ,
>
J
<25 ,符号表入口 >
Then <20 ,
>
词I 法=
<25 ,符号表入口 >
<36 ,
>
分0
<26 ,常数表入口 >
析 else <8 ,
>
j <25 ,符号表入口 >
= <36 ,
>
1
<26 ,常数表入口 >
第三章词法分析

编译原理与实现03第3章 词法分析

编译原理与实现03第3章 词法分析

利用状态图识别句子的方法是一种自底向上的分析方法。开始时,处于开 始状态,此时句柄是随后扫描的字符,即输入串的的第一个符号,所要归 约的符号就是从开始状态经过标记有句柄符号的弧到达的下一个状态的名 字。以后每一步(除第一步外)的句柄是当前状态的名字和随后扫描的字 符,而句柄所要归约的符号就是下一个状态的名字。
3.3.2 状态图的用法
例3.2,对句子0110进行的分析。 解:根据上面介绍的状态图使用方法,我们在图3.5(a)列出分析的每一步。 由于这些规则很简单,所以分析也非常简单。首先,在开始状态S下扫描的第 一个符号是0,转到状态V,表示0是句柄,归约到V。接下来,在状态V扫描1, 转到状态Z,此时句柄为V1,归约成Z。再往下扫描1,由状态Z转到状态U,表 示句柄为Z1归约为U。最后,扫描0,转到状态Z,此时句柄为U0,归约为Z, 从而形成图3.5(b)所示的语法树。 步骤 1 2 状态 S V 扫描的字符 0 1 余留部分 110 10
3.3.2 状态图的用法
状态图画好后,就可以利用状态图来分析和识别字符串,其方法如下: 1.首先设置初始状态S为当前状态。从输入串的最左字符开始重复步骤2,直 到到达输入串的右端为止。 2.扫描输入串的下一个字符,在当前状态所射出的弧中,找出标记有该字符 的弧,并沿此弧前进,过渡到下一个状态。如果找不到标记有该字符的弧, 则说明输入串不是合法的句子,分析过程失败结束;如果我们扫描输入串 的最后一个字符,并从当前状态出发沿着标记有该字符的弧到达终结状态, 则表示输入串是该文法的合法句子,识别过程成功结束;如果扫描输入串 的最后一个符号后到达的状态不是状态图的终结状态,则表示输入串不是 该文法的合法句子,识别过程失败结束。
3.3 正则文法及状态图
程序设计语言的单词符号可用3型文法来描述,3型文法也称为正 则文法。对于正则文法所描述的语言可以用一种有穷自动机来识 别。我们的目的是实现词法分析程序,所以为了简化问题,我们 直接介绍这种自动机的非形式表示,即状态图。

编译原理词法分析及词法分析程序

编译原理词法分析及词法分析程序
∴M能识别出L(G)中的全部句子。
状态图=>右线性文法
文法G[0] 0->a1
d 0
S->aA A->dA A->b
a c
1 2
b
d
3
1->d1 1->b
0->c
0->c2 2->d
S->c
S->cB,2有出弧 B->d
左线性文法=>状态转换图
设G=(VN,VT,P,S)是一左线性文法,令|VN|=K, 1) 则所要构造的状态转换图共有K+1个状态. 2) VN中的每个符号分别表示K个状态 2.1) G的开始符S为终止状态 3) 起始状态,用R(VN)标记
识别符号串与归约
S





从初态R到下一状态A对应Ba,即终结 符a归约成非终结符B; U 从状态B转换到状态A对应ABa,即将 Ba归约为A; 状态A转换到状态S(终态)对应S Aa,即 U 将Aa归约为开始符S. 归约成功,恰好进入终态,即状态转换图识 U 别了(或接受)该符号串. 识别00011的例子的归约过程
f是转换函数,是在K×Σ →K上的映像,即:如果f(ki,a)=kj, (ki,kj∈K)意味着,当前状态为ki,输入字符为a时,将转换 为下一个状态kj,我们把kj称作ki的一个后继状态;
1.确定的有限自动机
通常把这五要素组成的五元式M=(K,∑,f, S0,Z)称为确定的 有限自动机(DFA),它是相应的状态转化图的一种形式描 述,或者说,是状态转换矩阵的另一种表示。 在状态转换的每一步,据DFA当前所处状态及扫视的输入 字符,能唯一确定下一状态。

例:文法G=({S,U},{0,1},{SS1 |U1,

第三章词法分析

第三章词法分析

五、词法分析程序的输出形式
单词--是程序语言的基本语法符号。 如:基本字、标识符、常数、运算符、界符等。 词法分析器中单词的输出形式:
(单词类别、单词内部码值)
2019/10/14
中南大学软件学院 陈志刚
11
第三章 词法分析
3.1 词法分析概述
五、词法分析程序的输出形式
词法分析程序输出的单词符号通常用二元式表示: (单词种别,单词自身的值)
5.字的长度:
|α|
6.Σ上字的全体: Σ*
7.字的连接:
字α与字β的连接记为αβ
2019/10/14
中南大学软件学院 陈志刚
30
第三章 词法分析
3.3 正规式与有限自动机
一、基本概念
一个状态转换图只包含有限个状态,有一个初态,
终态用双圈表示。一个状态转换图可识别一定的字
符串。
状态都是非终结符号
例1:
字母或数字
S:开始状态 E:终止状态,用双圈表示 I:标识符状态
S
I
E
字母
数字
2019/10/14
中南大学软件学院 陈志刚
16
一、状态转换图
空白
0
字母
第三章 词法分析
字母或数字
中南大学软件学院 陈志刚
22
第三章 词法分析
四、应用状态转换图识别句子
如果x是相应文法的句子便必须能从开始状态出发, 顺着弧的方向行进到终止状态。其步骤如下: (1)从开始状态开始,以它作为当前状态,并从x 的最左字符开始重复步骤2,直到到达x的右端为止; (2)扫描x的下一字符,在当前状态射出的各个弧 中找出标记有该字符的弧,并沿此弧前进,以达到 的状态作为下一当前状态。

编译原理词法分析

编译原理词法分析

单词起点 搜索指针 一分为二,互补使用。 搜索指针从单词起点开始搜索,如果遇到半区域 的边界,但尚未到达单词的终点时,则可将后续 的输入字符装入该缓冲区的另一半。 必须对标识符和常数单词符号的长度加以限制。
编译原理
单词的构成规则用状态转换图表示
结点表示状态,状态之间用弧线连结,箭头标记读 入的字符或字符类。有限个状态,有一个初态,至 少有一个终态。 一个状态图可用于识别一定的字符串,大多数程序 设计语言的单词符号都可以用转换图来识别。
编译原理
单词符号
是程序设计语言中具有独立意义的最小单位, 程序设计语言基本组成成分。 五类: 关键字(保留字/基本字):if while … 标识符:常量名 变量名 常数:34 56.78 运算符:+ - / < AND… 界限符:, ; ( )…
编译原理
词法分析器的输出:Token串
δ(1,a) = 3 δ(2,a) = 1 δ(3,a) = 3
δ(0,b) = 2
δ(1,b) = 2 δ(2,b) = 3 δ(3,b) = 3
状态转换矩阵:
状态 输入
0 1 2 3*
a 1 3 1 3
b 2 2 3 3
编译原理 状态转换图:假定DFA M含有m个状态,n个输入字符,那么 这个状态图含有m个结点,每个结点最多有n个弧射出,整个 图含有唯一一个初态结点和若干个终态结点,初态结点冠以双 箭头“=>” ,终态结点用双圈表示,若 δ (ki,a) =kj,则从状态 结点ki到状态结点kj画标记为a的弧。
字母、数字
S
字母
标识符 数字
数字
无符号整数 单分界符 头字符 斜竖 错误 = * 双分界符 注释头
+、-、…、; >、<、=、! / 其他

编译原理 词法分析

编译原理  词法分析

lcc的输入处理(续)
\n void fillbuf(void) { if (bsize == 0) return; cp limit if (cp >= limit) cp = &buffer[MAXLINE+1]; else { int n = limit - cp; unsigned char *s = &buffer[MAXLINE+1] - n; assert(s >= buffer); line = (char *)s - ((char *)cp - line); while (cp < limit) *s++ = *cp++; cp = &buffer[MAXLINE+1] - n; }
语言的定义(续)
Alphabet
+,-,…,<,>,…}
Languages
{ All grammatically correct
English sentences }
{A,…,Z,a,…,z,0,…9, { All legal PASCAL progs}
特例:—空语言,{e}—只含空字
语言和单词
forward : = forward + 1 ; if forward = eof then begin if forward 位于第一半区的末端 then begin Block I/O 装载第二个半区 ; forward : = forward + 1 end else if forward 位于第二个半区的末端 then begin 装载第一个半区 ; Block I/O forward 移动到第一个半区的开始 end else / * 缓冲区内部的eof意味着输入的结束 * / 结束词法分析 2nd eof 输入结束 ! end

第3章 词法分析 (编译原理 陈火旺)

第3章 词法分析 (编译原理 陈火旺)

标识符的符号表入口地址作为其单词符号的属性值,常
每个基本字占一个单词种别,单词符号的属性值缺省。
对于界符,运算符通常一个符号一个种别,单词符号的
属性值缺省
例: 参见P42.表3.1 单词符号及种别编码
10
3.1.3 词法分析器作为独立子程序

词法分析可采用如下两种处理结构:
把词法分析程序作为主程序。将词法分析作为
19
3.2.1 正规文法、正规式与正规集

正规集:由正规文法产生的语言所构成的集合。
注:正规集是集合,可有穷也可无穷。 可通过正规式来形式化表示。

对于一个正规文法的语言提炼出一个简洁的公式,用这个
式子来对它进行形式化的表示,这个式子叫正规式。

正规式:也称正则表达式,是说明单词的模式的一种重要的 表示法(记号);是定义正规集的数学工具;用来描述单词 符号。
在设计一个编译程序时,通常是把对源程序的结构分析分为词 法分析和语法分析两个相对独立的阶段来完成。
第一,描述单词的结构比描述源程序的其它语法结构要简单

得多,仅使用3型文法也就基本够用了。
第二,由于把词法分析和语法分析分开,可使编译程序各部

分的功能更为单一,整个编译程序的结构也更加清晰,从而 有利于编译程序的编写和调整。 上述词法分析和语法分析两个阶段的划分,仅仅是对整个编译 程序的逻辑功能而言,而不一定指的是编译程序的执行流程。
25
例3.2 判断下述正规式之间是否等价: (1)b(ab)*与(ba)*b (2)(ab)*与a*b* 解: (1) b(ab)*对应的正规集是b后面出现任意多个ab对
L(b(ab)*)={b,bab,babab, ……}

编译原理 第三章 词法分析

编译原理 第三章 词法分析
5、界符:如逗号、分号、括号、/*,*/ 等。它是确定的。
单词符号的表示形式:词法分析器所输出的单词符号常常表示成
二元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。 2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。 单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表 种的地址码,等等。
例3-3:简单的状态转换图示例:
1
X
2
初态
终态
Y
(a)转换图示例 数字
3
从0状态到1状态 可能出现字母
字母或数字 字母 其他
0
1
2
*
0
数字
1
其他
2 *
(b)识别标识符的转换图
(c)识别整数的转换图
例3-4:识别FORTRAN实型常数的转换图:
例如下列实型常数可 以被以下转换图识别: 1.23E+4
•scanner当作一遍。 •把scanner当作子程序。
scanner
源程序
scanner作为一遍
设计前提:
输入
列表 把scanner作为一个独立的子程序; 输入缓冲区 预处理 • 词法分析器的任务为输出单词符号。 子程序

扫描缓冲区
预 处 理 部 分
•必要性:编辑性字符如空白符、回车符等,除了出现在文字和 扫描器 常数中以外,在别处出现都没有意义。 扫 单词符号 描 •功 能: 剔除无用字符。 器 语法分析器 •实 现: 预处理子程序。 图2.1 词法分析器
例3-2 :下述C++代码段:while ( i >= j ) i - -; 经词法分析器处理以后,它将被转换为如下的单词符号串

编译原理之词法分析

编译原理之词法分析

3.1.3 词法记号的属性
属性值用二元组序列表示
position := initial + rate * 60的记号和属性值: id,指向符号表中position条目的指针 assign _ op, id,指向符号表中initial条目的指针 add_op,+ id,指向符号表中rate条目的指针 mul_ op, * num,整数值60
3.3.4 正规定义
• 正规定义的例子
Pascal语言的标识符集合 letter A | B | … | Z | a | b | … | z digit 0 | 1 | … | 9 id letter(letter|digit)*
3.3.4 正规定义
• 正规定义的例子
Pascal无符号数集合,例1946,11.28,63.6E8,1.999E6 digit 0 | 1 | … | 9 digits digit digit* optional_fraction .digits| optional_exponent (E ( + | | ) digits ) | num digits optional_fraction optional_exponent 简化表示 num digit+ (.digit+)? (E(+|)? digit+)?
• 例
L:{ A, B, …, Z, a, b, …, z },D:{ 0, 1, …, 9 } L∪D,LD,L6,L*,L(L∪D )*,D+
3.3 词法记号的描述
例 令L表示集合{ A, B, …, Z, a, b, …, z },令D表 示集合{ 0, 1, …, 9 }。下面是用表运算作用于L 和D所得到的新语言的例子。

第三章词法分析

第三章词法分析
根据定义比较容易证明上述性质,利用这些性质可以化简正规式,证明 正规式的等价关系
说明:*上的某些集合若不能用正规表达式表示,则该集合不是正规集。 如: ={a,b},L(G)={anbn| n0}就不是正规集,因为它不能用正规式表示。 (可以用上下文无关文法Z∷=aZb|ab|ε产生)可以证明,凡是由正规文 法所产生的语言一定是正规集,即可由正规式表示 。
18
第三章 词 法 分 析
§3.6正规表达式和有穷自动机
一、正规表达式和正规集的定义
1.非形式定义 2.递归定义
二、正规表达式的性质 三、正规文法、正规表达式与有穷自动机的关系 四、由正规表达式构造确定有穷自动机
1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机DFA(子集法) 3.由正规文法构造正规表达式
1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机DFA(子集法) 3.由正规文法构造正规表达式
五、确定有穷自动机的化简
1.等价和可区分的概念 2.确定有穷自动机的化简方法
2
§3.6正规表达式和有穷自动机
为什么引入正规表达式?
由正规文法构造状态转换图,再根据状态转换 图可以构造有穷自动机,往往很麻烦,但是, 对于一些复杂的正规文法,如果将其先转换成 正规表达式,再由正规表达式来产生有穷自动 机就方便得多。而且正规表达式的引入有助于 词法分析程序的自动生成,它还广泛应用于模 式识别和文献目录检索等。
五、确定有穷自动机的化简
1.等价和可区分的概念 2.确定有穷自动机的化简方法
16
第三章 词 法 分 析
§3.6正规表达式和有穷自动机
一、正规表达式和正规集的定义
1.非形式定义 2.递归定义

编译原理第3章. 词法分析

编译原理第3章. 词法分析
2010-12-23
扫描缓冲区的设计: 扫描缓冲区的设计: 两个指针:起点指针,搜索指针 两个指针:起点指针 搜索指针 两个半区: 两个半区:左右半区互补使用


起点指针 搜索指针
7
二.单词符号的识别以及超前搜索
词法分析程序在识别单词时,对有些单词需 要向源程序中多看若干个字符才能被识别,称为 超前搜索。
2010-12-23 3
单词种别码
保留字: ①一字一种:1-begin 2-end 3-if 4-then 保留字: ②全体为一种:0 或者 k 标识符: 标识符: 全体为一种 常数: 常数: ①数据类型:整型、实型、字符型、布尔型 ②全体为一种 运算符: 运算符: ①一符一种 ②全体为一种 界符: ①一符一种 界符: ②全体为一种 返回
6
§3.2 词法分析程序的设计 一.输入、预处理
源程序 输入缓冲区 预处理 子程序 扫描缓冲区
词法分析的预处理程序: 词法分析的预处理程序:从源 程序中处理出一串确定长度的 输入字符, 输入字符,并将其装进词法分 析程序的扫描缓冲区。 析程序的扫描缓冲区。 处理: 处理: 删除注解、空格、回车符、 ①删除注解、空格、回车符、 换行符之类非必要信息。 换行符之类非必要信息。 ②把标识符登录入符号表以及 某些预加工处理等。 某些预加工处理等。
2010-12-23 8
三.状态转换图
状态转换图: 状态转换图: 是由一组矢线连接的有限个结点所组 成的有向图。其作用是识别相应的字符串。 例如: 标识符: I→ l | I l | I d 初态
l
=>①

l/d
非l 非d

终态
例如: <整数>→数字 | <整数>数字

编译原理第三章词法分析

编译原理第三章词法分析
L→ a | b | … | z | A | B | … | Z D → 0 | 1 | … | 9 <标识符> → L(L|D|_)* <无符号正整数> → DD*
z19
step1 : 对语言的各类单词分别构造状态图;
step1
L
1
2
other
*
3 其中: other表示非L| D | _字符
z8
3.2.1 单词与属性字
注意:
(1) 同一个字符开头+后续字符->跨多个单词类;
(2) 非单词成分和预处理成分;
•例:源程序注释;/* …….*/
预处理指令:
•# define… # include…
z9
3.2.1 单词与属性字
2. 属性字 对所识别的单词的数据结构表示。

控制线
数据线
X : 固定长度的存储空间 ; z16
预处理程序(作用)
(1) 减少内存空间占用;
(2) 减轻扫描器实质性处理的负担;
预处理程序主要任务:
(1) 滤掉源程序中的非单词成分(如无用空格;换行
符等);
•滤掉注释;
(2) 实际的预处理工作
•宏替换; •文件包含的嵌入;
L1= ( T,C)
属性字 Token
Code
刻画单词类别(单词性质)
如:标识符;运算符;…
单词的内码值(可空)
z10
说明
单词类别通常用整数编码 单词类别提供给语法分析程序使用 单词符号属性信息记录单词符号的特征或特性 单词的属性值提供给语义分析程序使用
编码形式:
一类一种:关键字、标识符、常数、运算符、界符 一字一种:关键字、运算符、分界符各一码

第三章_词法分析

第三章_词法分析

∑*的子集U和V的连接(积)定义为
UV { | U, V}
V自身的 n次积记为 V n VV V
n
规定V0={},令

V * V 0 V1 V 2 称V*是V的闭包;

记 V VV * V 1 V 2
称V+是V的正规闭包。
3.3.1 正规式与正规集
有限自动机
有限自动机所讨论的问题
确定的有限自动机DFA 不确定的有限自动机NFA NFA的确定化 DFA的最小化
标识符单列一种;标识符自身的值表示成按机器字节划分 的内部码。
常数按类型分种;常数的值则表示成标准的二进制形式。
3.1.1 词法分析器的功能和输出形式
例 FORTRAN程序
IF (5.EQ.M) GOTO 100 输出单词符号: 逻辑IF (34,-) 左括号 (2,-) 整常数 (20, ‘5’的二进制) 等号 (6,-) 标识符 (26, ‘M’) 右括号 (16,-) GOTO (30,-) 标号 (19, ‘100’的二进制)
END;
状态转换图实现示例
'0'..'9':
BEGIN WHILE DIGIT DO BEGIN CONCAT;GETCHAR END; RETRACT; RETURN ($INT,DBT)
END;
'=': RETURN ($ASSIGN,-); '+': RETURN ($PLUS,-);
状态转换图实现示例
4 算符和界符的识别
把多个字符符合而成的算符和界符拼合成一个 单一单词符号。:=, **, .EQ.
3.2.3 状态转换图

【编译原理】第三章词法分析

【编译原理】第三章词法分析

【编译原理】第三章词法分析⼀,词法分析器的作⽤词法分析是编译的第⼀阶段。

词法分析器主要任务是读⼊源程序的输⼊字符、将他们组成词素,⽣成并输出⼀个词法单元序列,每个词法单元对应于⼀个词素。

分析部分:词法分析、语法分析(简化编译器设计、提⾼编译器效率、增强编译器可移植性)1)词法单元:词法单元名和可选的属性值组成。

关键字、操作符……2)模式:词法单元词素可能具有的形式,当词法单元是关键字时,模式就是这个关键字的字符序列3)词素:源程序中的⼀个字符序列,它和某个词法单元模式匹配。

4)词法错误:识别出某个错误词素,继续判断下⼀个词素⼆,输⼊缓冲1)我们⾄少向前看⼀个字符,才能判断当前词素是否到头。

2)对付⼤型源程序,需要处理⼤量字符。

处理往往需要很多时间,我们采⽤两个交替读⼊的缓冲区。

(详见73)三,词法单元的规约1)我们会不会⽤完缓冲区?通常对于⽐较长的字符串我们采⽤ ”+“的形式链接起来。

2)正则表达式:letter_(letter_ | digit) * 表⽰字母开头 0个或多个字母或数字3)正则表达式例⼦a |b {a, b}(a | b) (a | b ) {aa, ab, ba, bb}aa | ab | ba | bb {aa, ab, ba, bb}a* 由字母a构成的所有串集(a | b)* 由a和b构成的所有串集复杂的例⼦( 00 | 11 | ( (01 | 10) (00 | 11) * (01 | 10) ) ) * 010011010000100000101110013)正则表达式扩展1>⼀个或多个实例⼀元后缀算符“+”的意思是“⼀个或多个实例”,即正规式a+表⽰⼀个或多个a的所有串的集合。

算符+和算符*有同样的优先级和结合性。

代数恒等式 r* = r+ | 和r+ = rr*表达了这两个算符之间的关系。

2>零个或⼀个实例⼀元后缀算符?的意思是“零个或⼀个实例”,r?是r | 的缩写。

第三章 词法分析

第三章   词法分析

从正则表达式到DFA 从正则表达式到DFA
正则式 替换 规则 NFA 子集法 DFA 最少化
最简的DFA 最简的
从NFA到DFA (确定化) NFA到 确定化) DFA的化简 最少化) DFA的化简(最少化) 的化简(
从NFA到DFA NFA到
P49~50 : 对任意的NFA M’,可构造等价的DFA M, 对任意的NFA M’,可构造等价的DFA M,即 接受相同串的字。 接受相同串的字。 通过求状态集合的ε 通过求状态集合的ε-闭包和子集法构造实现由 NFA到DFA的转换 NFA到DFA的转换。 的转换。 一个集合I M’的状态集的子集 的状态集的子集) 一个集合I(I是M’的状态集的子集)的εCLOSURE(I): CLOSURE(I): (1)若q∈I,则q ∈ε-CLOSURE(I) (1)若 I,则 (2)若q∈I,则从q出发经任意ε弧 而到达的任何状态 I,则从 出发经任意ε 则从q q ‘∈ε-CLOSURE(I) ‘∈
第三章
词法分析
一、词法分析器的要求 二、词法分析器的设计 三、正规表达式与有限自动机
词法分析
词法分析或扫描阶段可将源程序作为字符文件读 并将其分为若干记号。 入,并将其分为若干记号。 记号类似于单词, 记号类似于单词,表示源程序中信息单元的字符 序列。典型的有关键字、标识符、运算符、 序列。典型的有关键字、标识符、运算符、标点 符号和常量等等。 符号和常量等等。 扫描程序从输入字符的开头识别或匹配某种格 式的字符。 式的字符。 记号的格式说明:正则表达式。 记号的格式说明:正则表达式。 记号的识别方法:有限自动机。 记号的识别方法:有限自动机。 执行词法分析的程序成为词法分析器。
例1:P47 例3.1 例2:令Σ={a,b,c}, Σ上串集合对应 ={a, c}, 的正则表达式: 的正则表达式: 1)仅包含一个b的所有串的集合的正则 仅包含一个b 表达式: 表达式: (a|c)*b(a|c)* 例如, abc、abaca、baaaac、 例如,串b、abc、abaca、baaaac、 ccbaca可与上述正则表达式匹配 ccbaca可与上述正则表达式匹配。 可与上述正则表达式匹配。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

序可以重新声明它的含义
3.1 词法记号及属性 3.1.2 词法记号的属性
position = initial + rate 60的记号和属性值: id,指向符号表中position条目的指针 assign _ op id,指向符号表中initial条目的指针 add_op id,指向符号表中rate条目的指针 mul_ op number,整数值60
( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) )

复杂的例子
句子:01001101000010000010111001
3.2 词法记号的描述与识别

正则式等价:表示同样语言的正则式
3.2 词法记号的描述与识别 3.2.3 正则定义
对正则式命名,使表示简洁
3.2 词法记号的描述与识别 3.2.1 串和语言
字母表:符号的有限集合, 例: = { 0, 1} 串:符号的有穷序列,例:0110,

语言:字母表上的一个串集
{, 0, 00, 000, …}, {},
句子:属于语言的串

串的运算
连接(积) xy,s = s = s


时间复杂度<O(N2)
重点
串和语言 语言的运算 正则表达式 状态转换图

3.2 词法记号的描述与识别

正则式的例子
= {a, b} a | b {a, b} (a | b) (a | b ) {aa, ab, ba, bb} aa | ab | ba | bb {aa, ab, ba, bb} a* 由字母a构成的所有串集 (a | b)* 由a和b构成的所有串集
3.2 词法记号的描述与识别

词法单元 的识别
词素
Any ws if Then else Any id Any number < <= = <> > >=
词法单元名字
if then else id number relop relop relop relop relop relop
属性值
指向符号表条目的指针 指向符号表条目的指针 LT LE EQ NE GT GE
3.2 词法记号的描述与识别

词法单元的识别
stmt if expr then stmt | if expr then stmt else stmt | ε expr term relop term | term term id | number
3.2 词法记号的描述与识别

词法单元的识别
s0为,si为si-1s(i > 0)
3.2 词法记号的描述与识别

语言的运算
并: 连接:
幂:
闭包: 正闭包:

L M = {s | s L 或 s M } LM = {st | s L 且 t M} L0是{},Li是Li-1L L = L0 L1 L2 … L+ = L1 L2 …
3.1 词法记号及属性 3.1.1 词法记号、模式、词法单元
记号名 if for relation id number literal 词法单元例举 if for < , <= , = , … sum, count, D5 3.1, 10, 2.8 E12 “seg. error” 模式的非形式描述 字符i, f 字符f, o, r < 或 <= 或 = 或 … 由字母开头的字母数字串 任何数值常数 引号“和”之间任意不含 引号本身的字符串
3.1 词法记号及属性

历史上词法定义中的一些问题
忽略空格带来的困难
DO 8 I 3. 75 等同于 DO8I 3. 75 DO 8 I 3, 75 关键字不保留 IF THEN THEN THEN=ELSE;ELSE …

关键字、保留字和标准标识符的区别
保留字是语言预先确定了含义的词法单元 标准标识符也是预先确定了含义的标识符,但程

L: { A, B, …, Z, a, b, …, z }, D: { 0, 1, …, 9 } L D, LD, L6, L*, L(L D )*, D+
3.2 词法记号的描述与识别
3.2.2 正则式 正则式用来表示简单的语言,叫做正则集 正则式 定义的语言 备注 { } a { a} a (r) | ( s) L(r)∪L(s) r和s是正则式 (r)(s) L(r)L(s) r和s是正则式 (r)* (L(r))* r是正则式 (r) L(r) r是正则式 ((a) (b)*)| (c)可以写成ab*| c
3.2 词法记号的描述与识别

正则定义的例子
digit 0 | 1 | … | 9 digits digit digit* optional_fraction .digits| optional_exponent ( E ( + | | ) digits ) | numberdigits optional_fraction optional_exponent
3.2 词法记号的描述与识别 3.2.4 转换图 关系算符的转换图
= 1 < other 开始 0 = 5 > = 6 other 8 7 * > 2 3
return(relop, LE) return(relop, NE) * return(relop, LT)
4
return(relop, EQ) return(relop, GE)
stmt if expr then stmt | if expr then stmt else stmt | ε expr term relop term | term term id | number digit digits number letter id if then else relop [0-9] digit+ digits(.digits)?(E[+-]?digits)? [A-Za-z] letter (letter | digit)* if then else < | > | <= | >= | = | <>
return(relop, GT)
3.2 词法记号的描述与识别

标识符和关键字的转换图
letter或digit
开始
9
letter
10
other
*
11
return(install_id())
3.2 词法记号的描述与识别

无符号数的转换图
number digit+ (.digit+)? (E (+ | )? digit+)?
3.2 词法记号的描述与识别

合成整体转换
12 20

作业
字符串匹配。给你两个字符串,寻找其中 一个字符串是否包含另一个字符串,如果 包含,返回包含的起始位置。 如下面两个字符串:

char *str = "bacbababadababacambabacaddababacasdsd"; char *ptr = "ababaca";
第三章 词法分析
第三章 词法分析
记号(token)
源程序
词法分析器 取下一个记号
语法分析器
符号表
本章内容
词法分析器:把构成源程序的字符流翻译成
记号流,还完成和用户接口的一些任务 围绕词法分析器的自动生成展开 介绍正则式、状态转换图和有限自动机概念
词法分析初步:正则表达式,状态转换图
3.1~3.4
无符号数集合,例1946,11.28,63E8,1.99E6
简化表示
number digit+ (.digit+)? (E(+|)? digit+)?
3.2 词法记号的描述与识别

正则定义的例子(进行下一步讨论的例子)
while while do do relop < | < = | = | < > | > | > = letter A | B | … | Z | a | b | … | z id letter (letter | digit )* number digit+ (.digit+)? (E (+ | )? digit+)? delim blank | tab | newline ws delim+
E
digit digit digit . digit E +/ digit
开始
12
digit
digit
13
14
15
other
16
17
other
18
other
*
19 return( installNum( ) )
3.2 词法记号的描述与识别

空白的转换图
delim blank | tab | newline ws delim+ delim 开始 20 delim 21 other 22 *
d1 r1 d2 r2 ... dn rn
各个di的名字都不同 每个ri都是 {d1, d2, …, di-1 }上的正则式
3.2 词法记号的描述与识别

正则定义的例子
C语言的标识符是字母、数字和下划线组成的串
letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_(letter_ |digit)*
相关文档
最新文档