编译原理之词法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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所得到的新语言的例子。
正规式(又称正规表达式)是按照一 组定义规则,由较简单的正规式构成 的,每个正规式r表示一个语言L(r) 。定义规则告诉我们L(r)是怎样以各 种方式从r的子正规式所表示的语言 组合而成的。
正规式用来表示简单的语言,叫做正规集
3.3.3 正规式
定义字母表上正规式的规则,和每条规则相联 的是被定义的正规式所表示的语言的描述。 (1)是正规式,它表示{ }; (2)如果a是上符号,那么a是正规式,它表 示{a}。虽然都用同样的符号表示,但正规式a 是不同于串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)。正规式表示的语言叫做正规集。
3.3.3 正规式
如果我们约定: (1)闭包运算(算符是*)有最高的优先级, 并且是左结合的运算; (2)连接运算(两个正规表达式并列)的优先级 次之,也是左结合的运算; (3)或运算(算符是|)的优先级最低,仍然 是左结合的运算, 那么可以避免正规式中一些不必要的括号。例 如,((a) (b)*)|(c)等价于ab*| c。
• 3.1 词法分析器的角色词法分析器的结构 图如图3。1所示。
源程序串
预处理 子程冲区 扫描器
单词符号
3.1.2 词法记号、模式、词法单元
在谈论词法分析时,我们使用术语“词法记号” (简称记号)、“模式”和“词法单元”表示 特定的含义 在输入的字符流中有很多字符串,它们的记号是 一样的。这样的字符串集合由叫做模式的规则 来描述,模式匹配对应集合的任一字符串。模 式的形式描述我们在下一节讨论。词法单元( lexeme),又称单词词素,是源程序的字符串, 它由模式匹配为记号。
3.3 词法记号的描述
3.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.2输入缓冲区
2.2.1缓冲区对 2.2.2标记
超前搜索技术
3.3 词法记号的描述
一节提到,字符串集合由叫做模式的规则 来描述。正规式是表示这些规则的一种重 要方法,因此本节围绕正规式来介绍记号 的描述与识别。在介绍正规式前,我们先 给“语言”一个形式化的定义。
3.3 词法记号的描述
3.3.1 串和语言
– 字母表:符号的有限集合, 例: = {0,1} – 串:符号的有穷序列,例:0110, – 语言:字母表上的一个串集,属于该语言的串 称为该语言的句子或字 {,0,00,000,…}, {}, – 句子:属于语言的串
•串的运算
– 连接 xy,s = s = s –积(指数) s0为,si为si -1s(i > 0)
3.3.3 正规式
正规式 定义的语言 {} a {a} (r) | (s) L(r)∪L(s) (r)(s) L(r)L(s) (r)* (L(r))* (r) L(r) ((a) (b)*)| (c)可以写成ab*| c 备注 a r和s是正规式 r和s是正规式 r是正规式 r是正规式
3.3.3 正规式
正规式服从的代数规律 r|s=s|r r | (s | t ) = (r | s ) | t (rs)t = r(st) r(s | t ) = rs | rt (s | t )r = sr | tr r=r r = r r* = (r | )* r** = r*
3.3.3 正规式
3.1 词法分析器的角色
词法分析是编译的第一阶段,它的主要任条是读 输入字符流,产生用于语法分析的词法记号序 列。 3.1.1 分离词法分析器的理由 1.简化设计 2提高编译效率 3增加可移植性
• 把词法分析从语法分析中分离出来的理由
–简化设计 –编译器的效率会改进 –编译器的可移植性加强 –便于编译器前端的模块划分
• 正规式的例子 = {a, b}
– – – – – a|b (a | b) (a | b ) aa | ab | ba | bb a* (a | b)* {a, b} {aa, ab, ba, bb} {aa, ab, ba, bb} 由字母a构成的所有串集 由a和b构成的所有串集
• 复杂的例子
return(relop, GE)
return(relop, GT)
3.4.1 转换图
关系算符的转换图
= 1 < 开始 0 = > 5 6 other return(relop, LE) return(relop, NE) * return(relop, LT)
从上一小节我们知道,Pascal的6个关系算 符都属于记号relation。因为从程序的语 法是否正确的角度看,使用哪个关系算符 都一样。但是从翻译成目标代码来考虑, 不同的关系算符,其翻译结果是不一样的 。因此词法分析器需要给记号以属性,用 属性来记住记号的附加信息,以便需要时 使用它们。概括地说,记号影响语法分析 的决策,属性影响记号的翻译。
第三章 词法分析
记号
源程序
词法分析器
取下一个记号 符号表
语法分析器
• 本章内容
– 词法分析器:把构成源程序的字符流翻译成 记号流,还完成和用户接口的一些任务。 – 围绕词法分析器的自动生成展开 – 介绍正规式、状态转换图和有限自动机概念
第三章 词法分析
词法分析器的任务是把构成源程序的字符流 翻译成词法记号流。构造词法分析器的一种简 单办法是用状态转换图来描述源语言词法记号 的结构,然后手工把这种状态转换图翻译成为 识别词法记号的程序。用这种方式可以产生高 效的词法分析器。
3.3.6非正规集
ANBN
3.4记号的识别
3.4.1 转换图
关系算符的转换图
= 1 < 开始 0 = > 5 6 other return(relop, LE) return(relop, NE) * return(relop, LT)
2 >
3 4
return(relop, EQ) =
other 8 7 *
3.1.2 词法记号、模式、词法单元
记号的例子 词法记号 词法单元例举 var var for for relation < , < = , = , … id sum, count, D5 num 3.1, 10, 3.8 E12 literal ―seg. error‖ 符 模式的非形式描述 var for < 或 <= 或 = 或 … 由字母开头的字母数字串 任何数值常数 引号“和”之间的任意字
(1)L∪D是字母和数字的集合; (2)LD是所有一个字母后随一个数字的串的集合; (3)L6是6个字母的串的集合; (4)L*是所有字母串(包括)的集合; (5)L(L∪D )*是以字母开头的所有字母数字串的集 合; (6)D+是不含空串的数字串的集合。
3.3 词法记号的描述
3.3.3 正规式
( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 01001101000010000010111001
3.3.4 正规定义
对正规式命名,使表示简洁。 d 1 r1 d 2 r2 ... d n rn
各个di的名字都不同 每个ri都是∪{d1, d2, …, di-1 }上的正规式
3.3.5表示的缩写
• 正规定义的例子
while while do do relop < | < = | = | < > | > | > = id letter (letter | digit )* num digit+ (.digit+)? (E (+ | )? digit+)? delim blank | tab | newline ws delim+
串,但引号本身除外
3.1.2 词法记号及属性
• 历史上词法定义中的一些问题
–忽略空格带来的困难 DO 8 I 3. 75 DO8I 3. 75 DO 8 I 3, 75 – 关键字是否保留 IF THEN THEN THEN=ELSE;ELSE …
• 关键字、保留字和标准标识符的区别
3.1.3 词法记号的属性
3.1.4 词法错误
–词法分析器对源程序采取非常局部的观点 –难以发现下面的错误 fi (a == f (x) ) … – 在实数是a.b格式下,可以发现下面的错误 123. –紧急方式 的错误恢复 – 错误修补 – 最小距离校正 – (1)删除一个多余的字符; – (2)插入一个遗漏的字符; – (3)用一个正确的字符代替一个不正确的字符; – (4)交换两个相邻的字符。
3.3.5表示的缩写
(1)一个或多个实例 一元后缀算符“+”的意思是“ 一个或多个实例”,即正规式a+表示一个或多个a的所 有串的集合。算符+和算符*有同样的优先级和结合性 。代数恒等式 r* = r+ | 和r+ = rr*表达了这两个算符 之间的关系。 (2)零个或一个实例 一元后缀算符?的意思是“零 个或一个实例”,r?是r | 的缩写。如果r是正规式 ,那么(r)?是表示语言L(r)∪{ }的正规式。使用这两 种缩写,可以用num digit+ (.digit+)? (E (+ | )? digit+)?来描述无符号数。 (3)字符组 [abc](其中a、b和c是字母表的符号)表 示正规式a | b | c。缩写字符组[az]表示正规式a | b | … | z。 使 用 字 符 组 , 可 以 用 正 规 式 [AZaz][AZaz09] *描述标识符。
3.1.3 词法记号的属性
单词符号是程序语言的基本语法单位,一般分为下面5 种
关键字(基本字):(个数确定,可全体编为 一类,也可一字一类) 标识符:(个数不确定,作为一类) 常数:各种类型的常数 。(个数不确定,按类 型分类) 运算符:如+、-、*、/、<等。(个数确定,一 符一类) 界符:如,、;、(、)、: 等。(个数确定,一 符一类)