1、1,第三章 词法分析,2,词法分析,3,要求明确此阶段的任务; 理解单词分类和构词规则; 会使用单词的描述和识别机制; 掌握正规文法、状态图、自动机、正规式和正规集的基本概念和它们之间的关系; 掌握词法分析程序的实现方法。,词法分析,4,词法分析,词法分析程序概述 正规文法与正规式 有穷自动机 正规式与有穷自动机的等价性 正规文法与有穷自动机的等价性 一个简单的词法分析器示例,5,(1)分析和识别单词及属性,包括识别语言的关键字、标识符、常数、运算符等; (2)跳过各种分隔符,如空格,回车,制表符等; (3)删除注释; (4)进行词法检查,报告所发现的错误; (5)建立符号表。,3.1 词法分
2、析程序概述,词法分析的任务,6,main( )/*ADD*/ int x=10,y=20,sum;sum=x+y; ,main、(、)、int、x、=、10、,、y、=、20、,、sum、;、sum、=、x、+、y、;、,词法分析,3.1 词法分析程序概述,7,词法分析的基本思路 将单词符号的语法用有效的工具描述; 基于该描述建立单词的识别机制; 设计和实现词法分析程序。,3.1 词法分析程序概述,8,词法分析程序的工作方式 相对独立方式(单遍):把词法分析程序作为语法分析程序的一个独立子程序。语法分析程序需要新符号时调用这个子程序。 完全独立方式(多遍):词法分析程序作为单独一趟来实现。词法
3、分析程序读入整个源程序,它的输出作为语法分析程序的输入。,3.1 词法分析程序概述,9,2.词法分析单独作为一遍,S.P.(字符串),优点: 结构清晰、各遍功能单一 缺点:效率低,1.词法分析程序作为单独的子程序,S.P.(字符串),词法分 析程序,语法分 析程序,取单词,单词,3.1 词法分析程序概述,10,词法分析程序与语法分析程序的接口方式图示,词法分析程序 作为独立程序 (多遍),词法分析程序 作为语法分析 程序的子程序 (单遍),3.1 词法分析程序概述,11,单词的种类(1)关键字:if、for、while(2)标识符:(3) 常数:(4) 运算符:+、-、* (5)分界符:, 、
4、;、(、),词法分析程序的输出形式,3.1 词法分析程序概述,12,3.1 词法分析程序概述,词法分析程序的输出形式,单词类别可以用整数编码 表示:一类一种或一字一种,13,int x=10,y=20,sum;词法分析的结果,3.1 词法分析程序概述,14,词法分析程序的设计与实现,3.1 词法分析程序概述,(1)根据词法规则写出正规文法; (2)将正规文法转换成状态图; (3)将状态图转换成流程图; (4)写出词法分析程序。,15,3.1 词法分析程序概述,正规文法及其状态图,状态图:为识别单词而专门设计的有向图,是设计词法分析程序的一种好途径。,结点代表状态,用圆圈表示,为非终结符; 有向
5、弧表示状态转移; 弧上的标记表示在射出弧的结点状态下可能出现的输入字符,为终结符。,一张状态图包含有穷个状态,只能有一个初态,至少要有一个终态(用双圈表示)。,16,例:某语言的标识符可使用以下正规文法GS来定义:,SlA A|lA|dA la,b,z,d1,2,9 试构造此文法的状态图。,3.1 词法分析程序概述,17,由正规文法构造状态图,3.1 词法分析程序概述,(1)对于右线性文法步骤1 增加结点Z为终态;步骤2 将每个非终结符号设置为一个对应的状态;步骤3 对于Aa,引一条从A到Z的弧,弧上标记为a;而对于AaB,引一条从A到B的弧,弧上标记为a。,SlA A|lA|dA,18,由正
6、规文法构造状态图,(1)对于左线性文法步骤1 增加结点S为初态;步骤2 将每个非终结符号设置为一个对应的状态;步骤3 对于Aa,引一条从S到A的弧,弧上标记为a;而对于ABa,引一条从B到A的弧,弧上标记为a。,3.1 词法分析程序概述,Al|Al|Ad,SlA A|lA|dA,19,词法分析程序的设计与实现,(1)根据词法规则写出正规文法; (2)将正规文法转换成状态图; (3)将状态图转换成流程图; (4)写出词法分析程序。,3.1 词法分析程序概述,20,标识符 无符号整数 运算符:+、*、= 分界符:,、;,【例】假设某种语言的单词符号的子集有:,试构造此语言子集的词法分析程序。,3.
7、1 词法分析程序概述,21,(1)根据词法规则写出正规文法,字母 | 字母 | 数字) 数字 | 数字 + | * | = | =,3.1 词法分析程序概述,22,(2)将正规文法转换成状态图,3.1 词法分析程序概述,23,合并 将初始状态合并为一个唯一的初态; 化简调整状态冲突并对冲突状态重新编号; 如有必要,增加出错状态。,3.1 词法分析程序概述,24,3.1 词法分析程序概述,合并后的状态图,标识符,无符号整数,单界符,双界符,25,(3)将状态图转换成流程图,(4)写出词法分析程序,3.1 词法分析程序概述,26,3.2 正规文法与正规式,正规文法,3型文法回顾;,(右线性)P:
8、A:=a或 A:=aB其中 A、B VNa VT,3型语言:L3,又称正则语言。,3型文法称为正则文法。它是对2型文法进行进一步限制。 左线性 和右线性文法是相互等价的,(左线性)P: A:=a或 A:=Ba其中 A、B VNa VT,多数程序设计语言的单词语法都能用正规文法(3型文法)来描述。,27,3.2 正规文法与正规式,为何引入正规式? 可以更好的表示单词的构成规则(形式化的规则)。 状态转换图的形式化,便于词法分析器的自动生成。,正规式,28,3.2 正规文法与正规式,正规式和正规集的定义,(1) 和都是上的正规式,它们所表示的正规集分别为和。 (2) 对任一个a,a是上的一个正规式
9、,它所表示的正规集为a。 (3) 如果R和S是上的正规式,它们所表示的正规集分别为L(R)和L(S),则: RS是上的正规式,它所表示的正规集为L(R)L(S); RS是上的正规式,它所表示的正规集为L(R)L(S); R*是上的正规式,它所表示的正规集为(L(R)*; (R)也是上的正规式,它所表示的正规集为L(R)。 (4) 仅由有限次使用规则(1)(3)得到的表示式是上的正规式,它所表示的集合是上的正规集。,29,正规式中的运算符:| 或(选择) 连接* 或 重复 () 括号,运算符的优先级:先 * , 后 , 最后 | 在正规式中可以省略。,正规式相等这两个正规式表示的语言相等,3.2
10、 正规文法与正规式,30,【例】设=a,b,正规式和正规集示例,3.2 正规文法与正规式,31,标识符 无符号整数 运算符: +、*、= 分界符:,、;,【例】假设某种语言的单词符号的子集有:,3.2 正规文法与正规式,使用正规式来表示相应单词符号。,32,字母 | 字母 | 数字) 数字 | 数字 + | * |=,标识符: l(l|d)* 无符号整数: dd* 单界符: + | * | |, | ; 双界符: =,3.2 正规文法与正规式,33,正规式:单词的词型公式 正规集:符合词型公式的单词的集合,是符号集 运算符:从高到低的优先次序:* | 正规式的定义是一种递归定义 正规式等价 正
11、规式R和S,如果L(R)=L(S),则RS,【例】 L(b(ab)*)=L(ba)*b), b(ab)*=(ba)*b L(a|b)*)=L(a)*(b)*)*), (a|b)*=(a)*(b)*)*,3.2 正规文法与正规式,正规式和正规集的说明,34,(1) 交换律: RS = SR (2) 结合律: R(ST) = (RS)TR(ST) = (RS)T (3) 分配律: R(ST) = RSRT (RS)T = RTST (4) 同一律: R = R = R (5) 抽取律: r | r = r,3.2 正规文法与正规式,正规式的性质,35,【例】令=a,b,设R=a(ab)* 是上的正
12、规式,试求其表示的正规集。【解答】L(R)=L(a(ab)*)=L(a)L(ab)*)=L(a)(L(ab)*=L(a)(L(a)L(b)*=a(ab)*=aa,b*=a, a, b, aa, ab, ba, bb, aaa, =a, aa, ab, aaa, aab, aba, abb, aaaa, ,3.2 正规文法与正规式,36,【解答】 (1) (ab)*对应的正规集:a、b可任意交替出现,如abbaaabaa*b*对应的正规集:只可出现任意个a或者任意个b,(2) (ab)*对应的正规集:任意个ab对,即ababab;a*b*对应的正规集:先出现任意个a后接任意个b,即aabb;,(
13、3) (ab)*对应的正规集:a、b可任意交替出现,如aababbb;(a*b*)*可采用如下构造方法得到字符串aababbb:(a*b*)2=(a*b*)(a*b*)=(a2b1)(a1b3)=aababbb反之,对(a*b*)*产生的任意字也可由(ab)*得到,即两者是等价的。,【例】 判断下述正规式之间是否等价:(1) (ab)*与a*b* (2) (ab)*与a*b* (3) (ab)*与(a*b*)*,3.2 正规文法与正规式,不等价,不等价,等价,37,【例】证明:设L(a+)=a*-,则有a+=aa*。 【证明】L(a+)=a*-=, a, a2, a3, -=a, a2, a3
14、, =a, a, a2=aa*=L(a)L(a*)=L(aa*)故:a+=aa*,3.2 正规文法与正规式,38,一个正规语言可以由正规文法定义,也可以由正规式定义。 对任意一个正规文法,存在一个定义同一个正规语言的正规式;反之,对每个正规式,存在一个生成同一语言的正规文法。,3.2 正规文法与正规式,正规文法和正规式的等价性,39,(1)令S是文法G的开始符号,首先形成Sr (2)对形成的形如Axy的正规产生式,重写为:AxB,By (2)对形成的形如Ax*y的正规产生式,重写为:AxA,Ay (3)对形如Ax|y的正规产生式,重写为:Ax,Ay (4)不断利用上述规则做变换,直到每个产生式
15、都符合正规文法的要求。,正规式转换成正规文法,将上的正规式 r 转换成文法G(VN,VT,S,P)方法如下:,3.2 正规文法与正规式,正规文法和正规式的等价性,40,步骤1 构造 Sr 步骤2 不断利用下表的规则做变换,直到每个产生式最多含有一个终结符为止。,3.2 正规文法与正规式,41,【例】求正规式(a|b)(a|b|0|1)*对应的正规文法,S(a|b)(a|b|0|1)*,S(a|b),AaA|bA|0A|1A|,GS: SaA|bA AaA|bA|0A|1A|,A(a|b|0|1)*,3.2 正规文法与正规式,42,下面是用正规式表示的变量声明:(int|float)id(,id
16、)* 请改用上下文无关文法表示,也就是写一个上下文无关文法, 它和该正规式等价。,(int | float ) id (, id )*,D( int | float )L L id (, id )*,D int L | float L L L, id | id,GD:Dint L | float LL L, id | id,3.2 正规文法与正规式,43,S a(a|d)*,【例】将R=a(a|d)*转换成相应的正规文法,故,R=a(a|d)*转换成 相应的正规文法GS:,3.2 正规文法与正规式,课堂练习,【解】令S是文法的开始符号,44,将一个正规文法转换为正规式的规则:(1)AxB,By
17、 正规式为: A=xy (2)AxA|y, 正规式为: A=x*y (3)Ax,Ay 正规式为: A=x|y,不断收缩产生式规则,直到剩下一个开始符号定 义的正规式,并且该产生式的右部不含非终结符。,(顺序规则) (循环规则) (分支规则),AxA,Ay,3.2 正规文法与正规式,正规文法转换成正规式,正规文法和正规式的等价性,45,步骤1 将每条产生式改写为正规式; 步骤2 用代入法解正规式方程组,最后只剩下一个开始符号定义的正规式,其中不含非终结符。,3.2 正规文法与正规式,46,【例】GS:SaA|a AdA|d,S=aA|a A= d*d,3.2 正规文法与正规式,47,S aA S a A aA A dA A a A d,课堂练习:将文法GS转换成正规式:,3.2 正规文法与正规式,48,3.2 正规文法与正规式,根据上述规则2, AxA|y 推出 A=x*y,SaA|a,S aA S a A aA A dA A a A d,A(a|d)A,A a|d,将A代入SaA|a得到如下:,Sa(a|d)*(a|d)|a=a(a|d)+|a=a(a|d)+|)= a(a|d)*,根据上述规则3, Ax,Ay 推出A=x|y,A(a|d)*(a|d),49,1、将R=a(a|b)*转换成相应的正则文法,2、将文法GS转换成正规式G:SaA|aAbA|b,作业,