// Copyright (c) 2001-2010 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) // This example implements a simple utility allowing to print the attribute // type as it is exposed by an arbitrary Qi parser expression. Just insert // your expression below, compile and run this example to see what Qi is // seeing! #if !defined (DISPLAY_ATTRIBUTE_OF_PARSER_JAN_2010_30_0722PM) #define DISPLAY_ATTRIBUTE_OF_PARSER_JAN_2010_30_0722PM #include #include namespace tools { namespace spirit = boost::spirit; template struct attribute_of_parser { typedef typename spirit::result_of::compile< spirit::qi::domain, Expr >::type parser_expression_type; typedef typename spirit::traits::attribute_of< parser_expression_type, spirit::unused_type, Iterator >::type type; }; template void display_attribute_of_parser(T const &) { // Report invalid expression error as early as possible. // If you got an error_invalid_expression error message here, // then the expression (expr) is not a valid spirit qi expression. BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, T); typedef typename attribute_of_parser::type type; std::cout << typeid(type).name() << std::endl; } template void display_attribute_of_parser(std::ostream& os, T const &) { // Report invalid expression error as early as possible. // If you got an error_invalid_expression error message here, // then the expression (expr) is not a valid spirit qi expression. BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, T); typedef typename attribute_of_parser::type type; os << typeid(type).name() << std::endl; } } #endif