相同的字符串的解析方式不同

时间:2014-10-08 09:56:31

标签: c++ boost-spirit-qi

我有日期时间解析器和日期时间数组解析器。

   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文字。

1 个答案:

答案 0 :(得分:0)

我自己解决了。改变了

的解析顺序
   prim = 
     number          [qi::_val =  qi::_1]                        |
     //.....
     datetime_       [qi::_val =  qi::_1]                        |
     //...;

   prim =
     datetime_       [qi::_val =  qi::_1]                        |
     // ...
     number          [qi::_val =  qi::_1]                        |
     //...;

现在它按预期工作。

修改 小记。对于数组解析器,顺序无关紧要。