同济大学编译原理 第三章 词法分析_第1页
同济大学编译原理 第三章 词法分析_第2页
同济大学编译原理 第三章 词法分析_第3页
同济大学编译原理 第三章 词法分析_第4页
同济大学编译原理 第三章 词法分析_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 词法分析概括大家的工作n实现了基本的词法分析功能实现了基本的词法分析功能n缓冲区的设置缓冲区的设置n字符串的预读(超前搜索)字符串的预读(超前搜索)n引入了状态转换图模型引入了状态转换图模型n词法错误的诊断和定位词法错误的诊断和定位内容线索n对于词法分析器的要求对于词法分析器的要求n词法分析器的设计词法分析器的设计n正规表达式与有限自动机正规表达式与有限自动机n词法分析器的自动生成词法分析器的自动生成词法分析器的功能源程序扫描器scanner1、关键字2、标识符5、界符4、运算符3、常数由程序语言定义的具有固定意由程序语言定义的具有固定意义的标识符。也可称为保留字义的标识符。也可称为保

2、留字或基本字。例如:或基本字。例如:C C中的中的intint,whilewhile,ifif等。等。它是确定的。它是确定的。界符:如逗号、分号、括号、界符:如逗号、分号、括号、/ /* *,* */ / 等。它是确定的。等。它是确定的。运算符:如运算符:如+ +、- -、* *、/ / 等。等。它是确定的。它是确定的。常数的类型一般有整型、实型、常数的类型一般有整型、实型、布尔型、文字型等。它是不限布尔型、文字型等。它是不限的。的。用来表示各种名字,如变量名、用来表示各种名字,如变量名、数组名、过程名等。它是不限数组名、过程名等。它是不限的。的。单词符号单词符号单词符号表示形式n词法分析器输

3、出的单词符号常表示成二元组:词法分析器输出的单词符号常表示成二元组: ( (单词种别单词种别, , 单词符号的属性值单词符号的属性值) ) 单词种别是语法分析需要的信息单词种别是语法分析需要的信息单词符号属性值则是编译其它阶段需要的信息单词符号属性值则是编译其它阶段需要的信息, ,简称单简称单词值。词值。 例例. . 语句语句const i=25,yes=1const i=25,yes=1,其中,单词,其中,单词2525和和1 1的类别都是常数,其值分别为的类别都是常数,其值分别为2525和和1 1;分类方法n单词种别单词种别: :通常用整数编码。通常用整数编码。n一个语言的单词符号如何分类,

4、分成几类,怎样编码取决一个语言的单词符号如何分类,分成几类,怎样编码取决于处理上的方便。于处理上的方便。标识符标识符一般统归为一种。一般统归为一种。常数常数则宜按类型(整、实、布尔等)分种。则宜按类型(整、实、布尔等)分种。关键字关键字可视其全体为一种,也可以一字一种。采用一字一种的分可视其全体为一种,也可以一字一种。采用一字一种的分法实际处理起来较为方便。法实际处理起来较为方便。运算符运算符可采用一符一种的分法,但也可以把具有一定共性的运算可采用一符一种的分法,但也可以把具有一定共性的运算符视为一类。符视为一类。至于至于界符界符一般用一符一种的分法。一般用一符一种的分法。单词符号的属性n单词

5、符号的属性是指单词符号的特征或特性。属单词符号的属性是指单词符号的特征或特性。属性值则是反映特性或特征的值。性值则是反映特性或特征的值。标识符的属性值是存放它符号表项的指针或内部字符标识符的属性值是存放它符号表项的指针或内部字符串;串;常数的属性值是存放它的常数表项的指针或二进制形常数的属性值是存放它的常数表项的指针或二进制形式;式;关键字、运算符和界符是一符一种,不需给出其自身关键字、运算符和界符是一符一种,不需给出其自身的值。的值。例例. 代码段代码段 while (i=j) i-; 词法分析结果词法分析结果 = , 符号表符号表NoIDAddr type 224AF80INT227DF8

6、8INT逻辑逻辑IF (34,_)左括号左括号 (2,_)整常数整常数 (20,5的二进制表示)的二进制表示)等号等号 (6,_)标识符标识符 (26,M)右括号右括号 (16,_)GOTO (30,_)标号标号 (19,100的二进制表示)的二进制表示)IFIF为关键字,种别编码为关键字,种别编码3434,采用一符一种的编码方式。采用一符一种的编码方式。常数类型,种别编码常数类型,种别编码2020,单词自,单词自身的值为身的值为55的二进制表示。的二进制表示。(为界符,种别编码为界符,种别编码2 2,采,采用一符一种的编码方式。用一符一种的编码方式。等号为运算符,种别编码等号为运算符,种别编

7、码6 6,采用一符一种的编码方式。采用一符一种的编码方式。M M为标识符,种别编码为标识符,种别编码2626,单,单词自身值为词自身值为MM。)为界符,种别编码为界符,种别编码1616,采用一符一种的编码方式。采用一符一种的编码方式。GOTOGOTO为关键字,种别编码为关键字,种别编码3030,采用一符一种的编码方式。采用一符一种的编码方式。100100为标号,种别编码为标号,种别编码1919,单词,单词内部的值用内部的值用100100的二进制表示。的二进制表示。nFORTRAN编译程序的词法分析器在扫描输入串编译程序的词法分析器在扫描输入串 IF (5EQM) GOTO 100 后,它输出的

