flex&bison系列第二章:写一个简单的单词统计工具Word Counter

系列文章目录

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”。我们可以用简单的正则表达式来识别英文单词和整数:

  1. 英文单词:[a-zA-Z]+
  2. 整数:[0-9]+

一、Word Counter

这个Word Counter程序要做的事很简单,具体如下:

  1. 当检测到英文单词时,把英文单词的总个数加1
  2. 当检测到整数时,把整数的总个数加1
  3. 否则,忽略不记
  4. 最终程序结束时,输出英文单词的总个数及整数的总个数

首先,我们要写一个简单的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++; }

这两行代码分别统计了英文单词的总个数和整数的总个数。

二、编译

1. 生成C代码

运行如下命令即可生成C代码(示例):

flex word-counter.l

其生成的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

以上命令会生成一个名为“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

你可能感兴趣的:(编译器,编译器,flex)