簡體   English   中英

定制Skip Parser with Boost :: Spirit

[英]Custom Skip Parser with Boost::Spirit

標准的ascii::space_type skipper當然不會跳過我的評論。 文檔提到你可以制作自己的跳過解析器但是沒有實際如何做的例子。

我只需要一個示例代碼或任何東西,我現在谷歌搜索了2個小時。

請不要指出我的例子 ,一些無效的鏈接已經過時,處理Spirit 1.6。

經過一些實驗,我找到了一種指定自定義船長的方法,並在此處概述:

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;

};

秘密在於解析器的調用。 出於某種原因,當您想使用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);

這有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM