我在提升精神船长方面遇到了麻烦。
我需要解析这样的文件:
ROW int
int [int, int]
int [int, int]
...
只有当我在第一个 int 之后添加一个“_”时,我才能毫无问题地解析它(感谢 stackoverflow;)。
事实上,我认为船长在第一个 int 之后吃掉了行尾,所以第一个和第二个(在第二行)看起来只有一个 int。我不明白如何保持 eol 但吃空间。我找到了使用自定义解析器的示例,例如这里和这里。
我尝试了 qi::blank,使用一条规则的自定义解析器 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 需要一个,然后我的解析器需要一个。
我已经被困了几个小时了......我认为这很明显我误解了。
谢谢你的帮助。