2010-03-11 30 views
9

Không nên đơn giản eol làm thủ thuật?Làm cách nào để phân tích cú pháp cuối cùng với tăng :: tinh thần :: qi?

#include <algorithm> 
#include <boost/spirit/include/qi.hpp> 
#include <iostream> 
#include <string> 
using boost::spirit::ascii::space; 
using boost::spirit::lit; 
using boost::spirit::qi::eol; 
using boost::spirit::qi::phrase_parse; 

struct fix : std::unary_function<char, void> { 
    fix(std::string &result) : result(result) {} 
    void operator() (char c) { 
    if  (c == '\n') result += "\\n"; 
    else if (c == '\r') result += "\\r"; 
    else    result += c; 
    } 
    std::string &result; 
}; 

template <typename Parser> 
void parse(const std::string &s, const Parser &p) { 
    std::string::const_iterator it = s.begin(), end = s.end(); 
    bool r = phrase_parse(it, end, p, space); 
    std::string label; 
    fix f(label); 
    std::for_each(s.begin(), s.end(), f); 
    std::cout << '"' << label << "\":\n" << " - "; 
    if (r && it == end) std::cout << "success!\n"; 
    else std::cout << "parse failed; r=" << r << '\n'; 
} 

int main() { 
    parse("foo",  lit("foo")); 
    parse("foo\n", lit("foo") >> eol); 
    parse("foo\r\n", lit("foo") >> eol); 
} 

Output:

"foo": 
    - success! 
"foo\n": 
    - parse failed; r=0 
"foo\r\n": 
    - parse failed; r=0

Tại sao sau hai thất bại?


câu hỏi liên quan:

Using boost::spirit, how do I require part of a record to be on its own line?

Trả lời

13

Bạn đang sử dụng space như đội trưởng cho các cuộc gọi của bạn để phrase_parse. Trình phân tích cú pháp này khớp với bất kỳ ký tự nào mà std::isspace trả về true (giả sử bạn đang thực hiện phân tích dựa trên ascii). Vì lý do này, số \r\n trong đầu vào được người đội trưởng của bạn ăn trước khi họ có thể xem trình phân tích cú pháp của bạn eol.

+1

Sử dụng 'cụm từ_parse (nó, kết thúc, p, dấu cách - eol)' cho phép 'eol' thành công. Cảm ơn! –

+1

@GregBacon Khi tôi gõ 'không gian - eol', tôi nhận được thông báo lỗi rất kỳ lạ và dài. – Dilawar

+1

@Dilawar Xem câu trả lời này http://stackoverflow.com/a/10469726/85371] để biết các gợi ý và kỹ thuật liên quan để thay đổi hành vi của người bỏ mũ – sehe

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