flex工具学习一

flex是一个生成词法分析器的工具,它可以利用正则表达式来生成匹配相应字符串的C语言代码。我们将用它写一个将输入字母大小写互转的例子。

关于flex, bsion工具,建议还是linux平台安装使用比较方便,我在windows下尝试过,太麻烦。

在ubuntu下安装很简单,只要执行下列语句即可:

sudo apt-get install flex bison
flex -h
bison -h

没有报错就说明安装成功。

创建encrypt.l:

%{
    #include <string.h>
    void encrpty(void);
%}
%%
[a-zA-Z]* {
    encrpty();
}
[ \t]
. {
    fprintf(stderr, "lexical error.\n");
    exit(1);
}
%%
void encrpty(void)
{
    int len = strlen(yytext);
    int i ;
    for(i = 0; i<len; ++i)
    {
        if((yytext[i]>='a')&&(yytext[i]<='z'))
        {
            yytext[i] = yytext[i] - ('a' - 'A');
        }
        else
        {
            yytext[i] = yytext[i] + ('a' - 'A');
        }
    }
    fprintf(yyout, "%s\n",yytext);    
}

 

编译:

flex encrypt.l
gcc -o encrypt lex.yy.c -lfl 

 

测试:

 ./encrypt
hello world
HELLO
WORLD

编译部分的-lfl选项是连接/user/lib/libfl.a库

flex将源文件*.l转换为lex.yy.c文件。源文件包含三部分:预定义区、规则区、附加C代码区。格式大致如下:

%{
定义区(可以包含头文件、声明struct、变量、函数等)
%}

%%
规则区(由正则表达式及其后的表达式处理部分组成) 
%%

附加C代码区

源文件中[a-zA-Z]*为一个正则表达式,{encrpty();}为对该正则表达式的处理。flex会将匹配到该正则表达式的字符串会存入yytext。[ \t]匹配任意数量的空白或tab字符,其后没有跟处理,故当程序匹配到空白或tab时不会做任何处理。.匹配除\n外的任意字符,输出错误信息,并退出程序。

 

posted @ 2016-07-11 15:28  traits  阅读(1719)  评论(0编辑  收藏  举报