lex/flex 学习笔记 一
lex/flex,词法分析器,在文本中查找特定模式的字符串,并触发相应的操作,lex内部使用状态机实现,速度比手写的词法分析更快。
环境:Ubuntu14
安装编程环境:
$ apt-get install build-essential g++ xorg-dev libx11-dev libgtk2.0-dev
安装flex和bison:
$ sudo apt-get install flex bison
第一个lex文件 a.l :
1 %{
2 int num_lines = 0, num_chars = 0;
3 %}
4 %%
5 \n ++num_lines; ++num_chars;
6 . ++num_chars;
7
8 %%
9 main()
10 {
11 yylex();
12 printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars );
13 }
编译运行:
通过lex命令将a.l编译成词法解析程序的源代码,缺省文件名是lex.yy.c。
$ lex a.l
$ gcc lex.yy.c // 有错误,提示缺少yywrap()函数
$ gcc lex.yy.c -ll // 直接链接lex的llib.a,也可以自己在a.l中写一个空函数
$ ./a.out < a.l
# of lines = 13, # of chars = 200
Lex文件的基本语法,一共三个段,中间用两个“%%”隔开:
定义段
%%
规则段
%%
用户代码段
定义段基本语法(不能有缩进):
DIGIT [0-9]
ID [a-z][a-z0-9]*
定义段的: /*注释内容*/ 也会被复制到输出“.c”文件中。
规则段基本语法:
pattern action
规则中也可以通过/**/加注释,但不会被复制到输出".c"文件中。
用户代码段:
原样复制到输出的“.c”文件中
补充:
在定义和规则段,任何缩进的文本,或者是放在“%{”和“%}”之间的内容会被原封不动的复制到输出".c"文件中。
%{
这里的内容会被原封不动复制到输出“.c”文件中, 可以放在定义和规则的段里, “%{” “%}”一定不能有缩进。
%}