本文参考龙书,分析了Flex生成词法分析器代码
首先给出一个可以运行的模板,修改其中
%%
转换规则
%%
的转换规则部分即可测试不同正则表达式生成代码并编译运行查看结果
一个可运行代码
%{
#include "stdio.h"
%}
%%
a { printf("match%s\n", yytext); }
%%
int yywrap()
{
return 1;
}
int main()
{
yylex();
}
说明
生成的代码lex.yy.c主要包括两部分内容:字符串缓存处理与自动机逻辑处理,学习词法分析主要关心自动机逻辑处理
Flex编译的时候如果加参数 -Cf,则编译结果代码中自动机转换函数是一个二维表yy_nxt[][128],否则,则为龙书3.9.8中的4个数组结构
生成代码中有些内容做些说明:
#line 3 "lex.yy.c" // 下一行表示lex.yy.c第3行
关于do...while(0)使用,可以参考一片转载的文章。
生成代码中有很多宏定义,比如YY_USER_ACTION 每次匹配成功执行的代码,详细信息Flex文档中有详细说明
例子说明自动机结构
如果不压缩转换表,以匹配正则表达式a为例,则得到:
共6个状态
yy_accept={0, 0, 0, 3, 2, 1);
yy