编译原理实践10—词法分析程序的自动生成器LEX.pptVIP

编译原理实践10—词法分析程序的自动生成器LEX.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理实践10—词法分析程序的自动生成器LEX

编译原理实践 --词法分析程序的自动生成器LEX 由于各种高级程序设计语言的单词形式基本上可以用一组正规式来描述,人们就希望能否构造一个自动生成系统,只要给出程序设计语言的各类单词描述以及识别出各类单词后应输出的结果,这种自动系统便能自动产生此程序设计语言的词法分析程序 Lex就是这样一个工具,他将正规式转换为一个NFA,进而转换为相应的DFA,这个DFA可以识别该正规式所表示的语言的句子 LEX简单的介绍 1 LEX(lexical ananlyzer generator) 一个词法分析程序的自动生成器. LEX是1972年贝尔实验室首先在 UNIX上实现的. 2 FLEX(fast lexical ananlyzer generator) 是对LEX的扩充,它可在MS-DOS下运行. 我们这里实际使用的是FLEX,但仍称呼为LEX. LEX简单的介绍 LEX能根据给定的正则表达式自动生成相应的词法分析程序 输入:是用LEX 语言写的源程序 生成:用C语言描述的词法分析程序 LEX生成的目标程序包含一个状态转换矩阵和一个控制执行程序. LEX使用流程 使用LEX的流程如图: LEX源程序 LEX YYLEX.C YYLEX.C C编译器 YYLEX.EXE YYLEX.EXE 字符串源程序 符号串源程序 LEX源程序是使用LEX语言编写的词法规则说明,经过LEX翻译后形成目标文件YYLEX.C;再用C编译器对YYLEX.C进行翻译,生成目标程序YYLEX.EXE,它就是词法分析程序,用YYLEX.EXE就可以将字符串源程序转换成符号串源程序. 用LEX语言表达正则表达式 LEX的输入是LEX源程序. 首先介绍如何表示正则表达式. LEX表示正则表达式时采用一些元字符* + ( ) \ [ ] | { } “ “等,表示方法如下. (1)对于单个的字母a,就直接表示成a,如a,+,-等 . (2)[abc]表示字符a,b,或c中的任一个,如[01] 表示0或1 (3)[a-d]表示字符a,b,c或d中的任一个. (4)[^ab]表示除了a或b外的任一个字符. 用LEX语言表达正则表达式 (5). 表示除了换行符之外的任一个字符. (6)”text”表示双引号里的每个字符(包括元字符)都按字符处理,如”ab[01]”就是表示ab[01]是字符串,其中的[和]不是元字符 (7) \ 转义字符 (8){xxx}名字xxx表示的正则表达式。 (9)r|s表示正则表达式r或正则表达式s。 (10)rs表示正则表达式r与正则表达式s的连接。 用LEX语言表达正则表达式 (11)(r)表示()内的优先级高于括号外。 (12)r*表示正则表达式r可重复零次或多次。 (13)r+表示正则表达式r可重复一次或多次。 (14)r?表示r是一个可选的正则表达式。 (15)r{m,n}其中m,n是正整数,表达正则表达式r的 m~n次重复。 (16)r{m}表示正则表达式r的m次重复。 (17)r{m,}表示正则表达式r的m到多次的重复。 (18)^行的开始,$行的结尾 用LEX语言表达正则表达式 例: 1)二进制数 (0|1)* 2)以aa或bb开头的由a和b任意组成的字符串 (aa|bb)(a|b)*或(aa|bb)[ab]* 3) 任何一个从0~9的数字: [0-9] 4)长度不超过8的小写字符串 [a-z]{1,8} 用LEX语言表达正则表达式 5) 无符号整数 [0-9]+ 6)可带小数点的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)? 7) 可带指数的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)?(E(“+”|”-”)?[0-9]+)? 8)标识符:字母或_开头,后跟字母数字、下划线等字符 [a-zA-Z_]([a-zA-Z_]|[0-9])* 9)空白区 [ \t\n]+ 元字符约定 元字符约定:可以为正则表达式起名,这些名字也可使用在其他的正则表达式中,需正则表达式放在大括号中。 例如,无符号整数定义为:num=[0-9]+ 其中,num为正则表达式名。 在有符号的整数的定义中,可以引用正则表达式名num: signedNum=(+|-)?{num} 注意:在定义正则表达式名时并不写大括号,只有在使用正则表达式名时才加上大括号。 用LEX语言表达正则表达式 在方括号(表示字符类)中,大多数的元字符都丧失了其特殊状况,且不必用引号括起来。甚至如果可以首先将连字符(-)列出来的话,则也可以将其看作字符。因此,可将正则表达式(“+”|”-”)写作[-+]

文档评论(0)

dajuhyy + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档