Parsing 向Boost Spirit解析器添加语义操作时发生编译错误

Parsing 向Boost Spirit解析器添加语义操作时发生编译错误,parsing,boost,lambda,Parsing,Boost,Lambda,多亏了用户“sehe”的帮助,我现在可以做到这一点了 编译我的ast (请看这里:) 现在,我需要解析从JEDEC文件中提取的一个数据字段如下所示: “12345 000010101010111010110101011010” 我已经构建了一个解析器来使用这些字段: std::string input("12345 010101010101010101010"); std::string::iterator st = input.begin(); qi::parse(st, input.end

多亏了用户“sehe”的帮助,我现在可以做到这一点了 编译我的ast

(请看这里:)

现在,我需要解析从JEDEC文件中提取的一个数据字段如下所示:

“12345 000010101010111010110101011010”

我已经构建了一个解析器来使用这些字段:

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

qi::parse(st, input.end(), qi::ulong_ >> ' ' >> *qi::char_("01"));
显然没有那么复杂。现在我的问题是我想分配 使用语义操作将ulong_uu和二进制字符串转换为某些局部变量。这就是我所做的:

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]);
但不幸的是,这甚至没有编译,我得到了错误消息 没有帮助(至少对我有帮助)?我想这很简单。。。但我现在陷入了绝望-(

有人知道我做错了什么吗?

有两种方法:

  • 修复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附加到的表达式没有公开两个元素,只有1
    • 它是显式的
      phx::ref
      ,因为否则ADLü将选择
      std::ref
      (因为
      std::string
    • 使用
      as_string
      强制属性类型来自
      std::vector

  • 然而,当然,一如既往:

    使用解析器API将引用绑定到属性


  • CharStyle

    如果你加入SSCCE,人们会更容易猜测错误。因为他们可能对你没有帮助,但缺席通常更没有帮助。我正好在这里,但大多数人会忽略这些问题。而且有很好的理由。你是对的,我只是在猜测时省略了一个完整的例子这当然是我这次错过的一件小事。但我会遵循你的建议,下次会更详细。谢谢你指出这一点!你再次阐明了这个问题……非常感谢!我真的想知道你是否考虑过写一本关于精神的烹饪书……说真的!如果值得的话:)我可能会感兴趣,如果一个倡议已经存在,那么我更愿意将字段的解析放在ast中。但是我不知道如何正确地设计ast,即使是对于这样一个简单的用例。我的问题是:一些标识符后面跟着另一个第二标识符,而另一些标识符不是。。。但如果你有一些有用的提示或链接,我很乐意深入挖掘!我会买你的书…答应过!
    qi::parse(st, input.end(),
              qi::ulong_ >> ' ' >> *qi::char_("01"),
              idx, sequence
        );