8、单词符号串是:后,它输出的单词符号串是:FORTRAN编译实例词法分析程序的实现方式n完全独立方式完全独立方式:词法分析程序作为单独一遍来实:词法分析程序作为单独一遍来实现。词法分析程序读入整个源程序,它的输出作现。词法分析程序读入整个源程序,它的输出作为语法分析程序的输入。为语法分析程序的输入。编译程序结构简洁、清晰和条理化编译程序结构简洁、清晰和条理化n相对独立方式相对独立方式:把词法分析程序作为语法分析程:把词法分析程序作为语法分析程序的一个独立子程序。语法分析程序需要新符号序的一个独立子程序。语法分析程序需要新符号时调用这个子程序。时调用这个子程序。优点:避免了中间文件生成,可以提高效

9、率。优点:避免了中间文件生成,可以提高效率。内容线索对于词法分析器的要求对于词法分析器的要求n词法分析器的设计词法分析器的设计n正规表达式与有限自动机正规表达式与有限自动机n词法分析器的自动生成词法分析器的自动生成词法分析器的结构预处理工作包括对空白符、跳格预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符、回车符和换行符等编辑性字符的处理,及删除注解等。符的处理,及删除注解等。预处理子程序预处理子程序输入缓冲区输入缓冲区源程序扫描器扫描器单词符号单词符号扫描缓冲区扫描缓冲区起点指起点指示器示器搜索指搜索指示器示器设定两个指示器设定两个指示器缓冲区一分为二缓冲区一分为二输入源程序文本。

10、输入源程序文本。输入串一般放在输入串一般放在一个缓冲区中,一个缓冲区中,这个缓冲区称输这个缓冲区称输入缓冲区。入缓冲区。单词符号的识别:超前搜索n关键字识别关键字识别 例例. 在标准在标准FORTRAN中四个合法句子:中四个合法句子: 1、DO99K = 1,10 2、IF(5.EQ.M)I = 10 3、DO99K = 1.10 4、IF(5) = 55其中的其中的DODO、IFIF为关键字为关键字其中的其中的DODO、IFIF为标识符为标识符的一部分的一部分单词符号的识别:超前搜索n标识符的识别标识符的识别多数语言的标识符是字母开头的多数语言的标识符是字母开头的“字母字母/ /数字数字”串

11、,而串,而且在程序中标识符的出现后都跟着算符或界符。因此,且在程序中标识符的出现后都跟着算符或界符。因此,不难识别。不难识别。n常数的识别常数的识别对于某些语言的常数的识别也需要使用超前搜索。对于某些语言的常数的识别也需要使用超前搜索。FORTRAN中,中,5.E08和和5. EQ.M都是合法的都是合法的n算符和界符的识别算符和界符的识别对于诸如对于诸如C+C+语言中的语言中的“+ + +”、“- - -”,这种复合成,这种复合成的算符,需要超前搜索。的算符,需要超前搜索。状态转换图n大多数程序设计语言中单词符号的大多数程序设计语言中单词符号的词法规则词法规则可以用可以用正规文正规文法法描述。

12、如:描述。如: 字母字母| 字母字母| 数字数字 数字数字| 数字数字 +|+| | | ; |, |( | )|; |, |( | )|n利用这些规则识别单词符号的过程可用一张称为利用这些规则识别单词符号的过程可用一张称为状态转换状态转换图图的有限方向图来表示,而状态转换图识别单词符号的过的有限方向图来表示,而状态转换图识别单词符号的过程又可以方便地用程序实现程又可以方便地用程序实现。状态转换图定义n转换图:是一个有限方向图。转换图:是一个有限方向图。结点代表状态,用圆圈表示。结点代表状态,用圆圈表示。n初态:一张转换图的启动条件,通常有一个初态:一张转换图的启动条件,通常有一个, ,用圆圈

13、表示。用圆圈表示。n终态:一张转换图的结束条件,至少有一个,用双圈表示。终态:一张转换图的结束条件,至少有一个,用双圈表示。状态之间用方向弧连接。弧上的标记(字符)代表在出射结点状状态之间用方向弧连接。弧上的标记(字符)代表在出射结点状态下可能出现的输入字符或字符类。态下可能出现的输入字符或字符类。n状态转换图中只包含有限个状态(结点)状态转换图中只包含有限个状态(结点)123XYZW在状态在状态1下,若输入字符为下,若输入字符为X,则读进,则读进X并转换并转换到状态到状态2;若输入字符为;若输入字符为Y则读进则读进Y并转换到状并转换到状态态3,输入字符,输入字符Z,状态仍为,状态仍为1。状态

14、转换图的作用n一个状态转换图可用于一个状态转换图可用于接受接受(或(或识别识别)一定的符)一定的符号串。号串。n路路: :在状态转换图中从在状态转换图中从初始状态初始状态到到某一终止状态某一终止状态的的弧上的弧上的标记序列标记序列。n对于某一符号串对于某一符号串,在状态转换图中,若存在一,在状态转换图中,若存在一条路产生条路产生,则称状态转换图接受(或识别)该,则称状态转换图接受(或识别)该符号串符号串,否则称符号串,否则称符号串不能被接受。不能被接受。状态转换图所能识别的语言n能被状态转换图能被状态转换图TG接受的符号串的集合记为接受的符号串的集合记为L(TG),称它为,称它为状态转换图所能

