1// Copyright (c) 2001-2010 Hartmut Kaiser
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6#include <boost/spirit/include/lex_lexertl.hpp>
7
8#include <boost/spirit/include/qi_parse.hpp>
9#include <boost/spirit/include/qi_operator.hpp>
10#include <boost/spirit/include/qi_action.hpp>
11#include <boost/spirit/include/qi_grammar.hpp>
12
13#include <boost/core/lightweight_test.hpp>
14#include <boost/phoenix/operator.hpp>
15
16#include <iostream>
17#include <string>
18
19namespace qi = boost::spirit::qi;
20namespace lex = boost::spirit::lex;
21
22enum tokenids
23{
24 IDWORD = lex::min_token_id,
25 IDCHAR,
26 IDANY
27};
28
29template <typename Lexer>
30struct word_count_tokens : lex::lexer<Lexer>
31{
32 word_count_tokens()
33 {
34 this->self.add_pattern
35 ("TEST", "A")
36 ;
37
38 this->self =
39 lex::string("{TEST}", IDWORD)
40 | lex::char_('a', IDCHAR)
41 | lex::string(".", IDANY)
42 ;
43 }
44};
45
46template <typename Iterator>
47struct word_count_grammar : qi::grammar<Iterator>
48{
49 template <typename TokenDef>
50 word_count_grammar(TokenDef const&)
51 : word_count_grammar::base_type(start)
52 , w(0), c(0), a(0)
53 {
54 using boost::phoenix::ref;
55 using qi::token;
56
57 start = *( token(IDWORD) [++ref(w)]
58 | token(IDCHAR) [++ref(c)]
59 | token(IDANY) [++ref(a)]
60 )
61 ;
62 }
63 std::size_t w, c, a;
64 qi::rule<Iterator> start;
65};
66
67
68int main()
69{
70 typedef lex::lexertl::token<
71 const char*, boost::mpl::vector<std::string>
72 > token_type;
73
74 typedef lex::lexertl::lexer<token_type> lexer_type;
75 typedef word_count_tokens<lexer_type>::iterator_type iterator_type;
76 word_count_tokens<lexer_type> word_count; // Our lexer
77 word_count_grammar<iterator_type> g (word_count); // Our parser
78
79 std::string str ("AaBCD");
80 char const* first = str.c_str();
81 char const* last = &first[str.size()];
82
83 BOOST_TEST(lex::tokenize_and_parse(first, last, word_count, g));
84 BOOST_TEST(g.w == 1 && g.c == 1 && g.a == 3);
85
86 return boost::report_errors();
87}
88

source code of boost/libs/spirit/test/lex/string_token_id.cpp