no_rule3.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 86 行

CPP
86
字号
/*=============================================================================    Copyright (c) 2002-2003 Joel de Guzman    http://spirit.sourceforge.net/    Use, modification and distribution is subject to 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)=============================================================================*/// *** See the section "Look Ma' No Rules" in// *** chapter "Techniques" of the Spirit documentation// *** for information regarding this snippet#include <iostream>#include <boost/spirit/include/classic_core.hpp>using namespace BOOST_SPIRIT_CLASSIC_NS;namespace boost { namespace spirit{    template <typename DerivedT>    struct sub_grammar : parser<DerivedT>    {        typedef sub_grammar         self_t;        typedef DerivedT const&     embed_t;        template <typename ScannerT>        struct result        {            typedef typename parser_result<                typename DerivedT::start_t, ScannerT>::type            type;        };        DerivedT const& derived() const        { return *static_cast<DerivedT const*>(this); }        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            return derived().start.parse(scan);        }    };}}///////////////////////////////////////////////////////////////////////////////////  Client code/////////////////////////////////////////////////////////////////////////////////struct skip_grammar : boost::spirit::sub_grammar<skip_grammar>{    typedef       alternative<alternative<space_parser, sequence<sequence<       strlit<const char*>, kleene_star<difference<anychar_parser,       chlit<char> > > >, chlit<char> > >, sequence<sequence<       strlit<const char*>, kleene_star<difference<anychar_parser,       strlit<const char*> > > >, strlit<const char*> > >    start_t;    skip_grammar()    : start        (            space_p        |   "//" >> *(anychar_p - '\n') >> '\n'        |   "/*" >> *(anychar_p - "*/") >> "*/"        )    {}    start_t start;};intmain(){    skip_grammar g;    bool success = parse(        "/*this is a comment*/\n//this is a c++ comment\n\n",        *g).full;    assert(success);    std::cout << "SUCCESS!!!\n";    return 0;}

⌨️ 快捷键说明

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