📄 cpp_expression_grammar.hpp
字号:
/*============================================================================= Boost.Wave: A Standard compliant C++ preprocessor library http://www.boost.org/ Copyright (c) 2001-2008 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)=============================================================================*/#if !defined(CPP_EXPRESSION_GRAMMAR_HPP_099CD1A4_A6C0_44BE_8F24_0B00F5BE5674_INCLUDED)#define CPP_EXPRESSION_GRAMMAR_HPP_099CD1A4_A6C0_44BE_8F24_0B00F5BE5674_INCLUDED#include <boost/wave/wave_config.hpp>#include <boost/assert.hpp>#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_closure.hpp>#include <boost/spirit/include/classic_if.hpp>#include <boost/spirit/include/classic_assign_actor.hpp>#include <boost/spirit/include/classic_push_back_actor.hpp>#include <boost/spirit/include/phoenix1_functions.hpp>#include <boost/spirit/include/phoenix1_operators.hpp>#include <boost/spirit/include/phoenix1_primitives.hpp>#include <boost/spirit/include/phoenix1_statements.hpp>#include <boost/spirit/include/phoenix1_casts.hpp>#include <boost/wave/token_ids.hpp>#include <boost/wave/cpp_exceptions.hpp>#include <boost/wave/grammars/cpp_expression_grammar_gen.hpp> #include <boost/wave/grammars/cpp_literal_grammar_gen.hpp> #include <boost/wave/grammars/cpp_expression_value.hpp>#include <boost/wave/util/pattern_parser.hpp>#include <boost/wave/util/macro_helpers.hpp>#if !defined(spirit_append_actor)#define spirit_append_actor(actor) boost::spirit::classic::push_back_a(actor)#define spirit_assign_actor(actor) boost::spirit::classic::assign_a(actor)#endif // !defined(spirit_append_actor)// this must occur after all of the includes and before any code appears#ifdef BOOST_HAS_ABI_HEADERS#include BOOST_ABI_PREFIX#endif/////////////////////////////////////////////////////////////////////////////////// Encapsulation of the grammar for evaluation of constant preprocessor// expressions/////////////////////////////////////////////////////////////////////////////////namespace boost {namespace wave { namespace grammars {namespace closures {/////////////////////////////////////////////////////////////////////////////////// define the closure type used throughout the C++ expression grammar//// Throughout this grammar all literal tokens are stored into a // closure_value variables, which converts the types appropriately, where // required.///////////////////////////////////////////////////////////////////////////////// struct cpp_expr_closure : boost::spirit::classic::closure<cpp_expr_closure, closure_value> { member1 val; };} // namespace closuresnamespace impl {/////////////////////////////////////////////////////////////////////////////////// convert the given token value (integer literal) to a unsigned long///////////////////////////////////////////////////////////////////////////////// struct convert_intlit { template <typename ArgT> struct result { typedef boost::wave::grammars::closures::closure_value type; }; template <typename TokenT> boost::wave::grammars::closures::closure_value operator()(TokenT const &token) const { typedef boost::wave::grammars::closures::closure_value return_type; bool is_unsigned = false; uint_literal_type ul = intlit_grammar_gen<TokenT>::evaluate(token, is_unsigned); return is_unsigned ? return_type(ul) : return_type(static_cast<int_literal_type>(ul)); } }; phoenix::function<convert_intlit> const as_intlit;/////////////////////////////////////////////////////////////////////////////////// convert the given token value (character literal) to a unsigned int///////////////////////////////////////////////////////////////////////////////// struct convert_chlit { template <typename ArgT> struct result { typedef boost::wave::grammars::closures::closure_value type; }; template <typename TokenT> boost::wave::grammars::closures::closure_value operator()(TokenT const &token) const { typedef boost::wave::grammars::closures::closure_value return_type; value_error status = error_noerror; unsigned int value = chlit_grammar_gen<TokenT>::evaluate(token, status); return return_type(value, status); } }; phoenix::function<convert_chlit> const as_chlit;//////////////////////////////////////////////////////////////////////////////////// Handle the ?: operator with correct type and error propagation////////////////////////////////////////////////////////////////////////////////// struct operator_questionmark { template <typename CondT, typename Arg1T, typename Arg2T> struct result { typedef boost::wave::grammars::closures::closure_value type; }; template <typename CondT, typename Arg1T, typename Arg2T> boost::wave::grammars::closures::closure_value operator()(CondT const &cond, Arg1T &val1, Arg2T const &val2) const { return val1.handle_questionmark(cond, val2); } }; phoenix::function<operator_questionmark> const questionmark;/////////////////////////////////////////////////////////////////////////////////// Handle type conversion conserving error conditions///////////////////////////////////////////////////////////////////////////////// struct operator_to_bool { template <typename ArgT> struct result { typedef boost::wave::grammars::closures::closure_value type; }; template <typename ArgT> boost::wave::grammars::closures::closure_value operator()(ArgT &val) const { typedef boost::wave::grammars::closures::closure_value return_type; return return_type( boost::wave::grammars::closures::as_bool(val), val.is_valid()); } }; phoenix::function<operator_to_bool> const to_bool; /////////////////////////////////////////////////////////////////////////////////// Handle explicit type conversion///////////////////////////////////////////////////////////////////////////////// struct operator_as_bool { template <typename ArgT> struct result { typedef bool type; }; template <typename ArgT> bool operator()(ArgT &val) const { return boost::wave::grammars::closures::as_bool(val); } }; phoenix::function<operator_as_bool> const as_bool; /////////////////////////////////////////////////////////////////////////////////// Handle closure value operators with proper error propagation/////////////////////////////////////////////////////////////////////////////////#define BOOST_WAVE_BINARYOP(op, optok) \ struct operator_binary_ ## op { \ \ template <typename Arg1T, typename Arg2T> \ struct result { \ \ typedef boost::wave::grammars::closures::closure_value type; \ }; \ \ template <typename Arg1T, typename Arg2T> \ boost::wave::grammars::closures::closure_value \ operator()(Arg1T &val1, Arg2T &val2) const \ { \ return val1 optok val2; \ } \ }; \ phoenix::function<operator_binary_ ## op> const binary_ ## op \ /**/ BOOST_WAVE_BINARYOP(and, &&); BOOST_WAVE_BINARYOP(or, ||); BOOST_WAVE_BINARYOP(bitand, &); BOOST_WAVE_BINARYOP(bitor, |); BOOST_WAVE_BINARYOP(bitxor, ^); BOOST_WAVE_BINARYOP(lesseq, <=); BOOST_WAVE_BINARYOP(less, <); BOOST_WAVE_BINARYOP(greater, >); BOOST_WAVE_BINARYOP(greateq, >=); BOOST_WAVE_BINARYOP(eq, ==); BOOST_WAVE_BINARYOP(ne, !=);#undef BOOST_WAVE_BINARYOP///////////////////////////////////////////////////////////////////////////////#define BOOST_WAVE_UNARYOP(op, optok) \ struct operator_unary_ ## op { \ \ template <typename ArgT> \ struct result { \ \ typedef boost::wave::grammars::closures::closure_value type; \ }; \ \ template <typename ArgT> \ boost::wave::grammars::closures::closure_value \ operator()(ArgT &val) const \ { \ return optok val; \ } \ }; \ phoenix::function<operator_unary_ ## op> const unary_ ## op \ /**/ BOOST_WAVE_UNARYOP(neg, !); #undef BOOST_WAVE_UNARYOP} // namespace impl///////////////////////////////////////////////////////////////////////////////// define, whether the rule's should generate some debug output#define TRACE_CPP_EXPR_GRAMMAR \ bool(BOOST_SPIRIT_DEBUG_FLAGS_CPP & BOOST_SPIRIT_DEBUG_FLAGS_CPP_EXPR_GRAMMAR) \ /**/struct expression_grammar : public boost::spirit::classic::grammar< expression_grammar, closures::cpp_expr_closure::context_t >{ expression_grammar() { BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(*this, "expression_grammar", TRACE_CPP_EXPR_GRAMMAR); } // no need for copy constructor/assignment operator expression_grammar(expression_grammar const&); expression_grammar& operator= (expression_grammar const&);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -