2011-12-15 6 views
15

標準ascii::space_typeスキッパーはもちろん私のコメントをスキップしません。ドキュメントには、独自のスキップパーサーを作成することができますが、実際にそれを行う方法の例はありません。Boost :: Spiritを使用したカスタムスキップパーサー

私はちょうど例のコードか何かを必要としていました、私は今2時間グーグルで行ってきました。

私にはexamplesを指摘しないでください。いくつかのリンクは絶望的に古く、Spirit 1.6を扱っています。

+0

Boostディストリビューションに付属のサンプルを見ましたか? –

答えて

27

いくつかの実験の後、私は、カスタムのスキッパーを指定する方法を発見したと、ここでそれを概説します:

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を使用してこれを解析する場合は、スキッパー文法オブジェクトを与える必要があります。私はこれを知らなかった:

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); 

これは動作します。

+1

ありがとうございます。あなたは今日私に多くの時間を救った! – Dilawar

関連する問題