Changeset 44812


Ignore:
Timestamp:
Apr 27, 2008, 8:41:13 AM (11 years ago)
Author:
Joel de Guzman
Message:

added grammar_class

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/boost/spirit/home/qi/nonterminal/grammar.hpp

    r44562 r44812  
    105105
    106106    ///////////////////////////////////////////////////////////////////////////
    107     //  Generator functions helping to construct a proper grammar object 
     107    //  Generator functions helping to construct a proper grammar object
    108108    //  instance
    109109    ///////////////////////////////////////////////////////////////////////////
    110110    template <typename Definition>
    111     inline grammar<Definition> 
     111    inline grammar<Definition>
    112112    make_parser(Definition const& def)
    113113    {
    114114        return grammar<Definition>(def);
    115115    }
    116    
     116
    117117    template <typename Definition, typename Start>
    118     inline grammar<Definition> 
     118    inline grammar<Definition>
    119119    make_parser(Definition const& def, Start const& start)
    120120    {
    121121        return grammar<Definition>(def, start);
    122122    }
    123    
     123
     124    ///////////////////////////////////////////////////////////////////////////
     125    //  The grammar_class template
     126    ///////////////////////////////////////////////////////////////////////////
     127    template <template <typename, typename> class Def>
     128    struct grammar_class {};
     129
     130    template <typename Iterator, template <typename, typename> class Def>
     131    inline bool
     132    parse(
     133        Iterator& first
     134      , Iterator last
     135      , grammar_class<Def>)
     136    {
     137        Def<Iterator, unused_type> def;
     138        grammar<Def<Iterator, unused_type> > g(def);
     139        return parse(first, last, g);
     140    }
     141
     142    template <typename Iterator
     143      , template <typename, typename> class Def, typename Attr>
     144    inline bool
     145    parse(
     146        Iterator& first
     147      , Iterator last
     148      , grammar_class<Def>
     149      , Attr& attr)
     150    {
     151        Def<Iterator, unused_type> def;
     152        grammar<Def<Iterator, unused_type> > g(def);
     153        return parse(first, last, g, attr);
     154    }
     155
     156    template <typename Iterator
     157      , template <typename, typename> class Def, typename Skipper>
     158    inline bool
     159    phrase_parse(
     160        Iterator& first
     161      , Iterator last
     162      , grammar_class<Def>
     163      , Skipper const& skipper_)
     164    {
     165        typedef typename
     166            result_of::as_component<qi::domain, Skipper>::type
     167        skipper_type;
     168
     169        skipper_type skipper = spirit::as_component(qi::domain(), skipper_);
     170
     171        Def<Iterator, skipper_type> def;
     172        grammar<Def<Iterator, skipper_type> > g(def);
     173        return phrase_parse(first, last, g, skipper);
     174    }
     175
     176    template <typename Iterator
     177      , template <typename, typename> class Def, typename Attr, typename Skipper>
     178    inline bool
     179    phrase_parse(
     180        Iterator& first
     181      , Iterator last
     182      , grammar_class<Def>
     183      , Attr& attr
     184      , Skipper const& skipper_)
     185    {
     186        typedef typename
     187            result_of::as_component<qi::domain, Skipper>::type
     188        skipper_type;
     189
     190        skipper_type skipper = spirit::as_component(qi::domain(), skipper_);
     191
     192        Def<Iterator, skipper_type> def;
     193        grammar<Def<Iterator, skipper_type> > g(def);
     194        return phrase_parse(first, last, g, attr, skipper);
     195    }
     196
    124197}}}
    125198
Note: See TracChangeset for help on using the changeset viewer.