编译原理及实践-第2章 词法分析.ppt
《编译原理及实践-第2章 词法分析.ppt》由会员分享,可在线阅读,更多相关《编译原理及实践-第2章 词法分析.ppt(149页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2 2章章 词法分析词法分析2.1 词法分析器的作用词法分析器的作用2.2 正则表达式正则表达式 2.3 有穷自动机有穷自动机2.4 从正则表达式到从正则表达式到DFA 2.5 用代码实现有穷自动机用代码实现有穷自动机2.6 利用利用lex自动生成词法分析自动生成词法分析程序程序单词的描单词的描述工具述工具单词单词的识的识别系统别系统设计和设计和实现词实现词法分析法分析程序程序12.1 2.1 词法分析器的作用词法分析器的作用 词法分析器词法分析器(词法分析程序词法分析程序)的任务的任务:从源从源代码中读取输入字符,产生单词序列代码中读取输入字符,产生单词序列(生生成独立的有意义的逻辑单元
2、称作单词成独立的有意义的逻辑单元称作单词(token),提交给语法分析使用。,提交给语法分析使用。2任务任务:逐个读入源程序字符并按照:逐个读入源程序字符并按照构词规则构词规则切分切分成一系列单词。单词是语言中具有独立意义的最成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符小单位,包括保留字、标识符、运算符、标点符号和常量等。号和常量等。w识别出源程序中的单词;识别出源程序中的单词;w删除无用的空白字符及注释(空格、回车删除无用的空白字符及注释(空格、回车 等),这些信等),这些信息仅增加了源程序的可读性,便于程序员阅读和维护程息仅增加了源程序的可读性,便于
3、程序员阅读和维护程序,而对于语法分析是完全无用的。序,而对于语法分析是完全无用的。w进行词法检查,能够检测出输入中不能形成进行词法检查,能够检测出输入中不能形成源语言任何源语言任何单词的错误字符串单词的错误字符串。3The big elephant ate the peanut.The big elephant ate the peanut.big 词法分析的结果:词法分析的结果:4 token表示的字符串表示的字符串(串值或词义串值或词义):):if,y,3,then,x,=,0 token的的类型(词法)类型(词法):关键字(关键字(if,else,for,int,return)操作符(操
4、作符(+,-,)数字数字 (3,45,)标识符(标识符(x,y,name)补充:补充:typedef enum 类似宏类似宏 IF,THEN,PLUS,MINUS,NUM,ID TokenType;词法分析器的输出词法分析器的输出:token序列序列5if y3 then x=0 LT,词法分析器词法分析器例如:例如:C源代码源代码:if y3 then x=0,词词法分析器的输出是?法分析器的输出是?类型类型 串值串值例例 ID 表示表示 标识符标识符 类型类型 x 表示表示 具体的标识符串具体的标识符串6定义逻辑项定义逻辑项token的数据类型的数据类型:typedef struct un
5、ion char*stringval;int numval;attribute;TokenRecord;TokenType tokenval;Token类型类型Token词义词义补充:补充:union数据类型数据类型7词法分析程序的函数接口:词法分析程序的函数接口:TokenRecord getToken(void);TokengetToken()源程序源程序词法分析程序词法分析程序语法分析程序语法分析程序符号表符号表8第第2 2章章 词法分析词法分析2.1 词法分析器的作用词法分析器的作用2.2 正则表达式正则表达式 2.3 有穷自动机有穷自动机2.4 从正则表达式到从正则表达式到DFA 2
6、.5 用代码实现有穷自动机用代码实现有穷自动机2.6 利用利用lex自动生成词法分析自动生成词法分析程序程序记号的描记号的描述工具述工具记号的识记号的识别系统别系统设计和设计和实现词实现词法分析法分析程序程序9正则表达式:正则表达式:对自动生成词法分析程序而言,正则表达对自动生成词法分析程序而言,正则表达 式也是非常有用的工具。式也是非常有用的工具。所谓所谓正则表达式正则表达式就是用特定的就是用特定的运算符运算符及及运算运算对象对象按某种规则构造的表达式。按某种规则构造的表达式。例如:例如:a*匹配匹配 空串空串,a,aa,aaa,其表示的是一个集合,记为其表示的是一个集合,记为L(a*)。正
7、则表达式用来描述单词正则表达式用来描述单词结构结构(定义单词定义单词)。102.2.1 基本概念和术语基本概念和术语2.2.2 正则表达式的定义正则表达式的定义2.2.3 正则表达式基本等价关系正则表达式基本等价关系2.2.4 正则表达式的扩展正则表达式的扩展2.2.5 单词的正则表达式举例单词的正则表达式举例2.22.2正则表达式正则表达式 单词的描述工具单词的描述工具112.2.1 2.2.1 基本概念和术语基本概念和术语字母表(符号表、符号集)字母表(符号表、符号集)由若干元素由若干元素(符号、字母)组成的有限非空集合。(符号、字母)组成的有限非空集合。不同的语言可以有不同的字母表,例如
8、不同的语言可以有不同的字母表,例如汉语的字母表中包括汉字、数字及标点汉语的字母表中包括汉字、数字及标点符号等。符号等。12 符号串符号串 由字母表中的符号组成的任何有由字母表中的符号组成的任何有穷序列称为符号串穷序列称为符号串:例如例如00,11,10 是字母表是字母表 =0,1上的符号串。上的符号串。字母表字母表A=a,b,c上的符号串有:上的符号串有:a,b,c,ab,aaca等。等。在符号串中,符号的顺序是很重要的,符在符号串中,符号的顺序是很重要的,符号串号串ab就不同于就不同于ba,abca和和aabc也不同。也不同。13符号串的长度符号串的长度 如果某符号串如果某符号串x x中有中
9、有m m个符号,个符号,则称其长度为则称其长度为m m,表示为表示为x x=m=m,如如001110001110的长度是的长度是6 6。空符号串空符号串,即不包含任何符号的符号串,用,即不包含任何符号的符号串,用表示,其长度为表示,其长度为0 0,即,即=0=0。14w符号串的连接符号串的连接:设:设x和和y是符号串,它们的连是符号串,它们的连接接xy是把是把y的符号写在的符号写在x的符号之后得到的符的符号之后得到的符号串。号串。例如例如 x=ST,y=abu,则它们的连接则它们的连接 xy=STabu,x=2,y=3,xy=5由于由于的含义,显然有的含义,显然有x=x=x。w符号串的方幂符号
10、串的方幂:符号串自身连接符号串自身连接n次得到的符次得到的符号串号串xn 定义为定义为 xxx;n个个x x1=x,x2=xx且且x0=15例;若例;若x=x=abab 则则:x x0 0=x x1 1=abab x x2 2=abababab x x3 3=abababababab x xn n =xx=xxn-1 n-1=x=xn-1n-1x (n0)x (n0)16符号串集合符号串集合:若集合若集合A A中所有元素都是中所有元素都是某字母表某字母表 上的符号串,则称上的符号串,则称A A为字母表为字母表 上的符号串集合。上的符号串集合。符号串集合的和与积符号串集合的和与积设设A A,B
11、B为两个符号串集合,定义为两个符号串集合,定义和和 A A+B(+B(或或A A B)B)=w|w=w|w A A,或或w w BB积积 AB=AB=xy|xxy|x A,yA,y B B 17v若用若用表示空集,则有:表示空集,则有:A+=+A=A A=A=A=A =Av 例:若集合例:若集合A=ab,cde ,集合集合B=B=0,1,则则AB=ab1,ab0,cde0,cde1;18的闭包:的闭包:用用*表示表示 上的一切符号串(包括上的一切符号串(包括)组成的集合,组成的集合,*称为称为的闭包的闭包。例如例如:=a,ba,b *=,a,b,aa,ab,ba,bb,aaa,aab,a,b,
12、aa,ab,ba,bb,aaa,aab,的正闭包:的正闭包:上上除除外的所有符号串组成的外的所有符号串组成的集合记为集合记为+,+称为称为的正闭包的正闭包。例如例如:=a,ba,b +=a,b,aa,ab,ba,bb,aaa,aaba,b,aa,ab,ba,bb,aaa,aab,192.2.1 基本概念和术语基本概念和术语2.2.2 正则表达式的定义正则表达式的定义2.2.3 正则表达式基本等价关系正则表达式基本等价关系2.2.4 正则表达式的扩展正则表达式的扩展2.2.5 单词的正则表达式举例单词的正则表达式举例2.22.2正则表达式正则表达式20w正则表达式正则表达式就是用特定的就是用特定
13、的运算符运算符及及运算对象运算对象按某按某种规则构造的表达式。种规则构造的表达式。w每个正则表达式代表一个每个正则表达式代表一个字符串的集合字符串的集合,我们把,我们把其称为正则集。其称为正则集。w语言语言(Language)是字符串组成的集合,我们也可是字符串组成的集合,我们也可以把正则表达式表示的以把正则表达式表示的正则集正则集称为该正则表达式称为该正则表达式表示的表示的语言语言。2.2.22.2.2正则表达式的定义正则表达式的定义21w正则表达式和它所表示的正则集正则表达式和它所表示的正则集(字符串的集字符串的集合合)的递归定义如下的递归定义如下:设有字母表为设有字母表为,辅助字母表辅助
14、字母表=,|,.,*,(,)22(1)和和是是上的正则式,它们所表示的正则集上的正则式,它们所表示的正则集分别为分别为和和;(2)若若a,则则a是是上的正则式,它所表示的上的正则式,它所表示的正则集为正则集为a;(3)若若r和和s都是都是上的上的正则式正则式,且它们所表示,且它们所表示的的正则集正则集分别为分别为L(r)和和L(s),那么:那么:23 r|s 是是正则式正则式,表示的,表示的正则集正则集为为 L(r|s)=L(r)L(s);rs 是是正则式正则式,表示的,表示的正则集正则集为为 L(rs)=L(r)L(s);r*是是正则式正则式,表示的,表示的正则集正则集为为(L(r)*。(r
15、)是是正则式正则式,表示的,表示的正则集正则集为为L(r);“.”运算符运算符常省略常省略24(4)仅由有限次使用上述三步骤而定义的表仅由有限次使用上述三步骤而定义的表达式才是达式才是上的上的正则式正则式,仅由这些正则式所仅由这些正则式所表示的符号串集合才是表示的符号串集合才是上的上的正则集。正则集。注:算符的优先级为先注:算符的优先级为先“*”,再,再“.”最后最后“|”,都是左结合的,它们满足结合都是左结合的,它们满足结合律。律。25例例1,令,令=a,b,上的正则式和相应的正则集的例子:上的正则式和相应的正则集的例子:正则式正则式 正则集正则集aaa bab(a b)(a b)a a,b
16、abaa,ab,ba,bb ,a,aa,任意个任意个a的串的串(a b)a,b*即即,a,b,aa,ab,ba,bb,26例例2,正则式,正则式(a)|(b)*(c)它所表示的正则集为:它所表示的正则集为:根据运算符的优先级,上述正则式可以表示成根据运算符的优先级,上述正则式可以表示成 a|b*ca|b*c所表示的正则集为:字符串所表示的正则集为:字符串a以及由零个以及由零个或多个或多个b后跟一个后跟一个c 形成的字符串的集合形成的字符串的集合或写成或写成L(a|b*c)=a bnc|其中其中n是大于或等是大于或等于于0的整数的整数27给定一个正则式给定一个正则式,它唯一确定一个正则集;它唯一
17、确定一个正则集;反之不成立。即一个正则集可由多个不同反之不成立。即一个正则集可由多个不同的正则式表示。的正则式表示。aaaa a,aa,aaa,任意个任意个a的串的串a|aaa|aa a,aa,aaa,任意个任意个a的串的串例如:例如:28若若二个二个正则式正则式描述同一正则集,则称二式描述同一正则集,则称二式等价等价(相等相等)。判断下列正则表达式判断下列正则表达式e e1 1和和e e2 2是否等价?是否等价?e1=(a b),e2=b ae1=b(ab),e2=(ba)be1=(a b),e2=(a b)29w正则表达式正则表达式是表示模式的一种重要方法,每是表示模式的一种重要方法,每个
18、模式匹配一个字符串集合个模式匹配一个字符串集合(即正则集即正则集)。w正则集正则集是正则表达式所定义的语言。是正则表达式所定义的语言。w正则表达式正则表达式可以作为字符串集合可以作为字符串集合(即正则集即正则集)的名字。的名字。302.2.1 基本概念和术语基本概念和术语2.2.2 正则表达式的定义正则表达式的定义2.2.3 正则表达式基本等价关系正则表达式基本等价关系2.2.4 正则表达式的扩展正则表达式的扩展2.2.5 单词的正则表达式举例单词的正则表达式举例2.22.2正则表达式正则表达式31A1.r|s=s|r A2.r|r=rA3.r|=rA4.(r|s)|t=r|(s|t)A5.(
19、rs)t=r(st)A6.r(s|t)=rs|rtA7.(s|t)r=sr|trA8.r=r=A9.r=r=rA10.r*=(|r)*=|rr*从集合论的角度去理解!从集合论的角度去理解!2.2.3 2.2.3 正则式基本等价关系正则式基本等价关系322.2.1 基本概念和术语基本概念和术语2.2.2 正则表达式的定义正则表达式的定义2.2.3 正则表达式基本等价关系正则表达式基本等价关系2.2.4 正则表达式的扩展正则表达式的扩展2.2.5 单词的正则表达式举例单词的正则表达式举例2.22.2正则表达式正则表达式332.2.4 2.2.4 正则表达式的扩展正则表达式的扩展w1.一个或多个重复
20、(一个或多个重复(+,*):):假设假设r是正则表达式是正则表达式,r的重复是通过使用标准的闭包运算来描述,的重复是通过使用标准的闭包运算来描述,写作写作r*。它允许它允许r被重复被重复0次或更多次次或更多次。用用r+表示表示r 被重复被重复1次或更多次次或更多次。因此有:。因此有:(0|1)+=(0|1)(0|1)*342.任意字符(任意字符(.):句点句点“.”表示可以匹配除换行符之外的任意单个符。表示可以匹配除换行符之外的任意单个符。利用这个字符就可为利用这个字符就可为所有包含至少一个所有包含至少一个b 的串的串写出写出一个一个正则表达式正则表达式,如下所示:,如下所示:.*b.*3.引
21、号引号“”,引号中的字符串表示文本字符,引号中的字符串表示文本字符串本身。例如:串本身。例如:“.”表示要匹配表示要匹配.字符本字符本身。身。354.字符字符范围范围:表示法表示法a|b|z 表示所有小写字母;表示所有小写字母;0|1|9表示表示0到到9间的所有数字;间的所有数字;常见的表示法是利用常见的表示法是利用方括号方括号和和一个连字符一个连字符,如,如a-z是指所有小写字母,是指所有小写字母,0-9则指数字。则指数字。第二种表示法还可用作表示单个的解,第二种表示法还可用作表示单个的解,a|b|c可写成可写成abc,它还可用于多个范围,它还可用于多个范围,如如 a-z A-Z 代表所有的
22、大小写字母。代表所有的大小写字母。365.正则表达式的正则表达式的名字名字为较长的正则表达式提供一个简化的名字很有用为较长的正则表达式提供一个简化的名字很有用处,这样就不用每次使用正则表达式书写较长的处,这样就不用每次使用正则表达式书写较长的表达式本身了;表达式本身了;如要写一个正则表达式如要写一个正则表达式:a-z A-Z (a-z A-Z 0-9)它定义的正则集为:以字母打头后跟若干字母或数它定义的正则集为:以字母打头后跟若干字母或数字组成的符号串的集合字组成的符号串的集合。37上述正则式上述正则式定义的是程序设计语言定义的是程序设计语言标识符标识符的的词法词法规则规则,通过为,通过为正则
23、表达式提供一个简化的名字,正则表达式提供一个简化的名字,上述正则表达式可写作:上述正则表达式可写作:letter=a-z A-Z digit=0-9 identify=letter(letter digit)38例:写出正则表达式例:写出正则表达式signedNatnat=0-9+signedNat=nat|+nat|-nat对应的正则集?对应的正则集?396.可选的子表达式(可选的子表达式(?):):w如果在特定的串中包括既可能出现又可能不出现如果在特定的串中包括既可能出现又可能不出现的可选部分。例如,的可选部分。例如,nat=0-9+signedNat=nat|+nat|-natw我们可以
24、引入问号我们可以引入问号?来表示来表示r 匹配的串是可选的;上面的匹配的串是可选的;上面的例子可写成:例子可写成:nat=0-9+signedNat=(+|-)?nat402.2.1 基本概念和术语基本概念和术语2.2.2 正则表达式的定义正则表达式的定义2.2.3 正则表达式基本等价关系正则表达式基本等价关系2.2.4 正则表达式的扩展正则表达式的扩展2.2.5 单词的正则表达式举例单词的正则表达式举例2.22.2正则表达式正则表达式412.2.5 2.2.5 单词的正则表达式举例单词的正则表达式举例每一种程序设计语言都有自己的字符集每一种程序设计语言都有自己的字符集(字母表字母表)。语言中
25、的各个语言中的各个单词单词或是或是 上的单个字符上的单个字符(如运算符、如运算符、分隔符等分隔符等),或是,或是 上的字符串上的字符串(如常数、表示符和关如常数、表示符和关键字等键字等)。程序设计语言的程序设计语言的单词单词都能用都能用正则式正则式来定义来定义.由正则式由正则式描述的描述的单词类单词类也称为也称为正则集正则集。421.1.数:数:nat=0-9+signedNat=(+|-)?natnumber=signedNat(“.”nat)?(“E”signedNat)?例如:例如:3,3.5,2.71E-22.2.保留字:保留字:reserved=else|if|int|return|
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理及实践-第2章 词法分析 编译 原理 实践 词法 分析
限制150内