15、识别的语言状态转换图所能识别的语言。L(TG)= 0,1,00,01,11,001,010,L(TG)= a,b,ab,ba,aaa,bbb,aab,bba,状态转换图示例n大多数程序语言的单词符号都大多数程序语言的单词符号都可以用状态转换图予以识别。可以用状态转换图予以识别。2 20 01 1字母字母其他其他字母或数字字母或数字* *(b b)识别标识符的转换图)识别标识符的转换图其他其他2 20 01 1数字数字数字数字* *(c c)识别整数的转换图)识别整数的转换图初态初态终态终态从从0 0状态到状态到1 1状态状态可能出现字母可能出现字母1 1X XY Y(a)(a)单个符号的转单个

16、符号的转换图示例换图示例2 23 3意味着多读进了一个不属于标意味着多读进了一个不属于标识符部分的字符,应把它退还识符部分的字符,应把它退还给输入串给输入串 a. .b a .b E (或或D)d a.b(a,b,d 为整数常数为整数常数) a.Ed .b Ed a.bE d aEd0123457数字数字.数字数字 .数字数字其它其它数字数字E / DE / D+ / -数字数字数字数字其它其它数字数字*6(d d)识别)识别FORTRANFORTRAN实型常数的转换图实型常数的转换图状态转换图识别单词符号的过程Step1. 从初态开始;从初态开始;Step2. 从输入串中读一个字符;从输入串

17、中读一个字符;Step3. 判明读入字符与从当前状态出发的哪条弧上判明读入字符与从当前状态出发的哪条弧上 的标记相匹配,便转到相应匹配的那条弧所指的标记相匹配,便转到相应匹配的那条弧所指向的状态;向的状态;Step4. 重复重复Step3,均不匹配时便告失败;到达终,均不匹配时便告失败;到达终态时便识别出一个单词符号。态时便识别出一个单词符号。例例. . 设一小语言所有单词符号及其内部表示形式设一小语言所有单词符号及其内部表示形式单词符号单词符号种别编码种别编码助忆符助忆符内码值内码值DIM1$DIM-IF2$IF-DO3$DO-STOP4$STOP-END5$END-标识符标识符6$ID内部

18、字符串内部字符串整常数整常数7$INT标准二进制形式标准二进制形式=8$ASSIGN-+9$PLUS-*10$STAR-*11$POWER-.12$COMMA-(13$LPAR-)14$RPAR-能识别小语言所有单词的状态转换能识别小语言所有单词的状态转换图图约定(限制)约定(限制): : 关键字为保留字关键字为保留字; ; 保留字作为标识符保留字作为标识符处理处理, ,并使用保留字并使用保留字表识别;表识别;关键字、标识符、关键字、标识符、常数间若无运算符常数间若无运算符或界限符则加一空或界限符则加一空格格0空白空白字母字母1字母或数字字母或数字2非字母与数字非字母与数字34*5678910

19、111213数字数字数字数字非数字非数字=+*非非*,()其它其它*状态转换图实现中的变量和过程ch:字符变量:字符变量 功能:存放当前读入字符功能:存放当前读入字符strToken:字符数组:字符数组 功能:存放单词的字符串功能:存放单词的字符串GetChar:取字符过程:取字符过程 功能:取下一字符到功能:取下一字符到ch ;搜;搜 索指针索指针+1GetBC:滤除空字符过程:滤除空字符过程 功能:判功能:判ch =空空? 若是若是,则则调用调用GetCharConcat:子程序过程:子程序过程 功能:把功能:把ch中的字符拼入中的字符拼入strToken IsLetter, IsDigi

20、t:布尔函数:布尔函数 功能:功能: ch中为字母、数字时返中为字母、数字时返回回.T.Reserve:整型函数:整型函数 功能:按功能:按strToken中字符串查保中字符串查保留字表;查到返回保留字留字表;查到返回保留字编码编码;否则返回否则返回0Retract:子程序过程:子程序过程 功能:搜索指针回退一字符功能:搜索指针回退一字符InsertId:函数:函数 功能:将标识符插入符号表,返功能:将标识符插入符号表,返回符号表指针回符号表指针InsertConst函数函数 功能:功能: 将常数插入常数表,返回将常数插入常数表,返回常数表指针常数表指针程序段n不含回路的分叉结点对应的程序段可

