| /*============================================================================= |
| Copyright (c) 2001-2003 Joel de Guzman |
| Copyright (c) 2002-2003 Martin Wille |
| Copyright (c) 2003 Hartmut Kaiser |
| http://spirit.sourceforge.net/ |
| |
| 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(BOOST_SPIRIT_GRAMMAR_HPP) |
| #define BOOST_SPIRIT_GRAMMAR_HPP |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #if defined(BOOST_SPIRIT_THREADSAFE) && defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE) |
| #undef BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE |
| #endif |
| |
| #include <boost/spirit/home/classic/namespace.hpp> |
| #include <boost/spirit/home/classic/core/parser.hpp> |
| #include <boost/spirit/home/classic/core/non_terminal/parser_context.hpp> |
| #include <boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp> |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| namespace boost { namespace spirit { |
| |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // grammar class |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename DerivedT, typename ContextT = parser_context<> > |
| struct grammar |
| : public parser<DerivedT> |
| , public ContextT::base_t |
| , public context_aux<ContextT, DerivedT> |
| BOOST_SPIRIT_GRAMMAR_ID |
| { |
| typedef grammar<DerivedT, ContextT> self_t; |
| typedef DerivedT const& embed_t; |
| typedef typename ContextT::context_linker_t context_t; |
| typedef typename context_t::attr_t attr_t; |
| |
| template <typename ScannerT> |
| struct result |
| { |
| typedef typename match_result<ScannerT, attr_t>::type type; |
| }; |
| |
| grammar() {} |
| ~grammar() { impl::grammar_destruct(this); } |
| |
| template <typename ScannerT> |
| typename parser_result<self_t, ScannerT>::type |
| parse_main(ScannerT const& scan) const |
| { return impl::grammar_parser_parse<0>(this, scan); } |
| |
| template <typename ScannerT> |
| typename parser_result<self_t, ScannerT>::type |
| parse(ScannerT const& scan) const |
| { |
| typedef typename parser_result<self_t, ScannerT>::type result_t; |
| typedef parser_scanner_linker<ScannerT> scanner_t; |
| BOOST_SPIRIT_CONTEXT_PARSE(scan, *this, scanner_t, context_t, result_t) |
| } |
| |
| template <int N> |
| impl::entry_grammar<DerivedT, N, ContextT> |
| use_parser() const |
| { return impl::entry_grammar<DerivedT, N, ContextT>( this->derived()); } |
| |
| BOOST_SPIRIT_GRAMMAR_STATE |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
| |
| }} // namespace BOOST_SPIRIT_CLASSIC_NS |
| |
| #undef BOOST_SPIRIT_GRAMMAR_ID |
| #undef BOOST_SPIRIT_GRAMMAR_ACCESS |
| #undef BOOST_SPIRIT_GRAMMAR_STATE |
| #endif |
| |