编译原理chapter2词法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标识符、某个特定的关键字。id, 1 = id, 2 + id, 3 60
• 模式。一个记号的模式描述属于该记号的词法单元的形式。在一个关 if for else
键字作为一个记号的情况下,它的模式就是构成该关键字的字符序列 。对于标识符和其他一些记号,它们的模式有更复杂的结构并且有很 多字符串可以匹配它们。 • 词法单元。词法单元(lexeme),又称单词,是源程序中匹配一个记 号模式的字符序列,它由词法分析器识别为该记号的一个实例。
简化表示
letter_ [A - Z a - z _] digit 0 | 1 | … | 9 id letter_(letter_ |digit)*
[0-9]
2.2.4 状态转换图
进一步考虑如何构造词法分析器
【例2.6】某语言while语句中可能出现的部分记号描述。 while while ==
delim blank | tab | newline ws delim+
正规式、记号名和属性
空白时词法分析器不返回记号给分析器
ws
__
__
while
while
__
do
do
__
id
id
符号表条目的指针
number
number
数表条目的指针
relop
relop
LT、LE、EQ、NE、GT或GE < < <> > >
{aa, ab, ba, bb}
• aa | ab | ba | bb • a* • (a | b)*
{aa, ab, ba, bb} 由字母a构成的所有串集,包括空串 由a和b构成的所有串集,包括空串
正规式的代数规律
r|s=s|r r | ( s | t )= ( r | s ) | t ( rs ) t = r ( st ) r ( s | t )= rs | rt ;( s | t )r = sr | tr
形式化描述
2.2.1 串和语言
✓字母表:符号的有限集合, 例: = { 0, 1}
✓串:符号的有穷序列,例:0,1,11,10010,0110,
串s的长度是出现在s中符号的个数,写做|s|
✓语言:字母表上的一个串集,例: {, 0, 00, 000, …}, {}, ,{1,10, 11, 100,101, …}
r* = r+ | r+ = rr* • 零个或一个实例。一元后缀“?”的意思是“零个或一个实例”。
r? = r | • 字符组。[ abc ](其中a、b、c是字母表的符号)表示正规式
a | b | c。缩写字符组[ a-z ]表示正规式a | b | ... | z
letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_(letter_ |digit)*
约定: (1)闭包运算(算符*)有最高的优先级并且是左结合的运算, (2)连接运算(两个正规式并列)的优先级次之且也是左结合的运算, (3)选择运算(算符|)的优先级最低且仍然是左结合的运算。
【例2.3】 令字母表 = {a, b},那么
正规式
语言
•a|b
{a, b}
• (a | b) (a | b )
正规定义的名字:黑体字
【例2.5】无符号数(整数和浮点数)集合,例1946 ,
11.28 , 63.6E8 , 1.999E-6,下面是这个串集合的正规定

整数部分 小数部分 指数部分
digit 0 | 1 | … | 9 digits digit digit*
optional_fraction .digits|
的记号和属性值:
id,指向符号表中position条目的指针 assign_op id,指向符号表中initial条目的指针 add_op id,指向符号表中rate条目的指针 mul_ op number,整数值60
2.1.3 词法错误
• 词法分析器对源程序采取非常局部的观点
• 例:难以发现下面的错误
不便于计算机处理
语言的运算 并: 连接: 幂: 闭包: 正闭包:
L M = {s | s L 或 s M } LM = {st | s L 且 t M} L0是{},Li是Li-1L L = L0 L1 L2 … L+ = L1 L2 …
2.2.2 正规式
✓正规式(又称正规表达式、正则表达式)是按照一组定义规则,由较简单的正规 式构成的,每个正规式r表示一个语言L(r)。这些定义规则说明L(r)如何从r的子正 规式所表示的语言中构造出来。
标识符 age
记号名 if for
relation id
number literal
词法记号、模式、词法单元
记号的例子
词法单元(单词)列举
模式的非形式描述
if for < , <= , = , … sum, count, D5
字符i, f 字符f, o, r < 或 <= 或 = 或 … 由字母开头的字母数字串
C
fi (a == f (x) ) … • 在实数是“数字串.数字串”格式下,可以发现下面的错误
123.x
• 紧急方式的错误恢复
删掉当前若干个字符,直至能读出正确的记号
• 错误修补 不常用
进行增、删、替换和交换字符的尝试
2.2 词法记号的描述与识别
• 字符串集合由称为模式的规则来描述。 • 正规式是表示这些规则的一种重要方法。
【例2.2】 L: { A, B, …, Z, a, b, …, z }, D: { 0, 1, …, 9 }
L D是字母和数字的集合 LD是所有由一个字母后跟随一个数字组成的串的集合 L6是所有由6个字母组成的串的集合 L*是所有字母串(包括)的集合 L(L D )*是以字母开头的所有字母数字串的集合 D+ 是不含空串的数字串的集合
句子或字:属于语言的串
集合
字母表
字符
组合

