系列文章目录
flex&bison系列第一章:flex Hello World
flex&bison系列第二章:写一个简单的单词统计工具Word Counter
flex&bison系列第三章:写一个简单的计算器Calculator
LLVM系列
本文目录
前言
一、Word Counter
二、编译
1. 生成C代码
2. 编译
三、运行
总结
前言
在此记录下基于flex写一个简单的单词统计工具(Word Counter)的过程,以备查阅。
开发环境的配置请参考第一章 《flex&bison系列第一章:flex Hello World》。
为简单起见,我们只统计英文单词和整数,比如“Abc”、“123”。我们可以用简单的正则表达式来识别英文单词和整数:
英文单词:[a-zA-Z]+
整数:[0-9]+
一、Word Counter
这个Word Counter程序要做的事很简单,具体如下:
当检测到英文单词时,把英文单词的总个数加1
当检测到整数时,把整数的总个数加1
否则,忽略不记
最终程序结束时,输出英文单词的总个数及整数的总个数
首先,我们要写一个简单的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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
我们的例子中,比较重要的是第二部分:
[a-zA-Z]+ { words++; }
[0-9]+ { numbers++; }
1
2
这两行代码分别统计了英文单词的总个数和整数的总个数。
二、编译
1. 生成C代码
运行如下命令即可生成C代码(示例):
flex word-counter.l
1
其生成的C代码文件名为“lex.yy.c”。
2. 编译
我们可以用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
1
2
3
4
5
6
7
8
以上命令会生成一个名为“word-counter”的可执行程序。
三、运行
可以用如下命令运行Word Counter程序(示例):
# Use Ctrl+D to stop input
./word-counter
1
2
接下来,程序会等待用户的输入。我们可以随意打一些英文单词和整数(注意用空格或回车键隔开),然后按Ctrl+D,可以看到如下输出(示例):
> Abc 123 xY 04
> y 345
> (Ctrl+D)
> words: 3, numbers: 3
1
2
3
4
当我们按Ctrl+D时,程序会输出英文单词和整数的总个数。
总结
我们基于flex,用C++写了一个简单的单词统计工具Word Counter,并且编译运行成功。完整源码示例请参看:
https://github.com/wuzhanglin/flex-bison-examples
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Zhanglin_Wu/article/details/126377501