ブーストスピリットスキッパーに困っています。
そのようなファイルを解析する必要があります:
ROW int
int [int, int]
int [int, int]
...
最初のintの後に「_」を追加した場合にのみ、問題なく解析できます(stackoverflowのおかげです;)。
実際、スキッパーは最初の int の後に行末を食べると思うので、最初と 2 番目 (2 行目) は 1 つの int にしか見えません。eolを保持する方法がわかりませんが、スペースを食べます。hereおよびhereのようなカスタムパーサーを使用する例を見つけました。
qi::blank を試してみた、1 つのルールを持つカスタム パーサー lit(' ') どんなスキッパーを使用しても、スペースと eol は常に食べられます。
私の文法は次のとおりです。
一行:
struct rowType
{
unsigned int number;
std::list<unsigned int> list;
};
構造体に格納された完全な問題:
struct problemType
{
unsigned int ROW;
std::vector<rowType> rows;
};
行パーサー:
template<typename Iterator>
struct row_parser : qi::grammar<Iterator, rowType(), qi::space_type>
{
row_parser() : row_parser::base_type(start)
{
list = '[' >> -(qi::int_ % ',') >> ']';
start = qi::int_ >> list;
}
qi::rule<Iterator, rowType(), qi::space_type> start;
qi::rule<Iterator, std::list<unsigned int>(), qi::space_type> list;
};
および問題のパーサー:
template<typename Iterator>
struct problem_parser : qi::grammar<Iterator,problemType(),qi::space_type>
{
problem_parser() : problem_parser::base_type(start)
{
using boost::phoenix::bind;
using qi::lit;
start = qi::int_ >> lit('_') >> +(row);
//BOOST_SPIRIT_DEBUG_NODE(start);
}
qi::rule<Iterator, problemType(),qi::space_type> start;
row_parser<Iterator> row;
};
そして、私はそれを次のように使用します:
main() {
static const problem_parser<spirit::multi_pass<base_iterator_type> > p;
...
spirit::qi::phrase_parse(first, last ,
p,
qi::space,
pb);
}
もちろん、qi::space は私の問題であり、私の問題を解決する方法はスキッパーを使用しないことですが、phrase_parse にはスキッパーが必要であり、パーサーにはスキッパーが必要です。
数時間前から立ち往生しています...明らかに誤解していると思います。
ご協力いただきありがとうございます。