Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/wave/grammars/cpp_predef_macros_grammar.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/wave/grammars/cpp_predef_macros_grammar.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,178 @@ +/*============================================================================= + Boost.Wave: A Standard compliant C++ preprocessor library + + http://www.boost.org/ + + Copyright (c) 2001-2012 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_PREDEF_MACROS_GRAMMAR_HPP_53858C9A_C202_4D60_AD92_DC9CAE4DBB43_INCLUDED) +#define CPP_PREDEF_MACROS_GRAMMAR_HPP_53858C9A_C202_4D60_AD92_DC9CAE4DBB43_INCLUDED + +#include <boost/spirit/include/classic_core.hpp> +#include <boost/spirit/include/classic_parse_tree.hpp> +#include <boost/spirit/include/classic_confix.hpp> +#include <boost/spirit/include/classic_lists.hpp> + +#include <boost/wave/wave_config.hpp> +#include <boost/wave/token_ids.hpp> +#include <boost/wave/grammars/cpp_predef_macros_gen.hpp> +#include <boost/wave/util/pattern_parser.hpp> + +// this must occur after all of the includes and before any code appears +#ifdef BOOST_HAS_ABI_HEADERS +#include BOOST_ABI_PREFIX +#endif + +/////////////////////////////////////////////////////////////////////////////// +namespace boost { +namespace wave { +namespace grammars { + +/////////////////////////////////////////////////////////////////////////////// +// define, whether the rule's should generate some debug output +#define TRACE_PREDEF_MACROS_GRAMMAR \ + bool(BOOST_SPIRIT_DEBUG_FLAGS_CPP & BOOST_SPIRIT_DEBUG_FLAGS_PREDEF_MACROS_GRAMMAR) \ + /**/ + +/////////////////////////////////////////////////////////////////////////////// +// Encapsulation of the grammar for command line driven predefined macros. +struct predefined_macros_grammar : + public boost::spirit::classic::grammar<predefined_macros_grammar> +{ + template <typename ScannerT> + struct definition + { + // 'normal' (parse_tree generating) rule type + typedef boost::spirit::classic::rule< + ScannerT, boost::spirit::classic::dynamic_parser_tag> + rule_type; + + rule_type plain_define, macro_definition, macro_parameters; + + definition(predefined_macros_grammar const &/*self*/) + { + // import the spirit and cpplexer namespaces here + using namespace boost::spirit::classic; + using namespace boost::wave; + using namespace boost::wave::util; + + // set the rule id's for later use + plain_define.set_id(BOOST_WAVE_PLAIN_DEFINE_ID); + macro_parameters.set_id(BOOST_WAVE_MACRO_PARAMETERS_ID); + macro_definition.set_id(BOOST_WAVE_MACRO_DEFINITION_ID); + + // recognizes command line defined macro syntax, i.e. + // -DMACRO + // -DMACRO= + // -DMACRO=value + // -DMACRO(x) + // -DMACRO(x)= + // -DMACRO(x)=value + + // This grammar resembles the overall structure of the cpp_grammar to + // make it possible to reuse the parse tree traversal code + plain_define + = ( ch_p(T_IDENTIFIER) + | pattern_p(KeywordTokenType, + TokenTypeMask|PPTokenFlag) + | pattern_p(OperatorTokenType|AltExtTokenType, + ExtTokenTypeMask|PPTokenFlag) // and, bit_and etc. + | pattern_p(BoolLiteralTokenType, + TokenTypeMask|PPTokenFlag) // true/false + ) + >> !macro_parameters + >> !macro_definition + ; + + // parameter list + macro_parameters + = confix_p( + no_node_d[ch_p(T_LEFTPAREN) >> *ch_p(T_SPACE)], + !list_p( + ( ch_p(T_IDENTIFIER) + | pattern_p(KeywordTokenType, + TokenTypeMask|PPTokenFlag) + | pattern_p(OperatorTokenType|AltExtTokenType, + ExtTokenTypeMask|PPTokenFlag) // and, bit_and etc. + | pattern_p(BoolLiteralTokenType, + TokenTypeMask|PPTokenFlag) // true/false +#if BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS != 0 + | ch_p(T_ELLIPSIS) +#endif + ), + no_node_d + [ + *ch_p(T_SPACE) >> ch_p(T_COMMA) >> *ch_p(T_SPACE) + ] + ), + no_node_d[*ch_p(T_SPACE) >> ch_p(T_RIGHTPAREN)] + ) + ; + + // macro body (anything left until eol) + macro_definition + = no_node_d[ch_p(T_ASSIGN)] + >> *anychar_p + ; + + BOOST_SPIRIT_DEBUG_TRACE_RULE(plain_define, TRACE_PREDEF_MACROS_GRAMMAR); + BOOST_SPIRIT_DEBUG_TRACE_RULE(macro_definition, TRACE_PREDEF_MACROS_GRAMMAR); + BOOST_SPIRIT_DEBUG_TRACE_RULE(macro_parameters, TRACE_PREDEF_MACROS_GRAMMAR); + } + + // start rule of this grammar + rule_type const& start() const + { return plain_define; } + }; + + predefined_macros_grammar() + { + BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(*this, + "predefined_macros_grammar", TRACE_PREDEF_MACROS_GRAMMAR); + } + +}; + +/////////////////////////////////////////////////////////////////////////////// +#undef TRACE_PREDEF_MACROS_GRAMMAR + +/////////////////////////////////////////////////////////////////////////////// +// +// The following parse function is defined here, to allow the separation of +// the compilation of the cpp_predefined_macros_grammar from the function +// using it. +// +/////////////////////////////////////////////////////////////////////////////// + +#if BOOST_WAVE_SEPARATE_GRAMMAR_INSTANTIATION != 0 +#define BOOST_WAVE_PREDEF_MACROS_GRAMMAR_GEN_INLINE +#else +#define BOOST_WAVE_PREDEF_MACROS_GRAMMAR_GEN_INLINE inline +#endif + +template <typename LexIteratorT> +BOOST_WAVE_PREDEF_MACROS_GRAMMAR_GEN_INLINE +boost::spirit::classic::tree_parse_info<LexIteratorT> +predefined_macros_grammar_gen<LexIteratorT>::parse_predefined_macro ( + LexIteratorT const &first, LexIteratorT const &last) +{ + predefined_macros_grammar g; + return boost::spirit::classic::pt_parse (first, last, g); +} + +#undef BOOST_WAVE_PREDEF_MACROS_GRAMMAR_GEN_INLINE + +/////////////////////////////////////////////////////////////////////////////// +} // namespace grammars +} // namespace wave +} // namespace boost + +// the suffix header occurs after all of the code +#ifdef BOOST_HAS_ABI_HEADERS +#include BOOST_ABI_SUFFIX +#endif + +#endif // !defined(CPP_PREDEF_MACROS_GRAMMAR_HPP_53858C9A_C202_4D60_AD92_DC9CAE4DBB43_INCLUDED)