2012-05-02 36 views
7

Tôi đang cố gắng tìm hiểu boost::spirit. Ví dụ, tôi đang cố gắng phân tích một chuỗi các từ thành một số vector<string>. Tôi cố gắng này:Làm thế nào để sử dụng boost :: tinh thần để phân tích một chuỗi các từ vào một vector?

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

namespace qi = boost::spirit::qi; 

int main() { 

    std::vector<std::string> words; 
    std::string input = "this is a test"; 

    bool result = qi::phrase_parse(
     input.begin(), input.end(), 
     +(+qi::char_), 
     qi::space, 
     words); 

    BOOST_FOREACH(std::string str, words) { 
    std::cout << "'" << str << "'" << std::endl; 
    } 
} 

mà mang lại cho tôi kết quả này:

'thisisatest' 

nhưng tôi muốn đầu ra sau đây, trong đó mỗi chữ là lần xuất hiện riêng rẽ:

'this' 
'is' 
'a' 
'test' 

Nếu có thể, tôi d muốn tránh phải xác định lớp con qi::grammar của riêng tôi cho trường hợp đơn giản này.

Trả lời

13

Bạn đang cơ bản hiểu lầm mục đích (hoặc ít nhất là lạm dụng) một phân tích cú pháp bỏ qua – qi::space, sử dụng như một phân tích cú pháp bỏ qua, là để làm phân tích cú pháp của bạn khoảng trắng bất khả tri như vậy là không có sự khác biệt giữa a bab.

Trong trường hợp của bạn, khoảng trắng quan trọng, vì bạn muốn nó phân tách các từ. Do đó, bạn không nên bỏ qua khoảng trắng, và bạn muốn sử dụng qi::parse hơn qi::phrase_parse:

#include <vector> 
#include <string> 
#include <iostream> 
#include <boost/foreach.hpp> 
#include <boost/spirit/include/qi.hpp> 

int main() 
{ 
    namespace qi = boost::spirit::qi; 

    std::string const input = "this is a test"; 

    std::vector<std::string> words; 
    bool const result = qi::parse(
     input.begin(), input.end(), 
     +qi::alnum % +qi::space, 
     words 
    ); 

    BOOST_FOREACH(std::string const& str, words) 
    { 
     std::cout << '\'' << str << "'\n"; 
    } 
} 

(Bây giờ cập nhật với sửa chữa của G. CIVARDI.)

+0

cũng được giải thích, +1 – sehe

2

Tôi tin rằng đây là phiên bản tối thiểu. qi :: bỏ qua được áp dụng trên bộ tách phân tách danh sách qi là không cần thiết - nó không tạo ra bất kỳ thuộc tính đầu ra nào. Để biết chi tiết, hãy xem: http://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/reference/operator/list.html

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

int main() 
{ 
    namespace qi = boost::spirit::qi; 

    std::string const input = "this is a test"; 

    std::vector<std::string> words; 
    bool const result = qi::parse(
     input.begin(), input.end(), 
     +qi::alnum % +qi::space, 
     words 
); 

    BOOST_FOREACH(std::string const& str, words) 
    { 
     std::cout << '\'' << str << "'\n"; 
    } 
} 
1

Chỉ trong trường hợp người khác gặp vấn đề về không gian hàng đầu của tôi.

Tôi đã sử dụng giải pháp của ildjarn, cho đến khi tôi chạy vào chuỗi bắt đầu bằng một số khoảng trắng.

std::string const input = " this is a test"; 

Tôi mất một thời gian để nhận ra rằng không gian dẫn đến sự cố chức năng qi :: parse (...). Giải pháp là cắt không gian đầu vào đầu vào trước khi gọi qi :: parse().

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