Flex扫描器的使用与特性详解
1. 文字块的复制规则
在生成C源文件时,每个文字块的内容会逐字复制到其中。定义部分的文字块会在yylex()函数开始前复制,通常包含规则部分代码使用的变量和函数声明,以及头文件的#include行。
如果文字块以%top{开头而非%{,它会被复制到生成程序的开头附近,常用于设置YY_BUF_SIZE的#include文件或#define行。规则部分开头的文字块会在yylex()函数中局部变量声明之后复制,可包含更多声明和设置代码。规则部分其他位置的文字块会复制到yylex()的未指定位置,因此应只包含注释。
2. 一个程序中的多个词法分析器
在同一个程序中,可能需要处理两种部分或完全不同的词法语法的词法分析器。例如,交互式调试解释器可能为编程语言使用一个词法分析器,为调试器命令使用另一个。处理一个程序中的两个词法分析器有两种基本方法:
2.1 组合词法分析器
可以通过使用起始状态将两个词法分析器组合成一个。每个词法分析器的所有模式都以一组唯一的起始状态为前缀。词法分析器启动时,需要一些代码将其置于正在使用的特定词法分析器的适当初始状态,示例代码如下:
%s INITA INITB INITC %% %{