2014-10-08 56 views
0

我有datetime parser和datetime数组解析器。相同的字符串被不同地解析

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_; 

但是数组数组解析器也存在,它不会与日期时间数组解析器发生冲突。

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

现在我使用变通方法,在日期时间字面值之前加上前缀“d”。你可以看到它在第一个片段中评论。但如果可能的话,我希望在所有上下文中正确解析UTC datetime文字。

回答

0

自己解决。解析改变顺序从

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

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

,现在它按预期工作。

编辑: 小注。对于数组解析器而言,顺序无关紧要。

相关问题