集合
语言
串的运算 连接(积) 幂
语言的运算 并: 连接: 幂: 闭包: 正闭包:
xy,s = s = s s0为,si为si-1s(i > 0)
L M = {s | s L 或 s M } LM = {st | s L 且 t M} L0是{},Li是Li-1L L = L0 L1 L2 … L+ = L1 L2 …
r = r; r =r r* = ( r | )*
r** = r*
| (选择)是可交换的 | (选择)是可结合的 连接是可结合的
连接对|是可分配的
是连接的恒等元素 肯定出现在一个闭包中
*是幂等的
任意多次执行所产生的影响 与一次执行产生的影响相同
2.2.3 正规定义
• 对正规式命名(起名字),使表示简洁 如果是基本符号的字母表,那么正则定义是形式为
do do relop < | < = | = | < > | > | > = letter A | B | … | Z | a | b | … | z digit 0 | 1 | … | 9 id letter (letter | digit )* number digit+ (.digit+)? (E (+ | )? digit+)?
18
1946 11.28 63.6E8 1.999E-6
other
other
other
*
19
return( installNum( ) )
填入并返回数值的记号
无符号数的转换图
• 空白的转换图
delim blank | tab | newline ws delim+
delim
开始
delim
other
2.1 词法记号及属性
• 词法分析是编译的第一阶段,它的主要任务是扫描输入字符流,产生 词法分析的词法记号序列。
源程序
子程序
词法分析器
记号(token) 取下一个记号
主程序
语法分析器
符号表
词法分析器和语法分析器的相互作用
2.1.1 词法记号、模式、词法单元
• 词法记号。词法记号(简称记号)是由记号名和属性值构成的二元组 ,属性值不是必须项。记号名是代表一类词法单元的抽象名字,例如
起名字 正规式
d1 r1 d2 r2 ...
dn rn 的定义序列,各个di的名字都不同,每个ri都是 {d1, d2, …, di-1 } 上的正规式。
【例2.4】C语言的标识符是字母、数字和下划线组成的串, 下面是C语言的标识符的正规定义。
letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_(letter_ |digit)*
*
20
21
22
ws的转换图
2.3 有限自动机
对状态转换图进行严格定义——有限自动机
• 语言的识别器是一个程序,它取x作为输入,当x是语言的句子时,它回答
9
letter
10
other
*
11 return(installId( ))
简略了
【例2.8】 number digit+ (.digit+)? (E (+ | )? digit+)?
E
digit
digit
digit digit
开始
12
digit
13
.
digit
14
15
E
+/ digit
16
17
optional_exponent ( E ( + | | ) digits ) |
numberdigits optional_exponent
optional_fraction
简化表示:number digit+ (.digit+)? (E(+|)? digit+)?
简化表示 • 一个或多个实例。一元后缀“+”的意思是“一个或多个实例”。
✓下面是定义字母表Σ上正规式的规则,和每条规则相联系的是被定义的正规式所表 示的语言描述。
(1)ε是正规式,它表示{ε}。 (2)如果a是Σ上的符号,那么a可以作为正规式,它表示语言{a}。 (3)假设r和s都是正规式,它们分别表示语言语言L(r)和语言L(s),那么( r )|( s )、( r )( s ) 、( r )*和( r )都是正规式,分别表示语言L(r) L(s) 、L(r) L(s)、(L(r))*和 L(r) 。
• 绘制状态转换图(简称转换图)是构造词法分析器的第一 步。状态转换图描绘词法分析器被语法分析器调用时,词 法分析器为下一个记号所做的动作。
关系算符的转换图
=
2 return(relop, LE)
1
>
3 return(relop, NE)
<
开始 0
=
other来自百度文库
4 * return(relop, LT)
IF THEN THEN THEN=ELSE;ELSE …
• 关键字、保留字和标准标识符的区别
• 保留字是语言预先确定了含义的词法单元
• 标准标识符也是预先确定了含义的标识符,但程序可以重新声明它的 含义
2.1.2 词法记号的属性
【例2.1】 语句 position = initial + rate 60
5 return(relop, EQ)
>
=
7 return(relop, GE)
6
other 8 * return(relop, GT)
状态 边 输入字符 初始状态 接受状态 动作 指针回退
【例2.7】
标识符和关键字的转换图
letter或digit
查询:返回关键字记号
或返回(填入)标识符的记号
开始
正规式表示的语言叫做正规语言或正规集
正规式
定义的语言
{}
a
{a}
(r) | (s) 选择 (r)(s) 连接 (r)* 闭包 (r)
L(r)∪L(s)

先 级
L(r)L(s)
升 高
(L(r))*
L(r)
((a) (b)*)| (c)可以写成ab*| c
备注
a r和s是正规式 r和s是正规式 r是正规式 r是正规式
3.1, 10, 2.8 E12 “seg. error”
任何数值常数
引号“和”之间任意不含 引号本身的字符串
• 历史上词法定义中的一些问题
• 忽略空格带来的困难
Fortran
DO 8 I 3. 75 等同于 DO8I 3. 75
DO 8 I 3, 75
循环,8语句标号循环体结束
• 关键字不保留
R 第2章 词法分析
• 词法分析器的任务是把构成源程序的字符流翻译成词法记号流。 • 构造词法分析器的一种简单办法是用状态转换图来描述元词法记号的
结构,然后手工把这种状态转换图翻译成为识别词法记号的程序。
本章内容
✓ 词法分析器:把构成源程序的字符流翻译成记号流,还可以完成 和用户接口的一些任务
✓ 围绕词法分析器的生成展开 ✓ 介绍正规式、状态转换图和有限自动机概念
相关文档
最新文档