2017-07-18 82 views
2

我最終得到了這些移動錯誤很多,我不太清楚爲什麼除了解析字符串的方式之外。刪除與「虛擬」相關的所有內容,並返回錯誤。X3,attr_gen是什麼?

有人提到使用attr_gen(在文檔中找不到),通過這樣做,我可以通過這些「traits :: move_to」編譯錯誤,但解析器仍然失敗。我已經標記了我爲了編譯而添加的行,但不要認爲「< ---」是必要的。

#define BOOST_SPIRIT_X3_DEBUG 

#include <complex> 
#include <iostream> 
#include <string> 
#include <vector> 

#include <boost/spirit/home/x3.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 
#include <boost/fusion/include/io.hpp> 

namespace client { 
    namespace ast { 
     struct number { 
      int num1; 
      int num2; 
     }; 

     struct comment { 
      std::string text; 
      bool dummy;  // <--- 
     }; 

     struct input { 
      std::vector<comment> comments; 
      std::vector<number> numbers; 
     }; 
    } 
} 

BOOST_FUSION_ADAPT_STRUCT(client::ast::comment, text, dummy) // <--- 
BOOST_FUSION_ADAPT_STRUCT(client::ast::number, num1, num2) 
BOOST_FUSION_ADAPT_STRUCT(client::ast::input, comments, numbers) 

namespace client {  
    namespace parser { 

     namespace x3 = boost::spirit::x3; 
     namespace ascii = boost::spirit::x3::ascii; 

     using namespace x3; 
     x3::attr_gen dummy; // <---     

     auto const comment = char_ % ' ' >> dummy(false);  // <--- 
     //auto const comment = lexeme[+graph] >> dummy(false); 
     auto const number = int_ >> int_; 

     auto lines = [](auto p) { return *(p >> eol); }; 

     auto const input = skip(blank) [ 
      lines(comment) >> 
      lines(number) 
     ]; 
    } 
} 

int main() 
{ 
    namespace x3 = boost::spirit::x3; 
    using boost::spirit::x3::ascii::blank; 
    using x3::char_; 

    std::string const iss(R"(this is a test 
    1 2)"); 

    auto iter = iss.begin(), eof = iss.end(); 

    client::ast::input types; 

    bool ok = parse(iter, eof, client::parser::input, types); 

    if (iter != eof) { 
     std::cout << "Remaining unparsed: '" << std::string(iter, eof) << "'\n"; 
    } 
    std::cout << "Parsed: " << (100.0 * std::distance(iss.begin(), iter)/iss.size()) << "%\n"; 
    std::cout << "ok = " << ok << std::endl; 

    for (auto& item : types.comments) { std::cout << boost::fusion::as_deque(item) << "\n"; } 
    for (auto& item : types.numbers) { std::cout << boost::fusion::as_deque(item) << "\n"; } 
} 
+0

如果拆分了關於解析的問題直到行結束爲止......一次詢問兩個不相關的問題就會使問題在未來對其他人無用。 – sehe

+0

所以你忘了其他問題?我已經得到了答案[坐在這裏等待](https://stackoverflow.com/a/45162122/85371) – sehe

+0

不得不逃跑,認爲它看起來很簡單。刪除了'直到問題'的問題。但是,我嘗試了所有這三種方法,並繼續出現錯誤。我並不太熟悉Qi和X3的差異,但我使用的是X3。我已將我的分析更改爲phrase_parse,但不知何故規則不能很好地與我有什麼混合。「保持字符串解決方法」是我選擇關注的方法,因爲它似乎是一個很好的解決方法。 – Ender

回答

0
comment = char_ % ' '; 

此解析由單個空格文字分離1個以上的任意字符。在你的情況下,它可能只匹配't',因爲接下來是'h',而不是' '

我自然拼寫

comment = *(char_ - eol); 

所以它會匹配任何東西,直到eol。如果你堅持匹配「羅嗦」的東西,用一切手段

comment = skip(blank) [ *lexeme[+graph_] ]; 

要綜合匹配輸入字符串的屬性,把它包在raw[]

comment = raw [ skip(blank) [ *graph_ ] ]; 

或者如果你確實想沒有其他空格比' ',做起來很

comment = raw[ skip(' ') [ *graph_ ] ]; 

它稍顯怪異拼寫它像

comment = raw[ (+graph_) % ' ' ]; 

因爲

  • 它不匹配一個空行
  • 不匹配"hello world"或'「你好\ t世界」」