不了解Flex的同学,可以先温习一下上一节的内容Flex和Bison背景介绍
字数统计实例介绍
我们先通过一个例子来给大家介绍Flex的语法规则,这个例子的主要作用是统计我们输入内容的行数,单词数和字符数,代码示例如下:
%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
/*
1. 变量yytext总是被设为指向本次匹配的输入文本
2. . 在正则表达式中代表任意一个字符
**/
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { chars++; lines++;}
. { chars++;}
%%
int main(int argc, char **argv)
{
yylex();
printf("%8d%8d%8d\n", lines, words, chars);
}
整个程序结构包含三个部分,各部分通过%%
来分割。
第一部分主要包含声明和选项设置。在声明部分%{
和%}
之间的代码会直接拷贝到C
文件的开头部分,示例代码中主要是声明了三个整形变量,用来分别统计字符数,单词数和行数。
第二部分主要包含匹配模式和相应的动作。在示例代码中第一条正则表达式[a-zA-Z]+
主要用来匹配一个单词,当成功匹配到单词后,会将变量word
加1
,同时将字符数加上单词的长度(strlen
是C
语言中获取字符串长度的库函数),第二条\n
匹配换行符,当成功匹配后,行数加1
,字符数也加1
,最后一条.
匹配的是除换行符 \n
之外的任何单字符,匹配成功以后字符数加1
。
第三部分则是直接拷贝到词法分析器中的C
代码。在示例代码中会将主函数拷贝到生成的C
文件中,当运行程序时,会首先调用main
函数,在其内部负责调用Flex
的yylex
函数开始词法分析,并打印出分析之后的结果,包括行数,单词数,字符数。
编译和运行示例代码
在Mac平台下编译示例如下:
% flex fb1_1.l
% gcc lex.yy.c -o fb1 -lm
如果是Window
或者Linux
下编译,链接选项更改为-lfl
,当第一行命令执行完以后当前文件夹下应该会生成一个lex.yy.c
文件,有兴趣的同学可以对照着上面的示例代码比对一下,看一看Flex
是如何处理我们的示例代码的。当第二行命令执行完以后,当前文件夹下应该会生成一个fb1
可执行文件,然后执行当前文件,输入测试代码,按Control+D
后会显示出统计的行数,单词数和字符数
% ./fb1
Hello World
1 2 12
通过上面的示例代码,大家应该可以深刻的体会到,要想编写好Flex程序,首先要熟悉正则表达式。
本节的内容就先到这里,谢谢大家~