source: NonGTP/Boost/boost/spirit/core/non_terminal/grammar.hpp @ 857

Revision 857, 2.9 KB checked in by igarcia, 18 years ago (diff)
Line 
1/*=============================================================================
2    Copyright (c) 2001-2003 Joel de Guzman
3    Copyright (c) 2002-2003 Martin Wille
4    Copyright (c) 2003 Hartmut Kaiser
5    http://spirit.sourceforge.net/
6
7    Use, modification and distribution is subject to the Boost Software
8    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9    http://www.boost.org/LICENSE_1_0.txt)
10=============================================================================*/
11#if !defined(BOOST_SPIRIT_GRAMMAR_HPP)
12#define BOOST_SPIRIT_GRAMMAR_HPP
13
14///////////////////////////////////////////////////////////////////////////////
15#if defined(BOOST_SPIRIT_THREADSAFE) && defined(BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE)
16#undef BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE
17#endif
18
19#include <boost/spirit/core/parser.hpp>
20#include <boost/spirit/core/non_terminal/parser_context.hpp>
21#include <boost/spirit/core/non_terminal/impl/grammar.ipp>
22
23///////////////////////////////////////////////////////////////////////////////
24namespace boost { namespace spirit {
25
26///////////////////////////////////////////////////////////////////////////////
27//
28//  grammar class
29//
30///////////////////////////////////////////////////////////////////////////////
31template <typename DerivedT, typename ContextT = parser_context<> >
32struct grammar
33    : public parser<DerivedT>
34    , public ContextT::base_t
35    , public context_aux<ContextT, DerivedT>
36    BOOST_SPIRIT_GRAMMAR_ID
37{
38    typedef grammar<DerivedT, ContextT>         self_t;
39    typedef DerivedT const&                     embed_t;
40    typedef typename ContextT::context_linker_t context_t;
41    typedef typename context_t::attr_t          attr_t;
42
43    template <typename ScannerT>
44    struct result
45    {
46        typedef typename match_result<ScannerT, attr_t>::type type;
47    };
48
49    grammar() {}
50    ~grammar() { impl::grammar_destruct(this); }
51
52    template <typename ScannerT>
53    typename parser_result<self_t, ScannerT>::type
54    parse_main(ScannerT const& scan) const
55    { return impl::grammar_parser_parse<0>(this, scan); }
56
57    template <typename ScannerT>
58    typename parser_result<self_t, ScannerT>::type
59    parse(ScannerT const& scan) const
60    {
61        typedef typename parser_result<self_t, ScannerT>::type result_t;
62        typedef parser_scanner_linker<ScannerT> scanner_t;
63        BOOST_SPIRIT_CONTEXT_PARSE(scan, *this, scanner_t, context_t, result_t)
64    }
65
66    template <int N>
67    impl::entry_grammar<DerivedT, N, ContextT>
68    use_parser() const
69    { return impl::entry_grammar<DerivedT, N, ContextT>( this->derived()); }
70
71    BOOST_SPIRIT_GRAMMAR_STATE
72};
73
74///////////////////////////////////////////////////////////////////////////////
75}} // namespace boost::spirit
76
77#undef BOOST_SPIRIT_GRAMMAR_ID
78#undef BOOST_SPIRIT_GRAMMAR_ACCESS
79#undef BOOST_SPIRIT_GRAMMAR_STATE
80#endif
81
Note: See TracBrowser for help on using the repository browser.