编译器的自动生成工具LEX的使用方法

上传人:hs****ma 文档编号:491728041 上传时间:2023-06-18 格式:DOCX 页数:10 大小:25.89KB
返回 下载 相关 举报
编译器的自动生成工具LEX的使用方法_第1页
第1页 / 共10页
编译器的自动生成工具LEX的使用方法_第2页
第2页 / 共10页
编译器的自动生成工具LEX的使用方法_第3页
第3页 / 共10页
编译器的自动生成工具LEX的使用方法_第4页
第4页 / 共10页
编译器的自动生成工具LEX的使用方法_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《编译器的自动生成工具LEX的使用方法》由会员分享,可在线阅读,更多相关《编译器的自动生成工具LEX的使用方法(10页珍藏版)》请在金锄头文库上搜索。

1、编译器的自动生成工具LEX和YACC的使用方法Lex 自动地表示把输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yylex,在这里yylex是一个C语言的程序。yylex将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。看一个简单的例子:写一个lex源程序,将输入串中的小写字母转换成相应的大定字母。 程序如下:%a-zprintf(“%c”.yytext0+A-a);上述程序中的第一行%是一个分界符,表示识别规则的开始。第二行就是识别规则。左 边是识别小写字母的正规式。右边就是识别出小写字母时采取的动作:将小写字母转换成相 应的大写字母

2、。Lex 的工作原理是将源程序中的正规式转换成相应的确定有限自动机,而相应的动作则 插入到 yylex 中适当的地方,控制流由该确定有限自动机的解释器掌握,不同的源程序,这 个解释器是相同的。12 lex 源程序的格式lex源程序的一般格式是:辅助定义的部分%识别规则部分%用户子程序部分其中用花括号起来的各部分都不是必须有的。当没有“用户子程序部分”时,第二个%也 可以省去。第一个%是必须的,因为它标志着识别规则部分的开始,最短的合法的lex源 程序是:%它的作用是将输入串照原样抄到输出文件中。识别规则部分是 Lex 源程序的核心。它是一张表,左边一列是正规式,右边一列是相应 的动作。下面是一

3、条典型的识别规则:integer printf(found keywcrd INT);这条规则的意思是在输入串中寻找词形 “integer”,每当与之匹配成功时,就打印出 “fOundkeyword INT这句话。注意在识别规则中,正规式与动作之间必须用空格分隔开。动作部分如果只是一个简单的 C 表达式,则可以写在正规式右边同一行中,如果动作需要占两行以上,则须用花括号 括起来,否则会出错。上倒也可以写成:integer printf(found keyword INT); 下面先介绍识别规则部分的写法,再介绍其余部分。1.3 Lex 用的正规式一个正规式表示一个字符串的集合。正规式由正文字符

4、与正规式运算符组成正文字符 组成基本的正规式,表示某一个符号串; 正规式运算符则将基本的正规式组合成为复杂的正规式,表示字符串的集合。例如:ab仅表示字符串ab,而(a b)+表示字符串的集合:ab, abab, ababab, )。Lex 中的正规式运算符有下列十六种:” A -? *+l () /$ %上述运算符需要作为正文字符出现在正规式中时,必须借助于双引号或反斜线,具体 用法是;xyz“+”或 xyz + +表示字符串 xyz+为避免死记上述十多个运算符,建议在使用非数字或字母字符时都用双引号或反斜线。 要表示双引号本身可用”,要表示反外线用”或前面说过,在识别规则中空格表示正规式的

5、结束,因此要在正规式中引进空格必须借助 双引号或反斜线,但出现在方括号之内的空格是例外。几个特殊符号: n 是回车换行( newline)t 是 tabb 是退格( back space) 下面按照运算符的功能分别介绍上述正规式运算符。1字符的集合用方括号对可以表示字符的集合。正规式a b c与单个字符a或b或c匹配在方括号中大多数的运算符都不起作用,只有-和A例外。 运算符-表示字符的范围,例如a-z 0-9 O-表示由所有小写字母,所有数字、尖括号及下划线组成的字符集合。 如果某字符集合中包括-在内,则必须把它写在第一个或最后一个位置上,如 -+0-9与所有数字和正负号匹配在字符集合中,运

6、算符人必须写在第一个位置即紧接在左方括号之后,它的作用是求方括号 中除人之外的字符组成的字符集合相对于计算机的字符集的补集,例如Aabc与除去a、b 和c以外的任何符号匹配。运算符在方括号中同样发挥解除运算符作用的功能。2与任意字符匹配的正规式运算符. 形成的正规式与除回车换行符以外的任意字符匹配。在 lex 的正规式中,也可以用八进制数字与一起表示字符,如 40- 176与ASCII字符集中所有在八进制40 (空格)到八进制176 ()之间的可打印字符匹配。3可有可无的表达式运算符?指出正规式中可有可无的子式,例如ab?c与ac或abc匹配,即b是可有可无的。4闭包运算运算符*和十是Lex正

7、规式中的闭包运算符,它们表示正规式中某子式的重复,例如”a* 表示由0个或多个a组成的字符串的集合,而a+表示由1个或多个a组成的字符串的集合, 下面两个正规式是常用的:a-z+A-Za-zA-Za-z 0-9*第一个是所有由小写字母组成的字符串的集合,第二个是由字母开头的字母数字串组成的集 合。5、选择和字符组运算符|表示选择:( ab|cd)与 ab 或 cd 匹配运算符()表示一组字符,注意()与的区别。(ab)表示字符串3而ab则表示单个 字符 a 或 b。圆括号()用于表示复杂的正规式,例如:( ab|cd+)?( ef) *与 abefef, efef, cdef, cddd 匹配

