/*=============================================================================
    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;
};

int
main()
{
    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;
}
