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