词法分析工具flex

今日尝试了一下久仰大名的flex词法分析,发现确实很有意思,很多门语言,特别是一些动态解析的语言都需要借助这个词法分析生成特定的程序运行,我这里主要参考已经写好的例子来尝试一下flex的使用,首先在我们的CentOS环境下安装上这个软件。

[root@vm237148~]#yum install flex.x86_64

安装完成时候,我们就可以使用flex了,flex对于执行的lex源文件有严格的样式规范,词法规则文件一般以.l作为扩展名,flex文件由三个部分组成,三部分之间用%%分割:

定义段
%%
规则段
%%
用户代码段

我们此处用一个样例来统计文件中的字符数、字符的长度以及换行数,lex文件如下:

%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
 
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n  { chars++; lines++; }
.   { chars++; }
%%
 
main(int argc, char **argv)
{
    if(argc > 1) {
        if(!(yyin = fopen(argv[1], "r"))) {
            perror(argv[1]);
            return (1);
        }
        yylex();
        printf("%8d%8d%8d\n", lines, words, chars);
    }
}

现在使用flex来编译我们的lex文件,

flex test1.l

此时就可以看到编译出来一个c文件lex.yy.c

[root@vm237148~/test/flex]#ls -al
total 56
drwxr-xr-x 2 root root  4096 2014/12/04 13:22:52 .
drwxr-xr-x 5 root root  4096 2014/12/04 13:21:47 ..
-rw-r--r-- 1 root root 44209 2014/12/04 13:22:52 lex.yy.c
-rw-r--r-- 1 root root   403 2014/12/04 13:22:39 test1.l

这个文件大概长这样子:

1
2 #line 3 "lex.yy.c"
3
4 #define  YY_INT_ALIGNED short int
5
6 /* A lexical scanner generated by flex */
7
8 #define FLEX_SCANNER
9 #define YY_FLEX_MAJOR_VERSION 2
10 #define YY_FLEX_MINOR_VERSION 5
11 #define YY_FLEX_SUBMINOR_VERSION 37
12 #if YY_FLEX_SUBMINOR_VERSION > 0
13 #define FLEX_BETA
14 #endif
.....

此时编译这个c文件:

gcc -g lex.yy.c -o test1

编译成功,再测试一下,就用我们的lex文件测试吧,

[root@vm237148~/test/flex]#./test1 test1.l
      24      43     403

大功告成。

参考资料:

  1. 淘宝原单

    Massimo Dutti
    CAMEL(骆驼)
    其他
    GZ(朱塞佩萨诺第)
    Ann Demeulemeester(安●迪穆拉米斯特)
    Michael Kors(MK)
    Louis Vuitton(路易威登/LV)
    oh.yuandan.cf