1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // 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 <iostream>
- #include <boost/spirit/include/qi.hpp>
- namespace tools
- {
- namespace spirit = boost::spirit;
- template <typename Expr, typename Iterator = spirit::unused_type>
- 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 <typename T>
- 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<T>::type type;
- std::cout << typeid(type).name() << std::endl;
- }
- template <typename T>
- 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<T>::type type;
- os << typeid(type).name() << std::endl;
- }
- }
- #endif
|