系列文章目录
flex&bison系列第一章:flex Hello World
flex&bison系列第二章:写一个简单的单词统计工具Word Counter
在此记录下基于flex写一个简单的单词统计工具(Word Counter)的过程,以备查阅。
开发环境的配置请参考第一章 《flex&bison系列第一章:flex Hello World》。
为简单起见,我们只统计英文单词和整数,比如“Abc”、“123”。我们可以用简单的正则表达式来识别英文单词和整数:
[a-zA-Z]+
[0-9]+
这个Word Counter程序要做的事很简单,具体如下:
首先,我们要写一个简单的flex脚本文件(示例):
/*
* word-counter.l
*/
%option noyywrap
%{
int words = 0;
int numbers = 0;
%}
%%
[a-zA-Z]+ { words++; }
[0-9]+ { numbers++; }
%%
int main(int argc, char **argv)
{
yylex();
printf("words: %d, numbers: %d\n", words, numbers);
return 0;
}
我们的例子中,比较重要的是第二部分:
[a-zA-Z]+ { words++; }
[0-9]+ { numbers++; }
这两行代码分别统计了英文单词的总个数和整数的总个数。
运行如下命令即可生成C代码(示例):
flex word-counter.l
其生成的C代码文件名为“lex.yy.c”。
我们可以用clang对以上生成的C代码进行编译(示例):
# Set up C++ standard library and header path for clang
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
# Build with clang
clang lex.yy.c -o word-counter
# Or, build with gcc
gcc lex.yy.c -o word-counter
以上命令会生成一个名为“word-counter”的可执行程序。
可以用如下命令运行Word Counter程序(示例):
# Use Ctrl+D to stop input
./word-counter
接下来,程序会等待用户的输入。我们可以随意打一些英文单词和整数(注意用空格或回车键隔开),然后按Ctrl+D,可以看到如下输出(示例):
> Abc 123 xY 04
> y 345
> (Ctrl+D)
> words: 3, numbers: 3
当我们按Ctrl+D时,程序会输出英文单词和整数的总个数。
我们基于flex,用C++写了一个简单的单词统计工具Word Counter,并且编译运行成功。完整源码示例请参看:
https://github.com/wuzhanglin/flex-bison-examples