0

I have datetime parser and datetime array parser.

   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 % ',')   >> ']';

Array parser works as expected, but single date literal parser gives parse error at 4th position ("2010-09-23...."). I think it's because there is also number parser defined and it fails when it finds "-" after number.

   number    %= qi::attr(type::number) >> qi::double_;

But number array parser also exists and it doesn't conflict with datetime array parser.

   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_ % ',')   >> ']';

Now i use workaround, prefix "d" before datetime literal. You can see it commented in the first snippet. But if possible I would like just UTC datetime literal to be parsed properly in all contexts.

Alexander
  • 779
  • 8
  • 17

1 Answers1

0

Solved it by myself. Changed order of parsing from

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

to

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

and now it works as expected.

Edit: Little note. For array parsers order doesn't matter.

Alexander
  • 779
  • 8
  • 17