1 编译器的自动生成工具LEX 和YACC 的使用方法 Lex 自动地表示把输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yyler,在这里yyler 是一个C 语言的程序。 Yylex 将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。 看一个简单的例子:写一个lex 源程序,将输入串中的小写字母转换成相应的大定字母。 程序如下: %% [a-z]printf(“%c”.yytext[0]+'A'-'a'); 上述程序中的第一行%%是一个分界符,表示识别规则的开始。第二行就是识别规则。左边是识别小写字母的正规式。右边就是识别出小写字母时采取的动作:将小写字母转换成相应的大写字母。 Lex 的工作原理是将源程序中的正规式转换成相应的确定有限自动机,而相应的动作则插入到 yylox 中适当的地方,控制流由该确定有限自动机的解释器掌握,不同的源程序,这个解释器是相同的。 1.2 lex 源程序的格式 lex 源程序的一般格式是: {辅助定义的部分} %% {识别规则部分} %% {用户子程序部分} 其中用花括号起来的各部分都不是必须有的。当没有“用户子程序部分”时,第二个%%也可以省去。第一个%%是必须的,因为它标志着识别规则部分的开始,最短的合法的lex 源程序是: %% 它的作用是将输入串照原样抄到输出文件中。 识别规则部分是Lex 源程序的核心。它是一张表,左边一列是正规式,右边一列是相应的动作。下面是一条典型的识别规则: integer printf("found keywcrd INT"); 这条规则的意思是在输入串中寻找词形“integer”,每当与之匹配成功时,就打印出“foundkeyword INT”这句话。 注意在识别规则中,正规式与动作之间必须用空格分隔开。动作部分如果只是一个简单的C 表达式,则可以写在正规式右边同一行中,如果动作需要占两行以上,则须用花括号 2 括起来,否则会出错。上倒也可以写成: integer {printf("found keyword INT");} 下面先介绍识别规则部分的写法,再介绍其余部分。 1.3 Lex 用的正规式 一个正规式表示一个字符串的集合。正规式由正文字符与正规式运算符组成.正文字符组成基本的正规式,表示某一个符号串; 正规式运算符则将基本的正规式组合成为复杂的正规式,表示字符串的集合。 例如: ab 仅表示字符串ab,而 (a b)+ 表示字符串的集合: {ab,abab,ababab,…)。 Lex 中的正规式运算符有下列十六种: ” [ ]∧ -?"*+| ()...