2015-03-31 36 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