欢迎来到天天文库
浏览记录
ID:9801936
大小:138.50 KB
页数:32页
时间:2018-05-10
《附录编译器的自动生成工具lex和yacc的使用方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、附录 编译器的自动生成工具LEX和YACC的使用方法一、词法分析程序产生器LEX的用法1.1Lex概述 程序设计语言从机器语言发展到今天的象pascal,C等这样的高级语言,使人们可以摆脱与机器有关的细节进行程序设计。但是用高级语言写程序时程序员必须在程序中详尽地告诉计算机系统怎样去解决某个问题,这在某种程度上说也是一件很复杂的工作。 人们希望有新的语言——非常高级的语言,用这种语言程序员仅仅需要告诉计算机系统要解决什么问题,计算机系统能自动地从这个问题的描述去寻求解决问题的途径,或者说将这个问题的描述自
2、动地转换成用某种高级语言如C、FORTRAN表示的程序。这个程序就可以解决给定的问题,这种希望虽然还没有能够完全变成现实,但是在某些具体的问题领域里已经部分地实现了。 这里要介绍的Lex和下章要介绍的Yacc就是在编译程序设计这个领域里的两种非常高级的语言。用它们可以很方便的描述词法分析器和语法分析器,并自动产生出相应的高级语言(C)的程序。 Lex是一个词法分析器(扫描器)的自动产生系统,它的示意图如图1.1。 Lex源程序是用一种面向问题的语言写成的。这个语言的核心是正规表达式(正规式),用它描述
3、输入串的词法结构。在这个语言中用户还可以描述当某一个词形被识别出来时要完成的动作,例如在高级语言的词法分析器中,当识别出一个关键字时,它应该向语法分析器返回该关键字的内部编码。Lex并不是一个完整的语言,它只是某种高级语言(称为lex的宿主语言)的扩充,因此lex没有为描述动作设计新的语言,而是借助其宿主语言来描述动作。我们只介绍C作为lex的宿主语言时的使用方法,在Unix系统中,FORTRAN语言的一种改进形式Ratfor也可以做lex的宿主语言。 图1.1Lex示意图 Lex自动地表示把输入串词法结构
4、的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yyler,在这里yyler是一个C语言的程序。 Yylex将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。 看一个简单的例子:写一个lex源程序,将输入串中的小写字母转换成相应的大定字母。 程序如下: %% [a-z]printf(“%c”.yytext[0]+'A'-'a'); 上述程序中的第一行%%是一个分界符,表示识别规则的开始。第二行就是识别规则。左边是识别小写字母的正规式。右边就是识别出
5、小写字母时采取的动作:将小写字母转换成相应的大写字母。 Lex的工作原理是将源程序中的正规式转换成相应的确定有限自动机,而相应的动作则插入到yylox中适当的地方,控制流由该确定有限自动机的解释器掌握,不同的源程序,这个解释器是相同的。关于lex工作原理的详细情况请参考[3],这里不多介绍。1.2lex源程序的格式 lex源程序的一般格式是: {辅助定义的部分} %% {识别规则部分} %% {用户子程序部分} 其中用花括号起来的各部分都不是必须有的。当没有“用户子程序部分”时,第
6、二个%%也可以省去。第一个%%是必须的,因为它标志着识别规则部分的开始,最短的合法的lex源程序是: %% 它的作用是将输入串照原样抄到输出文件中。 识别规则都分是Lex源程序的核心。它是一张表,左边一列是正规式,右边一列是相应的动作。下面是一条典型的识别规则: integerprintf("foundkeywcrdINT"); 这条规则的意思是在输入串中寻找词形“integer”,每当与之匹配成功时,就打印出“foundkeywordINT”这句话。 注意在识别规则中,正规式与动作之间必
7、须用空格分隔开。动作部分如果只是一个简单的C表达式,则可以写在正规式右边同一行中,如果动作需要占两行以上,则须用花括号括起来,否则会出错。上倒也可以写成: integer{printf("foundkeywordINT");} 下面先介绍识别规则部分的写法,再介绍其余部分。1.3Lex用的正规式 一个正规式表示一个字符串的集合。正规式由正文字符与正规式运算符组成.正文字符组成基本的正规式,表示某一个符号串;正规式运算符则将基本的正规式组合成为复杂的正规式,表示字符串的集合。 例如:
8、 ab 仅表示字符串ab,而 (ab)+ 表示字符串的集合: {ab,abab,ababab,…)。 Lex中的正规式运算符有下列十六种: ”[]∧-?•*+
9、()/${}%<> 上述运算符需要作为正文字符出现在正规式中时,必须借助于双引号”或反斜线\,具体用法是; xyz“
此文档下载收益归作者所有