编译器的自动生成工具LEX和YACC的使用方法.docVIP

编译器的自动生成工具LEX和YACC的使用方法.doc

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

编译器的自动生成工具LEX和YACC的使用方法LEX的用法1.1 Lex概述Lex是一个词法分析器(扫描器)的自动产生系统,它的示意图如图1.1。Lex源程序是用一种面向问题的语言写成的。这个语言的核心是正规表达式,Lex并不是一个完整的语言,它只是某种高级语言lex的宿主语言)的扩充,因此lex没有为描述动作设计新的语言,而是借助其宿C作为lex的宿主语言时的使用方法,在Unix系统中, FORTRAN语言的一种改进形式Ratfor也可以做lex的宿主语言。 图1.1 Lex示意图? Lex自动地表示把输入串词法结构的正规式及相应的动作转换成一个宿主语言的yylex,在这里yylex是一个C语言的程序。ylex将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。lex源程序,将输入串中的小写字母转换成相应的大%% [a-z] printf(“%c”,yytext[0]+A-a);%%是一个分界符,表示识别规则的开始。第二行就是识别:将小写Lex的工作原理是将源程序中的正规式转换成相应的确定有限自动机,而相应的动作yylex中适当的地方,控制流由该确定有限自动机的解释器掌握,对于不同的源1.2 lex源程序的格式lex源程序的一般格式是:{辅助定义的部分} %% ???? {识别规则部分}%% ???? {用户子程序部分}%%也可以省去。第一个%%是必须的,因为它标志着识别规则部分的开始,最短的合法的lex源程序是:%% ??它的作用是将输入串照原样抄到输出文件中。??识别规则部分是Lex源程序的核心。它是一张表,左边一列是正规式,右边一列是相integer printf(found keywcrd INT);integer”,每当与之匹配成功时,就打印出found keyword INT”这句话。C表达式,则可以写在正规式右边同一行中,如果动作需要占两行以上,则须用花integer {printf(found keyword INT);}1.3 Lex用的正规式ab 仅表示字符串ab,而a b)+ 表示字符串的集合:{ab,abab,ababab,…。Lex中的正规式运算符有下列十六种: “ \ [ ] ^ - ? ?* + | () /$ { } % 上述运算符需要作为正文字符出现在正规式中时,必须借助于双引号”或反斜线\,具体用法是; xyz“++”或xyz\+\+xyz++ 为避免死记上述十多个运算符,建议在使用非数字或字母字符时都用双引号或反斜线。要表示双引号本身可用\”,要表示反外线用”\”或\\ 前面说过,在识别规则中空格表示正规式的结束,因此要在正规式中引进空格必须借助双引号或反斜线,但出现在方括号[]之内的空格是例外。n是回车换行(newline)t是tab\b是退格(back space)字符的集合[a b c] 与单个字符a或b或c匹配- 和例外。表示字符的范围,例如a-z 0-9 <>_ ] 表示由所有小写字母,所有数字、尖括号及下划线组成的字符集合。如果某字符集合中包括-在内,则必须把它写在第一个或最后一个位置上,如[-+0-9] 与所有数字和正负号匹配。 在字符集合中,运算符^必须写在第一个位置即紧接在左方括号之后,它的作用是求方括号中除^之外的字符组成的字符集合相对于计算机的字符集的补集,例如 [^abc] 与除去a、b和c以外的任何符号匹配。与任意字符匹配的正规式运算符?lex的正规式中,也[\40-\176]ASCII字符集中所有在八进制 40(空格)到八进制176(~)之间的可打印字符匹配。可有可无的表达式ab?c 与ac或abc匹配,即b是可有可无的。闭包运算*和十是 Lex正规式中的闭包运算符,它们表示正规式中某子式的重复,a* 表示由0个或多个a组成的字符串的集合,而a+ 表示由1个或多个a组成的字符串的集合,下面两个正规式是常用的:[a-z]+ [A-Za-z][A-Za-z 0-9]* 第一个是所有由小写字母组成的字符串的集合,第二个是由字母开头的字母数字串组成的集合。 5、选择和字符组|表示选择:ab|cd)ab或cd匹配[ ]的区别。(ab)表示字符串ab,而[ab]则a或b。圆括号()用于表示复杂的正规式,例如:ab|cd+)?(ef)*abefef, efef, cdef, cddd匹配,但不与abc, abcd或abcdef匹配。6、上下文相关性lex可以识别一定范围的上下文,因此可在一定程度上表示上下文相关性。$,则仅当该表达式出现在一行的结尾处时才被匹配,/指出某正规式是否被匹配取ab/cd 仅在ab之后紧接cd的情况下才与ab匹配。$其实是/的一个特殊情形,例如下面两个正规式等价:ab$,ab/\ n ?某正规式是否被匹配,或者

文档评论(0)

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

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

1亿VIP精品文档

相关文档