编译原理
来源:互联网 发布:gartner 人工智能曲线 编辑:程序博客网 时间:2024/03/28 19:51
用户附加C语言部份
LEX对此部份不作任何处理,仅仅将之直接拷贝到输出文件lex.yy.c的尾部。在些部份,可定义对模式进行处理的C语言函数、主函数和yylex要调用的函数yywrap()等。如果用户在其它C模块中提供这些函数,用户代码部份可以省略。
源文件格式小结
综上所述,LEX源文件详细格式如下:
%{
/*此模块为定义模块中C语言代码部份,在下面填入相应C代码*/
}%
模式宏名1 模式1
模式宏名2 模式2
……
%start s1 s2 s3
%%
%{
/*此模块为规则模块中C语言代码部份,在下面填入相应C代码*/
}%
模式1 动作1
模式2 动作2
……
%%
/*此模块为用户附加C语言部份,在下面填入相应C代码*/
注意:以上三部份及其中任何一子部份,均可省去。且如无第三部分,第二个%%也可省去,但第一个%%决不可省。
LEX的工作原理
LEX通过对源文件的扫描,经过宏替换后,将规则部份的正规表达式转换成与之相应的DFA,并由之产生一个名为int yylex()的词法分析函数,将之拷贝到输出文件lex.yy.c中。由于考虑到C代码的可移植性和运行效率问题,lex.yy.c中大量使用了宏定义,且文件较大(30-50kb)。因此,几乎是不可读的。但是,其可移植性相当好。
lex.yy.c中定义了很多用户可定义的全局变量,以及在LEX源文件的动作中可调用的函数和宏。但是,由于lex.yy.c太过复杂,建议初学者不要随意修改它。用户在了解其的前提下,可在其它C模块中引用之。