diff options
Diffstat (limited to 'src/boost/libs/spirit/test/lex/plain_token.cpp')
-rw-r--r-- | src/boost/libs/spirit/test/lex/plain_token.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/test/lex/plain_token.cpp b/src/boost/libs/spirit/test/lex/plain_token.cpp new file mode 100644 index 00000000..4ca79b83 --- /dev/null +++ b/src/boost/libs/spirit/test/lex/plain_token.cpp @@ -0,0 +1,91 @@ +// Copyright (c) 2001-2010 Hartmut Kaiser +// Copyright (c) 2016 Jeffrey E. Trull +// 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/config/warning_disable.hpp> + +#include <boost/spirit/include/lex_lexertl.hpp> +#include <boost/spirit/include/qi_parse.hpp> +#include <boost/spirit/include/qi_operator.hpp> + +#include <string> + +namespace qi = boost::spirit::qi; +namespace lex = boost::spirit::lex; + +enum tokenids +{ + // left tokens + IDLPAREN = lex::min_token_id, + IDLANGLE, + IDLBRACE, + IDLSQUARE, + // right tokens + IDRPAREN, + IDRANGLE, + IDRBRACE, + IDRSQUARE, + IDANY +}; + +template <typename Lexer> +struct delimiter_tokens : lex::lexer<Lexer> +{ + delimiter_tokens() + { + this->self = + lex::char_('(', IDLPAREN) + | lex::char_(')', IDRPAREN) + | lex::char_('<', IDLANGLE) + | lex::char_('>', IDRANGLE) + | lex::char_('{', IDLBRACE) + | lex::char_('}', IDRBRACE) + | lex::char_('[', IDLSQUARE) + | lex::char_(']', IDRSQUARE) + | lex::string(".", IDANY) + ; + } +}; + +int main() +{ + typedef lex::lexertl::token< + std::string::iterator, boost::mpl::vector<std::string> + > token_type; + + typedef lex::lexertl::lexer<token_type> lexer_type; + delimiter_tokens<lexer_type> delims; + + // two test cases for the token range + std::string angled_delimiter_str("<canvas>"); + + using qi::token; + // angle brackets + std::string::iterator beg = angled_delimiter_str.begin(); + BOOST_TEST(lex::tokenize_and_parse( + beg, angled_delimiter_str.end(), + delims, + token(IDLPAREN, IDLSQUARE) + >> +token(IDANY) + >> token(IDRPAREN, IDRSQUARE))); + + std::string paren_delimiter_str("(setq foo nil)"); + beg = paren_delimiter_str.begin(); + BOOST_TEST(lex::tokenize_and_parse( + beg, paren_delimiter_str.end(), + delims, + token(IDLPAREN, IDLSQUARE) + >> +token(IDANY) + >> token(IDRPAREN, IDRSQUARE))); + + // reset and use a regular plain token + beg = paren_delimiter_str.begin(); + BOOST_TEST(lex::tokenize_and_parse( + beg, paren_delimiter_str.end(), + delims, + token(IDLPAREN) >> +token(IDANY) >> token(IDRPAREN))); + + return boost::report_errors(); +} |