標準ascii::space_type
スキッパーはもちろん私のコメントをスキップしません。ドキュメントには、独自のスキップパーサーを作成することができますが、実際にそれを行う方法の例はありません。Boost :: Spiritを使用したカスタムスキップパーサー
私はちょうど例のコードか何かを必要としていました、私は今2時間グーグルで行ってきました。
私にはexamplesを指摘しないでください。いくつかのリンクは絶望的に古く、Spirit 1.6を扱っています。
標準ascii::space_type
スキッパーはもちろん私のコメントをスキップしません。ドキュメントには、独自のスキップパーサーを作成することができますが、実際にそれを行う方法の例はありません。Boost :: Spiritを使用したカスタムスキップパーサー
私はちょうど例のコードか何かを必要としていました、私は今2時間グーグルで行ってきました。
私にはexamplesを指摘しないでください。いくつかのリンクは絶望的に古く、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
を使用してこれを解析する場合は、スキッパー文法オブジェクトを与える必要があります。私はこれを知らなかった:
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);
これは動作します。
ありがとうございます。あなたは今日私に多くの時間を救った! – Dilawar
Boostディストリビューションに付属のサンプルを見ましたか? –