编译原理

来源:互联网 发布: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模块中引用之。