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外的任意字符,输出错误信息,并退出程序。