2014-10-08 63 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]      | 
    //...; 

,現在它按預期工作。

編輯: 小注。對於數組解析器而言,順序無關緊要。