e342e00d02
[SVN r70605]
75 lines
1.9 KiB
C++
75 lines
1.9 KiB
C++
// 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();
|
|
}
|
|
|