解析にはboost::spiritを使用する必要があり、phrase_parse関数を使用したい:
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol);
しかし、4番目の用語(ascii :: space-qi :: eol)は、私のコンパイラでは許可されていません。eolをスキップせずにスキッパーASCII::スペースを使用するにはどうすればよいですか?
解析にはboost::spiritを使用する必要があり、phrase_parse関数を使用したい:
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol);
しかし、4番目の用語(ascii :: space-qi :: eol)は、私のコンパイラでは許可されていません。eolをスキップせずにスキッパーASCII::スペースを使用するにはどうすればよいですか?
最も簡単な答えは
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank);
もちろん、それは文法にも依存します。特定のスキッパークラスが必要な場合は、それを変更する必要があるかもしれません。これを処理する一般的な方法については、以下を参照してくださいqi::blank_type
(ただし、受け入れる必要がある文法を指定することもできますqi::blank
)。
サンプルは任意のスキッパーも処理します。
スピリットには、スキッパーの使用に影響を与えるいくつかのディレクティブがあります。
スキッパーに関係なく部分式を解析します(たとえば、文法の文字列リテラルに役立ちます)
生のソースイテレータ範囲を返します。つまり、スキップされた入力が結果に含まれます。
部分式に使用されるスキッパーのタイプを明示的に変更するために使用できます
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"));
}