B.1 LEX概述
LEX源程序是用一种面向问题的语言写成的?这个语言的核心是正规表达式(正规式),用它描述输入串的词法结构。在这个语言中用户还可以描述当某一个词形被识别出来时要完成的动作,例如在高级语言的词法分析器中,当识 别出一个关键字时,它应该向语法分析器返回该关键字的内部编码。LEX并不是一个完整的语言,它只是某种高级语言(称为LEX的宿主语言)的扩充,因此LEX没有为描述动作设计新的语言,而是借助其宿主语言来描述动作。我们只介绍C作为LEX的宿主语言时的使用方法,在UNIX系统中,FORTRAN语言的一种改进形式RATFOR也可以做LEX的宿主语言。 LEX自动地把表示输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yylex,在这里yylex是一个C语言的程序。 yylex将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。 看一个简单的例子:写一个LEX源程序,将输入串中的小写字母转换成相应的大写字母。 程序如下: %% [a-z] Printf("%c",yytext[0]+′A′-′a′); 上述程序中的第一行%%是一个分界符,表示识别规则的开始?第二行就是识别规则。左边是识别小写字母的正规式,右边就是识别出小写字母时采取的动作,将小写字母转换成相应的大写字母。 LEX的工作原理是将源程序中的正规式转换成相应的确定有限自动机,而相应的动作则插入到yylex中适当的地方,控制流由该确定有限自动机的解释器掌握,对不同的源程序这个解释器是相同的?关于LEX工作原理的详细介绍请参阅本书第4章。 |