8、,但不与 abc, abcd 或 abcdef 匹配。6、上下文相关性lex 可以识别一定范围的上下文,因此可在一定程度上表示上下文相关性。若某正规式的第一个字符是人,则仅当该正规出现在一行的开始处时才被匹配,一行的 开始处是指整个输入串的开始或者紧接在一个回车换行之后,注意人还有另一个作用即求 补,人的这两种用法不可能发生矛盾。若某正规式的最后一个字符是$,则仅当该表达式出现在一行的结尾处时才被匹配,一行 的结尾处是指该表达式之后紧接一个回车换行。运算符/指出某正规式是否被匹配取决于它的后文,例如:ab/cd,仅在ab之后紧接cd的 情况下才与ab匹配。$其实是/的一个特殊情形,例如下面两个

9、正规式等价:ab$,ab/ n某正规式是否被匹配,或者匹配后执行什么样的动作也可能取决于该表达式的前文,前 文相关性的处理方法在后面专门讨论,将用到运算符7、重复和辅助定义当被括起来的是数字对时, 表示重复;当它括起来的是一个名字时,则表示辅助定 义的展开。例如:al, 5,表示集合a.aa.aaa.aaaa.aaaaa.digit则与预先定义的名叫dight 的串匹配,并将有定义插入到它在正规式中出现的位置上,辅助定义在后面专门讨论。最后,符号的作用是作为lex源程序的段间分隔符。l4 Lex 源程序中的动作前面说过当Lex识别出一个词形时,要完成相应的动作。这一节叙述Lex为描述动作提 供

10、的帮助。首先应指出,输入串中那些不与任何识别规则中的正规式匹配的字符串将被原样照望抄 到输出文件中去。因此如果用户不仅仅是希望照抄输出,就必须为每一个可能的词形提供识 别规则,并在其中提供相应的动作。用lex为工具写程序语言的词法分析器时尤其要注意。 最简单的一种动作是滤掉输入中的某些字符串,这种动作用C的空语句“;”来实现。 例:滤掉输入串中所有空格、tab和回车换行符,相应的识别规则如下: t n; 如果相邻的几条规则的动作都相同,则可以用|表示动作部分,它指出该规则的动作与下一 条规则的动作相同。例如上倒也可以写成:“ ”|“ t”|“ n”;注意t和n中的双引号可以去掉。外部字符数组y

11、ytext的内容是当前被某规则匹配的字符串,例如正规式a-z+与所有由小 写字母组成的字符串匹配,要想知道与它匹配的具体字符串是什么,可用下述规则: az printf(“ s”, yytext);动作printf (“s”,yytext)就是将字符数组yytext的内容打印出来,这个动作用得很频繁, Lex提供了 一个宏ECHO来表示它,因此上述识别规则可以写成:az+ ECHO; 请注意,上面说过缺省的动作就是将输入串原样抄到输出文件中,那么上述规则起什么作用 呢?这一点将在“规则的二义性”一节中解释。有时有必要知道被匹配的字符串中的字符个数,外部变量yyleng就表示当前yytext中字

12、 符的个数。例如要对输入串中单词的个数和字符的个数进行计数(单词假定是由大写或小写 字母组成的字符串),可用下述规则:a-zAZ+ words+; Chars+=yyleng;注意被匹配的字符串的第一个字符和最后一个字符分别是yytextO和 yytextyyleng-lyywrap ( )当Lex处理到输入串的文件尾时,自动地调用yywrap(),如果yywrap ()返回值是1, 那么Lex就认为对输入的处理完全结束,如果yywrap ()返回的值是O,Lex就认为有新的 输入串等待处理。Lex自动提供一个yywrap(),它总是返回1,如果用户希望有一个返回0的yywrap(), 那么就

13、可以在”用户子程序部分”自己写一个yywrap(),它将取代Lex自动提供的那个 yywrap(),在用户自己写的ywrap ()中,用户还可以作其他的一些希望在输入文件结束 处要作的动作,如打印表格、输出统计结果等,使用yywrap ()的例子在后面举出。1. 5识别规则的二义性有时 Lex 的程序中可能有多于一条规则与同一个字符串匹配,这就是规则的二义性,在 这种情况下,Lex有两个处理原则:1)能匹配最多字符的规则优先2)在能匹配相同数目的字符的规则中,先给出的规则优先 例:设有两规则按下面次序给出:integer kegword action.a_z+ identifier actio

14、n.如果输入是integers,则它将被当成标识符处理,因为规则integer只能匹配7个字符,而a-z+ 能匹配8个字符;如果输入串是integer,那么它将被当作关键字处理,因为两条规则都能与 之匹配,但规则integer先给出。1.6 lex 源程序中的辅助定义部分Lex 源程序的第一部分是辅助定义,到目前为止我们只涉及到怎样写第二部分,即识别 规则部分的写法,现在来看第一部分的写法。在 Lex 源程序中,用户为方便起见,需要一 些辅助定义,如用一个名字代表一个复杂的正规式。辅助定义必须在第一个之前结出, 并且必须从第一列开始写,辅助定义的语法是:name translation例如用名

15、字 IDENT 来代表标识符的正规式的辅助定义为IDENT a-zA-Za-zA-Z0-9*辅助定义在识别规则中的使用方式是用运算符 将name括起来,Lex自动地用translation 去替换它,例如上述标识符的辅助定义的使用为:IDENT action for identifbr.下面我们用辅助定义的手段来写一段识别FORTRAN语言中整数和实数的Lex源程序:D 0 一 9E DEde -+? D +D+ printf(“integer”);D+.D*(E)? |D*.D+(E)? |D+E printf( real );请注意在辅助定义部分中可以使用前面的辅助定义。例如:定义E时使用了D,但所用 的辅助定义必须是事先已定义过的,不能出现循环定义。上面的规则只是说明辅助定义的用 法,并不是识别FORTRA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号