我有日期时间解析器和日期时间数组解析器。
datetime_ = qi::eps[at_c<0>(qi::_val) = type::datetime] >>
dt_string[at_c<1>(qi::_val) = qi::_1];
dt_string = (/*qi::lit("d") >>*/ qi::int_ >> "-" >> qi::int_ >> "-" >> qi::int_ >> "T" >>
qi::int_ >> ":" >> qi::int_ >> ":" >> qi::int_ >> -("." >> qi::int_))
[qi::_val = construct<datetime>(qi::_1, qi::_2, qi::_3,
qi::_4, qi::_5, qi::_6)];
dt_array_ = qi::eps[at_c<0>(qi::_val) = type::datetime_array] >>
dt_array_lit[at_c<1>(qi::_val) = qi::_1];
dt_array_lit = "[" >> +(dt_string % ',') >> ']';
数组解析器按预期工作,但单日期文字解析器在第4个位置(“2010-09-23 ....”)提供解析错误。我认为这是因为还有数字解析器定义,当它在数字后面找到“ - ”时失败。
number %= qi::attr(type::number) >> qi::double_;
但是数字数组解析器也存在,它不与datetime数组解析器冲突。
number_array_ = qi::eps[at_c<0>(qi::_val) = type::number_array] >>
number_array_lit[at_c<1>(qi::_val) = qi::_1];
number_array_lit = "[" >> +(qi::double_ % ',') >> ']';
现在我使用变通方法,在datetime literal之前加上前缀“d”。您可以在第一个代码段中看到它的评论。但是如果可能的话,我希望在所有上下文中正确解析UTC datetime文字。
答案 0 :(得分:0)
我自己解决了。改变了
的解析顺序 prim =
number [qi::_val = qi::_1] |
//.....
datetime_ [qi::_val = qi::_1] |
//...;
到
prim =
datetime_ [qi::_val = qi::_1] |
// ...
number [qi::_val = qi::_1] |
//...;
现在它按预期工作。
修改强> 小记。对于数组解析器,顺序无关紧要。