9

解析にはboost::spiritを使用する必要があり、phrase_parse関数を使用したい:

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol); 

しかし、4番目の用語(ascii :: space-qi :: eol)は、私のコンパイラでは許可されていません。eolをスキップせずにスキッパーASCII::スペースを使用するにはどうすればよいですか?

4

1 に答える 1

15

最も簡単な答えは

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank); 

もちろん、それは文法にも依存します。特定のスキッパークラスが必要な場合は、それを変更する必要があるかもしれません。これを処理する一般的な方法については、以下を参照してくださいqi::blank_type(ただし、受け入れる必要がある文法を指定することもできますqi::blank)。

サンプルは任意のスキッパーも処理します。

その他のヒント

スピリットには、スキッパーの使用に影響を与えるいくつかのディレクティブがあります。

  • qi::lexeme

    スキッパーに関係なく部分式を解析します(たとえば、文法の文字列リテラルに役立ちます)

  • qi::raw

    生のソースイテレータ範囲を返します。つまり、スキップされた入力が結果に含まれます。

  • qi::no_skipqi::skip

    部分式に使用されるスキッパーのタイプを明示的に変更するために使用できます

おすすめの読み物

Boost Spiritサイトには、このようなことについての素晴らしい記事があります

一般的なサンプル

#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

template <typename It, typename Skipper>
    struct parser : qi::grammar<It, Skipper>
{
    parser() : parser::base_type(start)
    {
        start = *qi::int_;
    }

  private:
    qi::rule<It, Skipper> start;
};

template <typename C, typename Skipper>
    void doParse(const C& input, const Skipper& skipper)
{
    auto f(std::begin(input)), l(std::end(input));

    parser<decltype(f), Skipper> p;
    bool ok = qi::phrase_parse(f,l,p,skipper);

    if (ok)   
        std::cout << "parse success\n";
}

int main()
{
    const std::string input = "1 2 3 4";
    doParse(input, qi::blank);
    doParse(input, qi::space);
    doParse(input, ~qi::char_("0-9"));
}
于 2012-05-06T10:10:25.643 に答える