#include <iostream>
#include <boost/spirit/core.hpp>

using namespace boost::spirit;

namespace boost { namespace spirit
{
    template <typename RHS>
    struct sub_grammar : parser<sub_grammar<RHS> >
    {
        typedef sub_grammar     self_t;
        typedef self_t const&   embed_t;

        template <typename ScannerT>
        struct result
        {
            typedef typename parser_result<RHS, ScannerT>::type type;
        };

        sub_grammar(RHS const& rhs_)
        : rhs(rhs_) {}

        template <typename ScannerT>
        typename parser_result<self_t, ScannerT>::type
        parse(ScannerT const& scan) const
        { return rhs.parse(scan); }

        RHS rhs;
    };
}}

typedef
    alternative<alternative<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*> > >, sequence<sequence<strlit<const char*>,
    kleene_star<difference<anychar_parser, chlit<char> > > >, chlit<char> >
    >, sequence<sequence<strlit<const char*>,
    kleene_star<difference<anychar_parser, chlit<char> > > >, chlit<char> >
    >
rhs_t;

int
main()
{
    sub_grammar<rhs_t> g =
        space_p
        |   "//" >> *(anychar_p - '\n') >> '\n'     // C++ comment
        |   "/*" >> *(anychar_p - "*/") >> "*/"     // C comment
        |   "#line" >> *(anychar_p - '\n') >> '\n'  // added for correctly
                                                    // handling preprocessed
        |   "#pragma" >> *(anychar_p - '\n') >> '\n'// files from Intel V5.0.1
                                                    // on W2K
        ;

    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;
}
