• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%{
2//  Copyright (c) 2001-2009 Hartmut Kaiser
3//
4//  Distributed under the Boost Software License, Version 1.0. (See accompanying
5//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#include <boost/timer.hpp>
8#if defined(_WIN32)
9    #include <io.h>
10#endif
11    #define ID_WORD 1000
12    #define ID_EOL  1001
13    #define ID_CHAR 1002
14%}
15
16%%
17[^ \t\n]+  { return ID_WORD; }
18\n         { return ID_EOL; }
19.          { return ID_CHAR; }
20%%
21
22bool count(int tok, int* c, int* w, int* l)
23{
24    switch (tok) {
25    case ID_WORD: ++*w; *c += yyleng; break;
26    case ID_EOL:  ++*l; ++*c; break;
27    case ID_CHAR: ++*c; break;
28    default:
29        return false;
30    }
31    return true;
32}
33
34int main(int argc, char* argv[])
35{
36    int tok = EOF;
37    int c = 0, w = 0, l = 0;
38    yyin = fopen(1 == argc ? "word_count.input" : argv[1], "r");
39    if (NULL == yyin) {
40        fprintf(stderr, "Couldn't open input file!\n");
41        exit(-1);
42    }
43
44    boost::timer tim;
45    do {
46        tok = yylex();
47        if (!count(tok, &c, &w, &l))
48            break;
49    } while (EOF != tok);
50    printf("lines: %d, words: %d, characters: %d\n", l, w, c);
51    fclose(yyin);
52    return 0;
53}
54
55extern "C" int yywrap()
56{
57    return 1;
58}
59
60