annotate DEPENDENCIES/generic/include/boost/spirit/home/qi/directive/skip.hpp @ 89:3c438d716e83

Update subrepos
author Chris Cannam
date Tue, 24 Mar 2015 11:24:46 +0000
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 2001-2011 Joel de Guzman
Chris@16 3
Chris@16 4 Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6 =============================================================================*/
Chris@16 7 #if !defined(SPIRIT_SKIP_JANUARY_26_2008_0422PM)
Chris@16 8 #define SPIRIT_SKIP_JANUARY_26_2008_0422PM
Chris@16 9
Chris@16 10 #if defined(_MSC_VER)
Chris@16 11 #pragma once
Chris@16 12 #endif
Chris@16 13
Chris@16 14 #include <boost/spirit/home/qi/meta_compiler.hpp>
Chris@16 15 #include <boost/spirit/home/qi/parser.hpp>
Chris@16 16 #include <boost/spirit/home/qi/auxiliary/lazy.hpp>
Chris@16 17 #include <boost/spirit/home/qi/operator/kleene.hpp>
Chris@16 18 #include <boost/spirit/home/qi/directive/lexeme.hpp>
Chris@16 19 #include <boost/spirit/home/qi/skip_over.hpp>
Chris@16 20 #include <boost/spirit/home/qi/detail/unused_skipper.hpp>
Chris@16 21 #include <boost/spirit/home/support/container.hpp>
Chris@16 22 #include <boost/spirit/home/support/common_terminals.hpp>
Chris@16 23 #include <boost/spirit/home/qi/detail/attributes.hpp>
Chris@16 24 #include <boost/spirit/home/support/info.hpp>
Chris@16 25 #include <boost/spirit/home/support/has_semantic_action.hpp>
Chris@16 26 #include <boost/spirit/home/support/handles_container.hpp>
Chris@16 27 #include <boost/fusion/include/at.hpp>
Chris@16 28 #include <boost/fusion/include/vector.hpp>
Chris@16 29
Chris@16 30 namespace boost { namespace spirit
Chris@16 31 {
Chris@16 32 ///////////////////////////////////////////////////////////////////////////
Chris@16 33 // Enablers
Chris@16 34 ///////////////////////////////////////////////////////////////////////////
Chris@16 35 template <>
Chris@16 36 struct use_directive<qi::domain, tag::skip> // enables skip[p]
Chris@16 37 : mpl::true_ {};
Chris@16 38
Chris@16 39 template <typename T>
Chris@16 40 struct use_directive<qi::domain
Chris@16 41 , terminal_ex<tag::skip // enables skip(s)[p]
Chris@16 42 , fusion::vector1<T> >
Chris@16 43 > : boost::spirit::traits::matches<qi::domain, T> {};
Chris@16 44
Chris@16 45 template <> // enables *lazy* skip(s)[p]
Chris@16 46 struct use_lazy_directive<
Chris@16 47 qi::domain
Chris@16 48 , tag::skip
Chris@16 49 , 1 // arity
Chris@16 50 > : mpl::true_ {};
Chris@16 51 }}
Chris@16 52
Chris@16 53 namespace boost { namespace spirit { namespace qi
Chris@16 54 {
Chris@16 55 #ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
Chris@16 56 using spirit::skip;
Chris@16 57 #endif
Chris@16 58 using spirit::skip_type;
Chris@16 59
Chris@16 60 template <typename Subject>
Chris@16 61 struct reskip_parser : unary_parser<reskip_parser<Subject> >
Chris@16 62 {
Chris@16 63 typedef Subject subject_type;
Chris@16 64
Chris@16 65 template <typename Context, typename Iterator>
Chris@16 66 struct attribute
Chris@16 67 {
Chris@16 68 typedef typename
Chris@16 69 traits::attribute_of<Subject, Context, Iterator>::type
Chris@16 70 type;
Chris@16 71 };
Chris@16 72
Chris@16 73 reskip_parser(Subject const& subject_)
Chris@16 74 : subject(subject_) {}
Chris@16 75
Chris@16 76 template <typename Iterator, typename Context
Chris@16 77 , typename Skipper, typename Attribute>
Chris@16 78 bool parse(Iterator& first, Iterator const& last
Chris@16 79 , Context& context, Skipper const& u // --> The skipper is reintroduced
Chris@16 80 , Attribute& attr_) const
Chris@16 81 {
Chris@16 82 return subject.parse(first, last, context
Chris@16 83 , detail::get_skipper(u), attr_);
Chris@16 84 }
Chris@16 85
Chris@16 86 template <typename Context>
Chris@16 87 info what(Context& context) const
Chris@16 88 {
Chris@16 89 return info("skip", subject.what(context));
Chris@16 90 }
Chris@16 91
Chris@16 92 Subject subject;
Chris@16 93 };
Chris@16 94
Chris@16 95 template <typename Subject, typename Skipper>
Chris@16 96 struct skip_parser : unary_parser<skip_parser<Subject, Skipper> >
Chris@16 97 {
Chris@16 98 typedef Subject subject_type;
Chris@16 99 typedef Skipper skipper_type;
Chris@16 100
Chris@16 101 template <typename Context, typename Iterator>
Chris@16 102 struct attribute
Chris@16 103 {
Chris@16 104 typedef typename
Chris@16 105 traits::attribute_of<Subject, Context, Iterator>::type
Chris@16 106 type;
Chris@16 107 };
Chris@16 108
Chris@16 109 skip_parser(Subject const& subject_, Skipper const& skipper_)
Chris@16 110 : subject(subject_), skipper(skipper_) {}
Chris@16 111
Chris@16 112 template <typename Iterator, typename Context
Chris@16 113 , typename Skipper_, typename Attribute>
Chris@16 114 bool parse(Iterator& first, Iterator const& last
Chris@16 115 , Context& context, Skipper_ const& //skipper --> bypass the supplied skipper
Chris@16 116 , Attribute& attr_) const
Chris@16 117 {
Chris@16 118 return subject.parse(first, last, context, skipper, attr_);
Chris@16 119 }
Chris@16 120
Chris@16 121 template <typename Context>
Chris@16 122 info what(Context& context) const
Chris@16 123 {
Chris@16 124 return info("skip", subject.what(context));
Chris@16 125 }
Chris@16 126
Chris@16 127 Subject subject;
Chris@16 128 Skipper skipper;
Chris@16 129 };
Chris@16 130
Chris@16 131 ///////////////////////////////////////////////////////////////////////////
Chris@16 132 // Parser generators: make_xxx function (objects)
Chris@16 133 ///////////////////////////////////////////////////////////////////////////
Chris@16 134 template <typename Subject, typename Modifiers>
Chris@16 135 struct make_directive<tag::skip, Subject, Modifiers>
Chris@16 136 {
Chris@16 137 typedef reskip_parser<Subject> result_type;
Chris@16 138 result_type operator()(unused_type, Subject const& subject, unused_type) const
Chris@16 139 {
Chris@16 140 return result_type(subject);
Chris@16 141 }
Chris@16 142 };
Chris@16 143
Chris@16 144 template <typename Skipper, typename Subject, typename Modifiers>
Chris@16 145 struct make_directive<
Chris@16 146 terminal_ex<tag::skip, fusion::vector1<Skipper> >, Subject, Modifiers>
Chris@16 147 {
Chris@16 148 typedef typename
Chris@16 149 result_of::compile<qi::domain, Skipper, Modifiers>::type
Chris@16 150 skipper_type;
Chris@16 151
Chris@16 152 typedef skip_parser<Subject, skipper_type> result_type;
Chris@16 153
Chris@16 154 template <typename Terminal>
Chris@16 155 result_type operator()(Terminal const& term, Subject const& subject
Chris@16 156 , Modifiers const& modifiers) const
Chris@16 157 {
Chris@16 158 return result_type(subject
Chris@16 159 , compile<qi::domain>(fusion::at_c<0>(term.args), modifiers));
Chris@16 160 }
Chris@16 161 };
Chris@16 162
Chris@16 163 }}}
Chris@16 164
Chris@16 165 namespace boost { namespace spirit { namespace traits
Chris@16 166 {
Chris@16 167 ///////////////////////////////////////////////////////////////////////////
Chris@16 168 template <typename Subject>
Chris@16 169 struct has_semantic_action<qi::reskip_parser<Subject> >
Chris@16 170 : unary_has_semantic_action<Subject> {};
Chris@16 171
Chris@16 172 template <typename Subject, typename Skipper>
Chris@16 173 struct has_semantic_action<qi::skip_parser<Subject, Skipper> >
Chris@16 174 : unary_has_semantic_action<Subject> {};
Chris@16 175
Chris@16 176 ///////////////////////////////////////////////////////////////////////////
Chris@16 177 template <typename Subject, typename Attribute, typename Context
Chris@16 178 , typename Iterator>
Chris@16 179 struct handles_container<qi::reskip_parser<Subject>, Attribute
Chris@16 180 , Context, Iterator>
Chris@16 181 : unary_handles_container<Subject, Attribute, Context, Iterator> {};
Chris@16 182
Chris@16 183 template <typename Subject, typename Skipper, typename Attribute
Chris@16 184 , typename Context, typename Iterator>
Chris@16 185 struct handles_container<qi::skip_parser<Subject, Skipper>, Attribute
Chris@16 186 , Context, Iterator>
Chris@16 187 : unary_handles_container<Subject, Attribute, Context, Iterator> {};
Chris@16 188 }}}
Chris@16 189
Chris@16 190 #endif