⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 if.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 2002-2003 Joel de Guzman    Copyright (c) 2002 Juan Carlos Arevalo-Baeza    Copyright (c) 2002-2003 Martin Wille    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)=============================================================================*/#ifndef BOOST_SPIRIT_IF_HPP#define BOOST_SPIRIT_IF_HPP#include <boost/spirit/home/classic/namespace.hpp>#include <boost/spirit/home/classic/core/parser.hpp>#include <boost/spirit/home/classic/core/composite/composite.hpp>#include <boost/spirit/home/classic/dynamic/impl/conditions.ipp>namespace boost { namespace spirit {BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN    namespace impl {    //////////////////////////////////    // if-else-parser, holds two alternative parsers and a conditional functor    // that selects between them.    template <typename ParsableTrueT, typename ParsableFalseT, typename CondT>    struct if_else_parser        : public condition_evaluator<typename as_parser<CondT>::type>        , public binary        <            typename as_parser<ParsableTrueT>::type,            typename as_parser<ParsableFalseT>::type,            parser< if_else_parser<ParsableTrueT, ParsableFalseT, CondT> >        >    {        typedef if_else_parser<ParsableTrueT, ParsableFalseT, CondT>  self_t;        typedef as_parser<ParsableTrueT>            as_parser_true_t;        typedef as_parser<ParsableFalseT>           as_parser_false_t;        typedef typename as_parser_true_t::type     parser_true_t;        typedef typename as_parser_false_t::type    parser_false_t;        typedef as_parser<CondT>                    cond_as_parser_t;        typedef typename cond_as_parser_t::type     condition_t;        typedef binary<parser_true_t, parser_false_t, parser<self_t> > base_t;        typedef condition_evaluator<condition_t>                       eval_t;        if_else_parser        (            ParsableTrueT  const& p_true,            ParsableFalseT const& p_false,            CondT          const& cond_        )            : eval_t(cond_as_parser_t::convert(cond_))            , base_t                (                    as_parser_true_t::convert(p_true),                    as_parser_false_t::convert(p_false)                )        { }        template <typename ScannerT>        struct result        {            typedef typename match_result<ScannerT, nil_t>::type type;        };        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            typedef typename parser_result                <parser_true_t, ScannerT>::type   then_result_t;            typedef typename parser_result                <parser_false_t, ScannerT>::type  else_result_t;            typename ScannerT::iterator_t const  save(scan.first);            std::ptrdiff_t length = this->evaluate(scan);            if (length >= 0)            {                then_result_t then_result(this->left().parse(scan));                if (then_result)                {                    length += then_result.length();                    return scan.create_match(std::size_t(length), nil_t(), save, scan.first);                }            }            else            {                else_result_t else_result(this->right().parse(scan));                if (else_result)                {                    length = else_result.length();                    return scan.create_match(std::size_t(length), nil_t(), save, scan.first);                }            }            return scan.no_match();        }    };    //////////////////////////////////    // if-else-parser generator, takes the false-parser in brackets    // and returns the if-else-parser.    template <typename ParsableTrueT, typename CondT>    struct if_else_parser_gen    {        if_else_parser_gen(ParsableTrueT const& p_true_, CondT const& cond_)            : p_true(p_true_)            , cond(cond_) {}        template <typename ParsableFalseT>        if_else_parser        <            ParsableTrueT,            ParsableFalseT,            CondT        >        operator[](ParsableFalseT const& p_false) const        {            return if_else_parser<ParsableTrueT, ParsableFalseT, CondT>                (                    p_true,                    p_false,                    cond                );        }        ParsableTrueT const &p_true;        CondT const &cond;    };    //////////////////////////////////    // if-parser, conditionally runs a parser is a functor condition is true.    // If the condition is fales, it fails the parse.    // It can optionally become an if-else-parser through the member else_p.    template <typename ParsableT, typename CondT>    struct if_parser        : public condition_evaluator<typename as_parser<CondT>::type>        , public unary        <            typename as_parser<ParsableT>::type,            parser<if_parser<ParsableT, CondT> > >    {        typedef if_parser<ParsableT, CondT>           self_t;        typedef as_parser<ParsableT>                  as_parser_t;        typedef typename as_parser_t::type            parser_t;        typedef as_parser<CondT>                      cond_as_parser_t;        typedef typename cond_as_parser_t::type       condition_t;        typedef condition_evaluator<condition_t>      eval_t;        typedef unary<parser_t, parser<self_t> >      base_t;        if_parser(ParsableT const& p, CondT const& cond_)            : eval_t(cond_as_parser_t::convert(cond_))            , base_t(as_parser_t::convert(p))            , else_p(p, cond_)        {}        template <typename ScannerT>        struct result        {            typedef typename match_result<ScannerT, nil_t>::type type;        };        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            typedef typename parser_result<parser_t, ScannerT>::type t_result_t;            typename ScannerT::iterator_t const save(scan.first);            std::ptrdiff_t length = this->evaluate(scan);            if (length >= 0)            {                t_result_t then_result(this->subject().parse(scan));                if (then_result)                {                    length += then_result.length();                    return scan.create_match(std::size_t(length), nil_t(), save, scan.first);                }                return scan.no_match();            }            return scan.empty_match();        }        if_else_parser_gen<ParsableT, CondT> else_p;    };    //////////////////////////////////    // if-parser generator, takes the true-parser in brackets and returns the    // if-parser.    template <typename CondT>    struct if_parser_gen    {        if_parser_gen(CondT const& cond_) : cond(cond_) {}        template <typename ParsableT>        if_parser        <            ParsableT,            CondT        >        operator[](ParsableT const& subject) const        {            return if_parser<ParsableT, CondT>(subject, cond);        }        CondT const &cond;    };} // namespace impl//////////////////////////////////// if_p function, returns "if" parser generatortemplate <typename CondT>impl::if_parser_gen<CondT>if_p(CondT const& cond){    return impl::if_parser_gen<CondT>(cond);}BOOST_SPIRIT_CLASSIC_NAMESPACE_END}} // namespace BOOST_SPIRIT_CLASSIC_NS#endif // BOOST_SPIRIT_IF_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -