- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标识符的符号表入口地址作为其单词符号的属性值,常
每个基本字占一个单词种别,单词符号的属性值缺省。
对于界符,运算符通常一个符号一个种别,单词符号的
属性值缺省
例: 参见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, ……}
(ba)*b对应的正规集是b前面可出现任意个ba对 L((ba)*b)={b,bab,babab, ……}, 因此两者等价。
例如:FORTRAN语言:
1.DO10K=1,50 2.DO10K=1.50
扫描缓冲区的结构 (自学)
14
词法分析程序设计
设计方法:
⑴写出该语言的词法规则; ⑵把词法规则转换为相应的状态转换图; ⑶把各转换图的初态连在一起,构成识别该 语言的自动机; (4)设计扫描器
17
3.2 正规文法和有限自动机
标识符:统归为一种; 常数:统归为一种,或按整、实、布尔等再分; 运算符和界符:一符一种,或统归为一种。
8
3.1.2 词法分析器的输出形式
单词符号的属性值
单词符号的属性是指单词符号的特征值 。
如果一个种别只含有一个单词符号,那么对于这
个单词符号,种别编码就完全代表它自身了,因 而不需要属性值。
独立的一遍来完成。
把词法分析程序作为语法分析程序调用的子程
序。
每当语法分析器需要一个单词符号时就调用这个子程
序。
每一次调用,词法分析器从源程序字符串中识别出一
个单词符号,并把它的内部表示二元组交给语法分析 器处理。
11
3.1.4 源程序的输入、预处理 及超前搜索
词法分析器工作的第一步是输入源程序文本。 输入串一般放在一个输入缓冲区中。词法分 析器的工作可以直接在输入缓冲区中进行。 但在许多情况下,可以先预处理输入串,识 别工作将更方便。(参见P40 图3.1)
21
3.2.1 正规文法、正规式与正规集
下面是正规式和它所定义的正规集的递归定义。
1) ε ,φ 是 ∑ 上的正规式, 所表示的正规集为 {ε},{ }; 2) 若 a∈∑,则 a 为正规式, 所表示的正规集为 {a}; 3) 设U,V 为 ∑ 上的正规式, 所表示的正规集为 L(U),L(V); 则 U|V为 ∑ 上的正规式, 所表示的正规集为 L(U) ∪ L(V);
正规式b(ab)*及(ba)*b都描述以b开头且其后跟以零个或任意 多个ab所组成的字符串等。故我们说两个正规式等价,
(2)(ab)*对应的正规集以任意个ab对出现,即 ababab…, 而a*b*对应的正规集则是任意个a后接任意个b, 即 a…ab…b, 因此两者不等价。 26
例3.3: 设 =a,b, 则正规式和正规集: a,b ① ab ②(ab)(ab) aa,ab,ba,bb * ,a,aa,aaa,aaaa,…= {an|n≥0} ③ a {,a,b,aa,ab,ba,bb,aaa,aab,abb, ④(ab)* bab,bba,bbb ... = {a, b}* {a,ab,abb,abbb,abbbb,... ⑤aab* = { abn |n≥0}
理解:
正规文法与有穷自动机间的转换 词法分析器的自动产生工具LEX
教学要求
2
本章在编译程序中的地位
源程序
词法分析器
单词符号 表 格 管 理 优化器 中间代码 目标代码生成器 目标代码
3
语法分析器 语法单位 语义分析与中间代码产生 中间代码
出 错 处 理
3.1 设计词法分析器时应考虑的几个问题
④输出源程序清单以便复核。
预处理子程序任务
①从输入缓冲区中读取源程序,预处理后送入扫描缓冲 区。此时,扫描缓冲区的字符都是有效字符。 13 ②词法分析程序这时可以再对扫描缓冲区进行扫描。
3.1.4 源程序的输入、预处理及 超前搜索
超前搜索
对于有些语言,关键字不保护,关键字与用户自定义标
识符间没有界符,要在上下文环境中识别单词,这时需要 超前搜索方法来识别关键字。
若一个种别含有多个单词符号,那么,对于它的
每个单词符号,除了给出种别编码之外,还应给 出有关单词符号的属性值。
9
3.1.2 词法分析器的输出形式
单词符号的属性值
标识符和常数
标识符的内部码
(如ASCII码等等)和常数本身的值 (二 进制,逻辑值等)来表示。 量在其常量表中的入口地址作为其单词符号的属性值。
20
3.2.1 正规文法、正规式与正规集
下面以标识符为例说明正规式与正规集:
标识符是以字母开头的字母数字串。
若用L表示字母, 用D表示数字,
则标识符可表示为: L(L|D)* 其中并臵表示两者的 连接, |表示两者选一, *表示零次或多次引用。 L(L|D)* 为标识符的正规式, 该正规式表示的集合为标识符的正规集。
或运算
U·V为 ∑ 上的正规式, 所表示的正规集为 L(U) L(V);
V* 为 ∑ 上的正规式, 所表示的正规集为 (L(V))* ;
连接积
4) 仅当有限次使用上述三步骤而定义的表达式,才是∑ 上的正
22
规式 ,而这些正规式所表示的字集才是∑上的正规集。
3.2.1 正规文法、正规式与正规集
说明: 1>Σ上的一个字指的是由Σ中字符构成的一个有穷序列; 不包含任何字符的序列称为空字(ε)。 Σ*表示Σ上所有字的全体, 包括空字(ε)。 例如, 若Σ={a, b} 则Σ*={ε, a, b, aa, ab, ba, bb, aaa, …} 2> Ф表示不含任何元素的空集{ }。 注意ε、{ }和{ε}的区别: ε表示不包含任何字符的序列,它是正规集中的一个元素; { }表示不含任何字的集合, 它是一个空的正规集; {ε}表示由空字组成的集合。
执行词法分析的程序称为又称为词法分析器 或扫描器. 词法分析的任务:从左至右逐个地扫描源程 序的字符串, 按照词法规则识别出一个个正确 的单词,并转换为相应的二元式形式,交给 语法分析使用。
把作为字符串的源程序改造成单词符号串的 词法分析是编译的基础。
4
3.1.1 词法分析阶段的必要性
词法分析的工作纳入整个语法分析中一揽子地进行,原则上是 可行的。
28
例3.5: 令Σ={A,B,0,1} , 则: 正规式 正规集 Σ上的“标识符”的全体 1. (A|B)(A|B|0|1)*
={A,B}.{A,B,0,1}*
2.
(0|1)(0|1)*
Σ上“数”的全体 ={0,1}.{0,1}*
3.
问: 正规式 ε, φ, 0 , 110 , 0|1 , 1* 表示的正规 集是?
关键字(保留字或基本字):如
if,then,else,while,do等
标识符:用来表示各种名字,如 x1 常量:如 256,3.14,true, ’abc’
运算符:如 +、-、*、/ 等等
分界符:如 逗号,分号,冒号等
7
3.1.2 词法分析器的输出形式
单词种别: 一个语言的单词符号如何分类、分为几类、如 何编码主要取决于处理上的方便。通常,每种单词 对应一个整数码。 注意:保留字、运算符和界符的个数确定, 标识符和常数的个数不确定。 保留字:可全体视为一种,也可一字一种;
12
3.1.4 源程序的输入、预处理及 超前搜索
预处理的原因
①源程序中包含回车,换行,多余空白符,注释行等编辑字 符, 它们对程序逻辑功能无任何影响, 在词法分析之前,首 先要剔除掉这些符号,使得词法分析更为简单。 ②一行语句结束应配上一个特殊字符说明。
③有些语言要识别标号区,区分标号语句,找出续行符连 接成完整语句等。
5
3.1.2 词法分析器的输出形式
词法分析器输出的单词常常表示为二元式形式
(单词种别,单词符号的属性值)
单词种别提供给语法分析程序使用;
单词符号的属性值提供给语义分析程序使用。
具体的分类设计方法以方便语法分析程序使用为
原则。
6
3.1.2 词法分析器的输出形式
程序语言的单词符号一般分为五种:
解: L(R)=L(a(a|b)*)=L(a)L((a|b)*) =L(a)(L(a|b))*=L(a)(L(a)∪L(b))*