12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- // Copyright (c) 2001-2011 Hartmut Kaiser
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/spirit/include/lex_lexertl.hpp>
- #include <string>
- #include "test.hpp"
- ///////////////////////////////////////////////////////////////////////////////
- // a simple lexer class
- template <typename Lexer>
- struct lexertl_test
- : boost::spirit::lex::lexer<Lexer>
- {
- typedef boost::spirit::lex::token_def<std::string> token_def;
- static std::size_t const CCOMMENT = 1;
- static std::size_t const CPPCOMMENT = 2;
- lexertl_test()
- : c_comment("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT)
- , cpp_comment("\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT)
- {
- this->self = c_comment;
- this->self += cpp_comment;
- }
- token_def c_comment, cpp_comment;
- };
- template <typename Lexer>
- struct wlexertl_test
- : boost::spirit::lex::lexer<Lexer>
- {
- typedef boost::spirit::lex::token_def<std::basic_string<wchar_t>, wchar_t>
- token_def;
- static std::size_t const CCOMMENT = 1;
- static std::size_t const CPPCOMMENT = 2;
- wlexertl_test()
- : c_comment(L"\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", CCOMMENT)
- , cpp_comment(L"\\/\\/[^\\n\\r]*(\\n|\\r|\\r\\n)", CPPCOMMENT)
- {
- this->self = c_comment;
- this->self += cpp_comment;
- }
- token_def c_comment, cpp_comment;
- };
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- using namespace boost::spirit;
- using namespace spirit_test;
- // the following test aims at the low level lexer_ and token_ objects,
- // normally not visible/used by the user
- {
- // initialize lexer
- typedef std::string::iterator base_iterator_type;
- typedef lex::lexertl::token<base_iterator_type> token_type;
- typedef lex::lexertl::lexer<token_type> lexer_type;
- typedef lexertl_test<lexer_type> lexer_def;
- // test lexer for two different input strings
- lexer_def lex;
- BOOST_TEST(test (lex, "/* this is a comment */", lexer_def::CCOMMENT));
- BOOST_TEST(test (lex, "// this is a comment as well\n", lexer_def::CPPCOMMENT));
- }
- {
- // initialize lexer
- typedef std::basic_string<wchar_t>::iterator base_iterator_type;
- typedef lex::lexertl::token<base_iterator_type> token_type;
- typedef lex::lexertl::lexer<token_type> lexer_type;
- typedef wlexertl_test<lexer_type> lexer_def;
- // test lexer for two different input strings
- lexer_def lex;
- BOOST_TEST(test (lex, L"/* this is a comment */", lexer_def::CCOMMENT));
- BOOST_TEST(test (lex, L"// this is a comment as well\n", lexer_def::CPPCOMMENT));
- }
- return boost::report_errors();
- }
|