⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp_expression_grammar.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 3 页
字号:
/*=============================================================================    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 + -