编译原理之词法分析

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