blob: 621ccb1bfd3aece448e5fd2241f7481bd0fe66f7 [file] [log] [blame]
// 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();
}