2010-10-24 22 views
6

Tôi chỉ đang làm việc với Boost.Spirit (từ Boost 1.44) trong ba ngày, cố gắng phân tích cú pháp thư e-mail nguyên bản bằng cách ngữ pháp chính xác trong RFC2822. Tôi nghĩ rằng tôi đã bắt đầu hiểu nó và nhận được ở đâu đó, nhưng sau đó tôi chạy vào một vấn đề:Boost.Spirit lỗi khi trộn "luân phiên" với "tùy chọn"?

#include <iostream> 
#include <boost/spirit/include/qi.hpp> 

namespace qi = boost::spirit::qi; 
using qi::omit; 
using qi::repeat; 
using std::cout; 
using std::endl; 

typedef qi::rule<std::string::const_iterator, std::string()> strrule_t; 

void test(const std::string input, strrule_t rule) { 
    std::string target; 
    std::string::const_iterator i = input.begin(), ie = input.end(); 

    if (qi::parse(i, ie, rule, target)) { 
     cout << "Success: '" << target << "'" << endl; 
    } else { 
     cout << "Failed to match." << endl; 
    } 
} 

int main() { 
    strrule_t obsolete_year = omit[-qi::char_(" \t")] >> repeat(2)[qi::digit] >> 
     omit[-qi::char_(" \t")]; 
    strrule_t correct_year = repeat(4)[qi::digit]; 

    test("1776", correct_year | repeat(2)[qi::digit]); // 1: Works, reports 1776. 
    test("76", obsolete_year);      // 2: Works, reports 76. 
    test("76", obsolete_year | correct_year);  // 3: Works, reports 76. 
    test(" 76", correct_year | obsolete_year);  // 4: Works, reports 76. 
    test("76", correct_year | obsolete_year);  // 5: Fails. 
    test("76", correct_year | repeat(2)[qi::digit]); // 6: Also fails. 
} 

Nếu thử nghiệm # 3 tác phẩm, thì tại sao không thử nghiệm # 5 - cùng kiểm tra chính xác với hai lựa chọn thay thế đảo ngược -- Thất bại?

Bằng cùng một mã thông báo, nếu bạn tha thứ cho biểu thức: nếu thử nghiệm # 4 hoạt động và không gian ở đầu được đánh dấu là tùy chọn, thì tại sao thử nghiệm # 5 (cùng một thử nghiệm với cùng một đầu vào chính xác , tiết kiệm không có không gian hàng đầu trong đầu vào) không thành công?

Và cuối cùng, nếu đây là lỗi trong Boost.Spirit (như tôi nghi ngờ nó phải là), làm thế nào tôi có thể làm việc xung quanh nó?

Trả lời

7

Đó là vì bạn đã nhấn một lỗi trong chỉ thị của Thánh Linh repeat[]. Cảm ơn báo cáo, tôi đã khắc phục vấn đề này trong SVN (rev. [66167]) và nó sẽ có sẵn trong Boost V1.45. Đồng thời tôi muốn thêm bài kiểm tra nhỏ của bạn như một bài kiểm tra hồi quy vào bộ kiểm tra của Spirit. Tôi hy vọng bạn không nhớ tôi làm như vậy.

+0

Cảm ơn bạn! Có, vui lòng sử dụng mã đó làm bài kiểm tra hồi quy. –

Các vấn đề liên quan