2014-10-08 2 views
0

datetime 파서 및 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 % ',') >> ']'; 

배열 파서는 작동하지만, 하나의 날짜 리터럴 파서 ("2010-09-23 ....") 4 위치에서 구문 분석 오류를 제공합니다. 숫자 파서도 정의되어 있고 숫자 뒤에 "-"가 있으면 실패합니다.

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 리터럴에 접두사 "d"를 사용합니다. 첫 번째 스 니펫에서 주석으로 처리 된 것을 볼 수 있습니다. 그러나 가능하다면 모든 컨텍스트에서 올바르게 날짜/시간 리터럴을 파싱하고 싶습니다.

답변

0

혼자서 해결했습니다. 예상대로 변경된

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

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

에서 분석의 순서와는 지금은 작동합니다.

편집 : 작은 노트. 배열 파서의 경우 순서는 중요하지 않습니다.