Custom Skip Parser with Boost::Spirit

前端 未结 1 1191
悲&欢浪女
悲&欢浪女 2020-12-08 15:59

The standard ascii::space_type skipper does of course not skip my comments. The docs mention you can make your own skip parser but there is no example of actual

相关标签:
1条回答
  • 2020-12-08 16:38

    After some experimentation, I have found a way to specify a custom skipper and will outline it here:

    template<typename Iterator>
    struct pl0_skipper : public qi::grammar<Iterator> {
    
        pl0_skipper() : pl0_skipper::base_type(skip, "PL/0") {
            skip = ascii::space | ('{' >> *(qi::char_ - '}') >> '}');
        }
        qi::rule<Iterator> skip;
    };
    
    template<typename Iterator, typename Skipper = pl0_skipper<Iterator>>
    struct pl0_grammar : public qi::grammar<Iterator, Skipper> {
    
        /* The rules use our skipper */
        qi::rule<Iterator, Skipper> start;
        qi::rule<Iterator, Skipper> block;
        qi::rule<Iterator, Skipper> statement;
    
    };
    

    The secret lies in the call of the parser. For some reason, when you want to parse this using parse_phrase, you have to give a skipper grammar object. I was not aware of this:

    typedef std::string::const_iterator iterator_t;
    typedef parser::pl0_grammar<iterator_t> grammar;
    typedef parser::pl0_skipper<iterator_t> skipper;
    
    grammar g;
    skipper ws;
    
    iterator_t iter = str.begin();
    iterator_t end = str.end();
    bool r = phrase_parse(iter, end, g, ws);
    

    This works.

    0 讨论(0)
提交回复
热议问题