1 // Copyright (c) 2001-2010 Hartmut Kaiser
2 // Copyright (c) 2010 Mathias Gaunard
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)
7 // #define BOOST_SPIRIT_LEXERTL_DEBUG 1
9 #include <boost/config/warning_disable.hpp>
10 #include <boost/detail/lightweight_test.hpp>
12 #include <boost/spirit/include/support_multi_pass.hpp>
13 #include <boost/spirit/include/classic_position_iterator.hpp>
14 #include <boost/spirit/include/lex_lexertl.hpp>
16 #include <boost/spirit/include/phoenix.hpp>
18 namespace spirit
= boost::spirit
;
19 namespace lex
= spirit::lex
;
20 namespace phoenix
= boost::phoenix
;
22 typedef spirit::classic::position_iterator2
<
23 spirit::multi_pass
<std::istreambuf_iterator
<char> >
27 make_file_iterator(std::istream
& input
, const std::string
& filename
)
30 spirit::make_default_multi_pass(
31 std::istreambuf_iterator
<char>(input
)),
32 spirit::multi_pass
<std::istreambuf_iterator
<char> >(),
38 identifier(file_iterator
, file_iterator
)
45 string_literal(file_iterator
, file_iterator
)
50 typedef lex::lexertl::token
<
51 file_iterator
, boost::mpl::vector
<identifier
, string_literal
>
55 : lex::lexer
<lex::lexertl::actor_lexer
<token_type
> >
58 : id("[a-zA-Z0-9]+", 1)
64 | lex::token_def
<>(".", 3) [
71 lex::_state
= "INITIAL"
73 | lex::token_def
<>(".", 4) [
74 lex::_state
= "INITIAL"
75 , lex::_pass
= lex::pass_flags::pass_fail
80 lex::token_def
<identifier
> id
;
81 lex::token_def
<string_literal
> st
;
84 typedef lexer::iterator_type token_iterator
;
91 file_iterator begin
= make_file_iterator(ss
, "SS");
95 token_iterator begin2
= l
.begin(begin
, end
, "ST");
96 token_iterator end2
= l
.end();
98 std::size_t test_data
[] = { 1, 3, 2 };
99 std::size_t const test_data_size
= sizeof(test_data
)/sizeof(test_data
[0]);
101 token_iterator it
= begin2
;
103 for (/**/; it
!= end2
&& i
< test_data_size
; ++it
, ++i
)
105 BOOST_TEST(it
->id() == test_data
[i
]);
107 BOOST_TEST(it
== end2
);
108 BOOST_TEST(i
== test_data_size
);
110 return boost::report_errors();