定制Skip Parser with Boost :: Spirit

Lan*_*nbo 18 c++ parsing boost-spirit

标准ascii::space_type船长当然不会跳过我的评论.文档提到你可以制作自己的跳过解析器但是没有实际如何做的例子.

我只需要一个示例代码或任何东西,我现在谷歌搜索了2个小时.

请不要指出我的例子,一些无效的链接已经过时,处理Spirit 1.6.

Lan*_*nbo 31

经过一些实验,我找到了一种指定自定义船长的方法,并在此处概述:

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;

};
Run Code Online (Sandbox Code Playgroud)

秘密在于解析器的调用.出于某种原因,当您要使用解析它时parse_phrase,您必须提供一个skipper语法对象.我没有意识到这一点:

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);
Run Code Online (Sandbox Code Playgroud)

这有效.

  • 谢谢你.你今天给我节省了很多时间! (2认同)