2015-03-31 35 views
1

感謝來自用戶'sehe'的幫助,我現在處於可以編譯我的ast文件的位置 。將語義動作添加到Boost Spirit分析器時編譯時出錯

(請在這裏看到:https://stackoverflow.com/a/29301655/1835623

現在從JEDEC文件中提取的數據字段我需要解析這樣的長相之一:

「12345 0000100101010111010110101011010」

我已經建立了一個解析器要消費這些領域:

std::string input("12345 010101010101010101010"); 
std::string::iterator st = input.begin(); 

qi::parse(st, input.end(), qi::ulong_ >> ' ' >> *qi::char_("01")); 

顯然不是那麼複雜。現在我的問題是我想使用語義動作將ulong_和二進制字符串分配給一些局部變量。這是我做過什麼:

using boost::phoenix::ref; 

std::string input("12345 010101010101010101010"); 
std::string::iterator st = input.begin(); 

uint32_t idx; 
std::string sequence; 
qi::parse(st, input.end(), 
      qi::ulong_[ref(idx) = qi::_1] >> 
      ' ' >> 
      *qi::char_("01")[ref(sequence) += qi::_2]); 

但不幸的是,這並不甚至編譯和錯誤消息我得到 是沒有幫助的(至少我)?我猜這是簡單的...但我現在絕望地卡住了。 ?:-(

是否有人有一個想法是什麼,我做錯了

+0

如果包括SSCCE人就要有一個更好的時間猜測的錯誤。因爲他們可能對你沒有幫助,但這種缺乏通常不會有幫助。你碰巧在這裏有我,但大多數人會忽略這些問題。並有很好的理由。 – sehe 2015-03-31 12:33:03

+0

你是對的,我剛剛省略了一個完整的例子,因爲我猜這肯定是我這次錯過的小事。但我會按照你的建議,下次更詳細。感謝您指出了這一點! – fhw72 2015-03-31 13:04:08

回答

1

兩種方式:

  1. 修復SA的

    qi::parse(st, input.end(), 
          qi::ulong_[ref(idx) = qi::_1] >> 
          ' ' >> 
          qi::as_string[*qi::char_("01")] [phx::ref(sequence) += qi::_1]); 
    

    注:

    • 它是qi::_1,因爲表達SA a ttaches以不公開兩個要素,只有1
    • 明確phx::ref,否則ADL¹將選擇std::ref(因爲std::string
    • 使用as_stringstd::vector<char>


    強制屬性類型
  2. 但是,當然,一如既往:Boost Spirit: "Semantic actions are evil"?

    qi::parse(st, input.end(), 
          qi::ulong_ >> ' ' >> *qi::char_("01"), 
          idx, sequence 
        ); 
    

    使用解析器API將引用綁定到屬性。

¹What is "Argument-Dependent Lookup" (aka ADL, or "Koenig Lookup")?

+0

再一次你在這個問題上發現了很多......非常感謝!我真的很想知道你是否曾經考慮過關於Spirit的食譜! – fhw72 2015-03-31 12:48:45

+0

如果支付:)我可能會感興趣,如果主動已經存在 – sehe 2015-03-31 12:51:39

+0

的確我更喜歡把字段解析爲ast。但即使對於這樣一個簡單的用例,我也不太瞭解如何正確設計ast。我的問題是:一些標識符後面跟着另一個第二標識符,其他一些標識符不是......但是如果您有一些有用的提示或鏈接,我會愉快地深入挖掘! ps:我會買你的書...承諾! – fhw72 2015-03-31 12:52:56

相關問題