21、表示为不含回路的分叉结点对应的程序段可表示为 GetChar(); if (IsLetter() 状态状态j的对应程序段的对应程序段 else if (IsDigit()状态状态k的对应程序段的对应程序段 else if(ch=/) 状态状态l的对应程序段的对应程序段 else错误处理错误处理ijkl字母字母数字数字/程序段n终态结点对应一条语句终态结点对应一条语句 return(code,value);ij字母或字母或数字数字其它其它in含回路的状态结点对应的程序段可表示为含回路的状态结点对应的程序段可表示为 GetChar(); While(IsLetter() or IsDigit()

22、GetChar(); 状态状态j的对应程序段的对应程序段int code,value;strToken=“”;GetChar();GetBC();If (IsLetter() while(IsLetter() or IsDigit() Concat();GetChar(); Retract(); code=Reserve(); if(code=0) value=InsertId(strToken); return($ID,value); else return(code,-);else if(IsDigit() while(IsDigit() Concat(); GetChar(); Retr

23、act(); value=InsertConst(strToken); return($INT,value);else if (ch=) return($ASSIGN,-);else if (ch=+) return($PLUS,-);else if(ch=“*”) Getchar(); if(ch=*) return($POWER,-); Retract();return($STAR,-);else if(ch=:) return($SEMICOLON,-);else if(ch=() return($LPAR,-);else if(ch=) return($RPAR,-);else if(

24、ch=) return($LBRACE,-);else if(ch=) return($RBRACE,-);else ProcError();扫描器总控程序内容线索对于词法分析器的要求对于词法分析器的要求词法分析器的设计词法分析器的设计n正规表达式与有限自动机正规表达式与有限自动机n词法分析器的自动生成词法分析器的自动生成FA正规表达式与有限自动机正规式正规式DFANFA正规文法正规文法子集法子集法状态消去法状态消去法DFA化简化简Thompson算法算法内容线索对于词法分析器的要求对于词法分析器的要求词法分析器的设计词法分析器的设计正规表达式与有限自动机正规表达式与有限自动机n词法分析器的自

25、动生成词法分析器的自动生成词法分析器的自动产生LEX词法分析程序词法分析程序自动产生器自动产生器词法分析器词法分析器LLEX源程序源程序 词法分析器词法分析器L单词符号单词符号输入串输入串状态转换表状态转换表控制执行程序控制执行程序nLEX程序由一组正规式以及与每个正规式相应的动作组成。程序由一组正规式以及与每个正规式相应的动作组成。动作本身是一小段程序代码,它指出了当按正规式识别出一个单词动作本身是一小段程序代码,它指出了当按正规式识别出一个单词符号时应采取的行动。符号时应采取的行动。语言LEX的一般描述(1) 正规式辅助定义式正规式辅助定义式 d1 r1 d2 r2 . dn rn ri

26、为正规式为正规式, di为该正规式的简名为该正规式的简名, ri中只允许出现中只允许出现 中的字符和已定义的简名中的字符和已定义的简名d1, d2, , di-1(2) 识别规则:是一串下述形式的识别规则:是一串下述形式的LEX语句语句 P1 A1 P2 A2 . Pm AmLEX源程序包括源程序包括: 辅助定义部分辅助定义部分 识别规则部分识别规则部分 用户子程序部分用户子程序部分Pi为为d1, d2, . . . ,dn上的正规式;上的正规式; Ai 为识别出为识别出词形词形 Pi后应采取的动作,是后应采取的动作,是一小段程序代码。一小段程序代码。例例. 正规式辅助定义式正规式辅助定义式

27、letter AB Z digit 01 9标识符标识符: iden letter (letter digit)*整常数整常数: integer digit(digit)* sign +- signedinteger sign integer不带指数部分的实常数不带指数部分的实常数: decimal signedinteger . integer signedinteger . sign . Integer带指数部分的实常数带指数部分的实常数: exponential (decimal signedinteger) E signedinteger例例. 识别小语言单词符号的识别小语言单词符号的

28、 LEX 程序程序AUXILIARY DEFINITIONS /* 辅助定义辅助定义 */ letter AB . . .Z digit 01 . . . 9RECOGNITION RULES /* 识别规则识别规则 */1 DIM RETURN (1, _ )2 IF RETURN (2, _ )3 DO RETURN (3, _ )4 STOP RETURN (4, _ )5 END RETURN (5, _ )6 letter(letter | digit)* RETURN (6, getSymbolTableEntryPoint() )7 digit (digit)* RETURN (

29、7, getConstTableEntryPoint() )8 = RETURN (8, _ )9 + RETURN (9, _ )10 * RETURN (10, _ )11 * RETURN (11, _ )12 , RETURN (12, _ )13 ( RETURN (13, _ )14 ) RETURN (14, _ )正规式正规式LEX 的实现n方法方法由由LEX 编译程序将编译程序将 LEX 源程序改造为一个词法分析器,即构造源程序改造为一个词法分析器,即构造相应的相应的 DFAn步骤步骤对每条识别规则对每条识别规则Pi构造一个相应的构造一个相应的 NFA Mi引入一个新的初态引

30、入一个新的初态X, 连接成连接成 NFA M用子集法将其确定化并化简用子集法将其确定化并化简将将 DFA 转换为词法分析程序转换为词法分析程序n注意注意匹配最长子串匹配最长子串(最长匹配原则最长匹配原则)多个最长子串匹配多个最长子串匹配Pi, 以前面的以前面的Pi为准为准(优先匹配原则优先匹配原则)XM2P1 . . .M1MnP2Pn例例. LEX 程序程序: a abb a*bb* NFA M:012345678aabbabb 0137aa*bb*abb247875868bbbaabbba abba*bb*状态状态ab识别单词识别单词 0 1 3 7 2 4 7 8 2 4 7 7 5 8

31、a 8 8a*bb* 7 7 8 5 8 6 8a*bb* 6 8 8abb输入:输入:abbbabb输出:输出:abbb abba*bb*aFA总结正规式正规式DFANFA正规文法正规文法子集法子集法状态消去法状态消去法DFA化简化简Thompson算法算法词法分词法分析程序析程序正规定义式正规定义式识别规则识别规则作业nP636 (4)()(5)8(1)()(2)()(7)7 (1)()(2)912Flex简介nFlex是一款是一款Unix下用于自动生成词法分析器(下用于自动生成词法分析器(lexical analyzer)的开源工具。词法分)的开源工具。词法分析器又称作扫描器(析器又称作

32、扫描器(scanner)、标记生成器()、标记生成器(tokenizer),能够识别文本中的词法),能够识别文本中的词法规则。规则。n大约大约1987年时,劳伦斯年时,劳伦斯-伯克利实验室的伯克利实验室的Vern Paxson采用采用ratfor语言编写了语言编写了Flex,意,意为为“Fast Lexical Analyzer Generator”,后又翻译为,后又翻译为C语言。语言。nFlex程序通过读入用户编写的规则描述文件(也称作程序通过读入用户编写的规则描述文件(也称作Flex源文件或源文件或Flex脚本,以脚本,以*.l或或*.ll作为后缀名)生成扫描器源文件,其中包含调用接口作为

33、后缀名)生成扫描器源文件,其中包含调用接口yylex()函数,执行该函数即可函数,执行该函数即可对输入文本进行词法分析。如下图所示:对输入文本进行词法分析。如下图所示:Flex正则表达式nFlex使用表达式规则来描述词法规则,其使用的正则表达式是一种使使用表达式规则来描述词法规则,其使用的正则表达式是一种使用元语言的模式描述,和扩展的用元语言的模式描述,和扩展的POSIX正则表达式基本类似。一些具正则表达式基本类似。一些具有特殊含义的字符列举如下:有特殊含义的字符列举如下:字符字符含义含义.匹配换行符n以外的全部单个字符匹配字符集,用表示取反,用-简写一段连续的ASCII字符a-z-jv除j和

34、v以外的小写字母除用于内表取反外,作为模式的第一个字符匹配一行的开头$作为模式的最后一个字符匹配一行的结尾指出一个模式可能出现的次数,A1,3表示A出现1次或3次转义字符字符字符含义含义*匹配0或多个该模式+匹配1或多个该模式?匹配0或1个该模式|表达式间的逻辑或,表示能且只能匹配其中的任意一个“”用”括起的内容将无视其中的特殊字符而被处理为字符串,但其中的转义字符仍然有效()将一系列表达式分组jokers 匹配jokes或jokerA1,2shis+ 匹配AAshis, Ashis, AAshiss, Ashiss等A(b-e)? 匹配A, Ab, Ac, Ad, AeFlex规则描述文件n

35、一个一个Flex规则描述文件分为三段,以规则描述文件分为三段,以%分界,如下所示:分界,如下所示:声明部分声明部分%规则部分规则部分%辅助代码辅助代码n声明部分包括:声明部分包括:以以%option开头的开头的Flex配置语句,如配置语句,如%option c+指定生成指定生成c+而非而非c形式的词法形式的词法分析器源代码分析器源代码用用% %括住的括住的C/C+代码,这些代码将直接被代码,这些代码将直接被Flex搬到生成的扫描器源代码搬到生成的扫描器源代码中,一般为扫描器所要用到的辅助变量声明及一些初始化语句中,一般为扫描器所要用到的辅助变量声明及一些初始化语句自定义模式,为一些模式命名,以

36、便重用和维护,格式如下:自定义模式,为一些模式命名,以便重用和维护,格式如下:Digit0-9(定义正则表达式(定义正则表达式0-9为数字)为数字)Lettera-zA-ZNewlinenWhitespace t+Flex规则描述文件n规则部分由若干条模式(规则部分由若干条模式(pattern)和动作()和动作(action)组成组成的规则组的规则组成,格式如下:成,格式如下:模式模式动作动作模式即模式即Flex正则表达式,动作即一些正则表达式,动作即一些C/C+语句。模式指出一个单词是语句。模式指出一个单词是如何构成的,当分析出一个符合规则的单词时,就执行相应的动作。如如何构成的,当分析出一

37、个符合规则的单词时,就执行相应的动作。如Newline lineno+;(Newline为之前定义的换行模式,遇到换行符时更新为之前定义的换行模式,遇到换行符时更新行数)行数)又如又如:当识别到/*时采取以下动作:循环调用Flex提供的yyinput()继续向后读直到遇上*/为止 C语言风格注释的匹配方法Flex规则描述文件n规则部分的一些注意事项:规则部分的一些注意事项:规则匹配的优先级按书写顺序排序。写在越靠规则匹配的优先级按书写顺序排序。写在越靠前的规则越优先匹配,如:前的规则越优先匹配,如:“while”/*优先匹配单词优先匹配单词while*/L(L|D)*/*如上述模式均不匹配,匹

38、配为标识符如上述模式均不匹配,匹配为标识符*/(D 0-9,L a-zA-Z_)使用使用来引用在声明区自定义的模式,如:来引用在声明区自定义的模式,如:Newline模式一定要位于一行的开头且前面不能有缩进模式一定要位于一行的开头且前面不能有缩进;动作的开头一定要与对应的模式在同一行;动作的开头一定要与对应的模式在同一行Flex规则描述文件n辅助代码部分可定义一些分析过程中要用辅助代码部分可定义一些分析过程中要用到的函数(当然也可以定义到的函数(当然也可以定义main函数),函数),这部分的代码也会被这部分的代码也会被Flex直接搬到生成的直接搬到生成的扫描器源代码中扫描器源代码中n作用域问题

39、:为了保证自己定义的变量和作用域问题:为了保证自己定义的变量和函数能被规则部分和辅助代码部分访问,函数能被规则部分和辅助代码部分访问,应将它们正确定义于声明部分的应将它们正确定义于声明部分的%中中Flex规则描述文件示例n按照教材按照教材P42表表3.1描述的词法规则可编写如下描述的词法规则可编写如下Flex规则描述文件:规则描述文件:Flex提供了一系列供用户操作的接口变量和函数,如本例中的yytext记录了当前截取的字符内容。此外,yyin和yyout指针分别指向扫描器的输入和输出,默认为stdin和stdout;yywrap()函数必须由用户实现以指定读到文件尾时的动作,返回1结束解析,

40、可通过赋值yyin并返回0来实现多文件解析;Flex实践获取与安装nLinux下安装下安装Flex一般方法:一般方法:n从从http:/ check(检查编译结果,可省略)(检查编译结果,可省略)make install(如遇权限问题加上(如遇权限问题加上sudo命令)命令)快速方法:快速方法:n以以Ubuntu的的apt-get为例:进入终端,输入以下命令为例:进入终端,输入以下命令apt-get install built-essential(更新(更新gcc等编译工具,可省略)等编译工具,可省略)apt-get install flex(下载并安装(下载并安装Flex)安装完毕后使用安装

41、完毕后使用flex -version命令打印版本号验证安装命令打印版本号验证安装nWindows下使用下使用Flex查阅网上相关开源项目,需借助查阅网上相关开源项目,需借助Cygwin(略)(略)Flex实践编译与运行n将之前编写完的将之前编写完的Flex脚本保存为脚本保存为scanner.l文文件,转入保存目录,键入件,转入保存目录,键入flex scanner.l,生,生成词法分析器源文件成词法分析器源文件lex.yy.c;n使用使用gcc编译编译lex.yy.c为可执行文件:键入为可执行文件:键入gcc lex.yy.c o myscanner,生成扫描器,生成扫描器myscanner;

42、n键入键入./myscanner运行扫描器,运行扫描器,yylex()函数默函数默认以认以stdin为输入文件流,键入程序片段测试为输入文件流,键入程序片段测试扫描器,按扫描器,按ctrl+d输入输入eof终止。终止。Flex实践运行结果输入的程序片段为i = 0IF i=0 i=1共计三个标识符(都是i),三个常数(0,0,1),代码共2行,根据打印结果验证程序基本正确参考资料nJohn Levine. Flex & Bison. OReilly, 2009nDoug Brown, John Levine, Tony Mason. Lex & Yacc, 2nd Editio

43、n. OReilly, 1992nhttp:/ M. E. and E. Schmidt 1975. Lex - A Lexical Analyzer Generator. Computing Science Technical Report No. 39, Bell Laboratories, Murray Hill, New Jersey.正规表达式与有限自动机n为了更好地使用状态转换图构造词法分析器,和讨论词法为了更好地使用状态转换图构造词法分析器,和讨论词法分析器的自动生成,还需要将转换图的概念形式化。分析器的自动生成,还需要将转换图的概念形式化。正规式与正规集正规式与正规集确定有限自

44、动机确定有限自动机 (DFA)(DFA)非确定有限自动机非确定有限自动机(NFA)(NFA)正规式与有限自动机的等价性正规式与有限自动机的等价性确定有限自动机的化简确定有限自动机的化简正规式与正规集n字母表字母表上的上的正规式正规式和和正规集正规集递归定义如下:递归定义如下: (1)和和 都是都是上的正规式,它们所表示的正规集分别上的正规式,它们所表示的正规集分别 为为和和 。其中:。其中:为空字符串,为空字符串, 为空集;为空集; (2)任意元素)任意元素a ,a是是上的一个正规式,它所表示的上的一个正规式,它所表示的 正规集是正规集是a; (3)假定)假定U和和V都是都是上的正规式,它们所

45、表示的正规集上的正规式,它们所表示的正规集 记为记为L(U)和和L(V),那么,(,那么,(U|V),(),(UV)和)和(U)*都是都是 正规式,他们所表示的正规集分别记为正规式,他们所表示的正规集分别记为L(U)L(V), L(U)L(V)和和(L(U)*。 (4)仅由有限次使用上述三步而得到的表达式才是)仅由有限次使用上述三步而得到的表达式才是上的上的 正规式,它们所表示的字集才是正规式,它们所表示的字集才是上的正规集。上的正规集。三种运算示例例例1. 设设 L = 001,10,111 , M = , 001 , 则则 L M = , 10, 001, 111 例例2. 设设 L =

46、001,10,111 , M = , 001 ,则则 LM = 001, 10, 111, 001001, 10001, 111001 例例3. 设设 L = 0, 11 , 则则 L* = , 0, 11, 00, 011, 110, 1111, 000, 0011, 0110, 01111, 1100, 11011, 11110, 111111, 说明n运算符运算符 ”| |”读为读为”或或”; ”. .”读为读为”连接连接” ”* *”读为读为”闭包闭包”。 一般地,连接符一般地,连接符”. .”可省略不写,在不引起混淆的情可省略不写,在不引起混淆的情况下,括号可省去。况下,括号可省去。

47、n正规式运算符的正规式运算符的优先顺序优先顺序为:为:”* *”最高最高, ,”. .”次之次之, ,”| |”最低。最低。n若两个正规式所表示的正规集相同,则认为二者等价,记若两个正规式所表示的正规集相同,则认为二者等价,记为为U=V。例例1. 令令 a,b, 上的正规式和相应的正规集有上的正规式和相应的正规集有正规式正规式(a|b)(a|b)正规集正规集 L(a|b)(a|b)=L(a|b)L(a|b) =(L(a)L(b)(L(a)L(b) =a,ba,b=aa,ab,ba,bbba*L(ba*)=L(b)L(a*)=L(b)(L(a)* =ba*=b,a,aa,aaa, =b,ab,b

48、aa,baaa,上所有以上所有以b为首后跟任意多个为首后跟任意多个a的的字的集合。字的集合。正规式正规式a(a|b)*(a|b)*(aa|bb)(a|b)*正规集正规集上所有以上所有以a a为首的字集为首的字集上所有含有两个相继上所有含有两个相继a a或两个相继或两个相继b b的字集的字集例例2. C语言中语言中“标识符标识符”全体的正规式为:全体的正规式为:(A| B | Z | a | b | z)( A | B | Z | a |b|z|0|1|9)*例例3. “整数整数”全体的正规式:全体的正规式:(0 | 1 | 2 | 9 |)(0 | 1 | 2 | 9)*正规式的运算律n令令U

49、、V和和W均为正规式,则:均为正规式,则: (1)U|V=V|U交换律交换律 (2)U|(V|W)=(U|V)|W结合律结合律 (3)U(VW)=(UV)W (4)U(V|W)=UV|UW 分配律分配律 (5)(V|W)U=VU|WU (6)U=U=U运算律证明-1(1)交换律)交换律: UV=VU 证明证明:L(UV) = L(U)L(V) = L(V)L(U) = L(VU)(2)结合律)结合律: U(VW) = (UV)W 证明证明: L(U(VW) = L(U)L(VW) = L(U)(L(V)L(W) = (L(U)L(V)L(W) = L(UV)W )运算律证明-2(3)结合律)结

50、合律: U(VW)=(UV)W 证明证明: L(U(VW) =L(U)L(VW) =L(U)(L(V)L(W) =L(U)(L(V)L(W) =L(U)(L(V)L(W) =(L(U)L(V)L(W) =L(UV) L(W) =L(UV)W)举例试证明:试证明: A* = A A*证明:证明: L( AA*) = L()L( AA*) = L()(L( A) L(A*) ) = L()L( A) (L(A)0L(A)1L(A)2.) = L()L(A)1L(A)2L(A)3.) = (L(A)* = L(A*) 自动机n什么是自动机?什么是自动机?具有离散输入输出的数学模型。具有离散输入输出的

51、数学模型。自动机接受一定的输入,执行一定的动作,产生一定的结果。使用状态自动机接受一定的输入,执行一定的动作,产生一定的结果。使用状态迁移描述整个工作过程。迁移描述整个工作过程。n状态:一个标识,能区分自动机在不同时刻的状况。有限状态系统具有任意状态:一个标识,能区分自动机在不同时刻的状况。有限状态系统具有任意有限数目的内部有限数目的内部“状态状态”n为什么叫自动机?为什么叫自动机?可能的状态、运行的规则都是事先确定的。一旦开始运行,就按照事先可能的状态、运行的规则都是事先确定的。一旦开始运行,就按照事先确定的规则工作,因此叫确定的规则工作,因此叫“自动机自动机”。n自动机的本质?自动机的本质

52、?根据状态、输入和规则决定下一个状态根据状态、输入和规则决定下一个状态状态状态 输入输入 规则规则 状态迁移状态迁移有限自动机的定义n有限自动机(有限自动机(FA,Finite Automata)有限状态机(有限状态机(FSM,Finite State Machine)一个机器或一种控制结构,设计它的目的是为一个机器或一种控制结构,设计它的目的是为了自动仿效一个事先确定的操作序列或响应一了自动仿效一个事先确定的操作序列或响应一条已编码的指令。条已编码的指令。FA的模型nFA可以理解成一个控制器,它读一条输入带上的字符。可以理解成一个控制器,它读一条输入带上的字符。a b c d d e e f

53、 g . 控制器输入带有限自动机有限自动机= =有限控制器有限控制器+ +字符输入带字符输入带示例q0q1q2q3Start01101100输入(字符串)输入(字符串): 0 0 1 000 10控制器确定有限自动机(DFA)nDFA是一个五元组是一个五元组 M=(S, ,s0,F)S: 有限的状态集合,每个元素称为一个有限的状态集合,每个元素称为一个状态状态; : 有限的输入字母表,每个元素称为一个有限的输入字母表,每个元素称为一个输入字符输入字符;: 转换函数转换函数(状态转移集合状态转移集合): S S ;s0: 初始状态,初始状态, s0 S ;F: 终止状态集终止状态集, F S ;

54、状态转换矩阵n一个一个DFA可用一个矩阵表示,该矩阵的行表示状态,列表可用一个矩阵表示,该矩阵的行表示状态,列表示输入字符,矩阵元素表示示输入字符,矩阵元素表示(s,a)的值。的值。例:例:DFA M= ( 0,1,2,3,a,b, , 0, 3) 其中其中(0,a)=1 (0,b)=2 (2,a)=1 (2,b)=3 (1,a)=3 (1,b)=2 (3,a)=3 (3,b)=3 对应的状态转换矩阵对应的状态转换矩阵 状态状态ab012132213333DFA与状态转换图n一个一个DFA可以表示成一张(确定的)状态转换图。可以表示成一张(确定的)状态转换图。假定假定DFA M含有含有m个状态

55、和个状态和n个输入字符,那么,状态图必含有个输入字符,那么,状态图必含有m 个状态结点,每个结点有个状态结点,每个结点有n条弧射出和别的结点相连。每条弧上用条弧射出和别的结点相连。每条弧上用中的一个不同输入字符做标记。整张图有唯一的一个初态结点和若中的一个不同输入字符做标记。整张图有唯一的一个初态结点和若干终态结点。干终态结点。状态状态ab012132213333 0 1 2 3 a b b a a,b a b 扩展转移函数n 函数函数接收一个字符串的状态转移函数。接收一个字符串的状态转移函数。 : S * S n 对任何对任何s S,定义:,定义: 1. (s , ) = s 2. 若若是一

56、个字符串是一个字符串, a是一个字符是一个字符定义定义: (s, a)=( (s,),a)n对于对于DFA: (s,a)=( (s, ),a)=(s,a)即对于单个字符时即对于单个字符时和和是相等的。是相等的。扩展转移函数q0q1q2q3Start01101100 (q0 , 0010) = ( (q0 , 001) ,0)= ( ( (q0 , 00) , 1) ,0)= ( ( ( (q0 , 0) , 0) , 1) ,0)= ( ( ( (q0 , 0) , 0) , 1) ,0)= ( ( (q2, 0) , 1) ,0)= ( (q0, 1) ,0)= (q1, ,0)=q3输入(

57、字符串)输入(字符串): 0 0 1 000 10DFA接受的语言n被被DFA接收的字符串接收的字符串: 输入结束后使输入结束后使DFA的状态到达终止的状态到达终止状态。否则该字符串不能被状态。否则该字符串不能被DFA接收接收.nDFA接收的语言接收的语言: 被被DFA接收的字符串的集合接收的字符串的集合. L(M) = ( s0 , ) F 对任一输入字符串对任一输入字符串 *,若存在一条从初态结点,若存在一条从初态结点s0到某到某一终态结点的通路一终态结点的通路, 且这条通路上所有弧的标记连接成的且这条通路上所有弧的标记连接成的字等于字等于,则称则称可以被可以被DFA M所识别所识别(读出

58、、接受)读出、接受)。 若若s0F, 则则可被接受。可被接受。 设计DFAn例例. 构造自动机,识别所有由奇数个构造自动机,识别所有由奇数个a和奇数个和奇数个b组成的字符串。组成的字符串。n关键:不需要记住所看到的整个字符串,只需记住至此所看到的关键:不需要记住所看到的整个字符串,只需记住至此所看到的a、b个数是偶数还是奇数。个数是偶数还是奇数。q偶偶a偶偶bq奇奇a偶偶bq偶偶a奇奇bq奇奇a奇奇bStartbaabaabb非确定的有限自动机n修改修改DFA的模型的模型,使之在某个状态使之在某个状态, 对应一个输入对应一个输入,可以有多个转移可以有多个转移, 到达不到达不 同同的状态的状态,

59、 即:即:具有在同一情况下可有不同选择的能力。具有在同一情况下可有不同选择的能力。则称为非确定的有限则称为非确定的有限自动机。自动机。r0r11r211p0p11p311p21s011接受长度为接受长度为3 3的倍的倍数的输入字符串数的输入字符串接受长度为接受长度为4 4的倍的倍数的输入字符串数的输入字符串接受长接受长度为度为3 3或或4 4的的倍数的倍数的输入字输入字符串符串非确定的有限自动机n一个非确定的有限自动机(一个非确定的有限自动机(NFA)M 是一个五元组是一个五元组: M = ( S, , , S0, F ),其中,其中: (1)S和和 的定义同前;的定义同前; (2): S 2

60、S(状态子集);(状态子集); 对于某个状态对于某个状态s S 和一个输入字母和一个输入字母a: (s, a)=S S (3)S0 S为非空初态集;为非空初态集; (4)F S为终态集为终态集状态转换图和转换矩阵表示的NFAStartpr0, 10q1(1)Startp0, 11qr0, 1(2)pq r0 q q q, r 1pq r0 p r r 1 p, q 注:状态转换矩阵中的每一项都是一个集合。注:状态转换矩阵中的每一项都是一个集合。含空集含空集,即对于某些状态与输入字母的组合可能,即对于某些状态与输入字母的组合可能没有动作。没有动作。NFA和DFA的比较例例. 构造构造NFA,可识别,可识别0,1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论