0

std::vector<int>を使用して、一連の整数を に解析したいと思いboost::spiritます。整数は、セミコロンまたは改行で区切ることができます。

しかし、この文法はコンパイルされません:

typedef std::vector<int> IntVec;
template <typename Iterator, typename Skipper>
struct MyGrammar : qi::grammar<Iterator, IntVec(), Skipper> {
  MyGrammar() : MyGrammar::base_type(start) {
    start = +(qi::int_
              >> (";" | qi::no_skip(qi::eol)));
  }
  qi::rule<Iterator, IntVec(), Skipper> start;
};

明確にするために、次の入力を解析したいと思います。たとえば、

1; 2; 3
4 ; 5

1 つのベクトルに(1,2,3,4,5). どうすればそれを行うことができ、私のバージョンがコンパイルされないのはなぜですか?

どうにかしてセパレーター (「セミコロンまたは改行」) を独自のルールとして記述できますか? その戻り値の型は何でしょうか? ある種のnull価値?

4

1 に答える 1

2

セミコロンをチェックする際にスキッパーをかけているようで、スキップ文字(改行を含む)は一度qi::no_skip[qi::eol]到達すると消費されてしまいます。以下は、no_skip最初にトークンを使用して、私のために働いています:

    start = qi::int_ % (qi::no_skip[qi::eol] | ';');

%最後の整数の後にセミコロンまたは行末を付ける必要がないように使用しています。

于 2012-05-06T02:49:00.863 に答える