1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Copyright (c) 2001-2011 Hartmut Kaiser
- // Copyright (c) 2011 Dean Michael Berries
- //
- // 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/qi.hpp>
- #include <boost/fusion/tuple.hpp>
- #include <string>
- struct foo_parts
- {
- boost::optional<std::string> first;
- std::string second;
- };
- namespace boost { namespace spirit { namespace traits
- {
- template <>
- struct transform_attribute<foo_parts
- , fusion::tuple<std::string &, optional<std::string> &>
- , spirit::qi::domain>
- {
- typedef fusion::tuple<std::string&, optional<std::string>&> type;
- static type pre(foo_parts & parts)
- {
- return fusion::tie(parts.second, parts.first);
- }
- static void post(foo_parts &, type const &) {}
- static void fail(foo_parts &) {}
- };
- }}}
- namespace qi = boost::spirit::qi;
- template <typename Iterator>
- struct foo_grammar : qi::grammar<Iterator, foo_parts()>
- {
- foo_grammar() : foo_grammar::base_type(start, "foo")
- {
- foo_part =
- +qi::alpha >> -(+qi::digit)
- | qi::attr(std::string())
- >> qi::attr(boost::optional<std::string>())
- ;
- start = foo_part.alias();
- }
- typedef boost::fusion::tuple<std::string&, boost::optional<std::string>&>
- tuple_type;
- qi::rule<Iterator, tuple_type()> foo_part;
- qi::rule<Iterator, foo_parts()> start;
- };
- int main()
- {
- foo_parts instance;
- foo_grammar<std::string::iterator> grammar;
- std::string input = "abc123";
-
- BOOST_TEST(qi::parse(input.begin(), input.end(), grammar, instance) &&
- instance.first && instance.first.get() == "123" &&
- instance.second == "abc");
- return boost::report_errors();
- }
|