2011-12-15 15 views
15

Trình thu thập thông thường chuẩn ascii::space_type không bỏ qua nhận xét của tôi. Các tài liệu đề cập đến bạn có thể làm cho trình phân tích cú pháp bỏ qua của riêng bạn nhưng không có ví dụ về thực sự làm thế nào để làm điều đó.Trình phân tích cú pháp tùy chỉnh bỏ qua với Boost :: Spirit

Tôi chỉ cần một mã ví dụ hoặc bất kỳ thứ gì, tôi đã googling trong 2 giờ ngay bây giờ.

Vui lòng không chỉ cho tôi đến số examples, một vài liên kết hoạt động vô vọng đã lỗi thời, xử lý với Spirit 1.6.

+0

Bạn đã xem các ví dụ đi kèm với bản phân phối Boost chưa? –

Trả lời

27

Sau một số thử nghiệm, tôi đã tìm thấy một cách để chỉ định một đội trưởng tùy chỉnh và sẽ phác thảo nó ở đây:

template<typename Iterator> 
struct pl0_skipper : public qi::grammar<Iterator> { 

    pl0_skipper() : pl0_skipper::base_type(skip, "PL/0") { 
     skip = ascii::space | ('{' >> *(qi::char_ - '}') >> '}'); 
    } 
    qi::rule<Iterator> skip; 
}; 

template<typename Iterator, typename Skipper = pl0_skipper<Iterator>> 
struct pl0_grammar : public qi::grammar<Iterator, Skipper> { 

    /* The rules use our skipper */ 
    qi::rule<Iterator, Skipper> start; 
    qi::rule<Iterator, Skipper> block; 
    qi::rule<Iterator, Skipper> statement; 

}; 

Bí mật nằm trong các cuộc gọi của bộ phân tích. Vì lý do nào đó, khi bạn muốn phân tích cú pháp này bằng cách sử dụng parse_phrase, bạn phải cung cấp đối tượng ngữ pháp cho người bỏ qua. Tôi không biết điều này:

typedef std::string::const_iterator iterator_t; 
typedef parser::pl0_grammar<iterator_t> grammar; 
typedef parser::pl0_skipper<iterator_t> skipper; 

grammar g; 
skipper ws; 

iterator_t iter = str.begin(); 
iterator_t end = str.end(); 
bool r = phrase_parse(iter, end, g, ws); 

Tác phẩm này.

+1

Cảm ơn vì điều này. Bạn đã cứu tôi rất nhiều thời gian hôm nay! – Dilawar