向 Boost Spirit 解析器添加语义操作时出现编译错误

Compile error when adding semantic action to Boost Spirit parser

感谢用户 'sehe' 的帮助,我现在可以 编译我的ast.

(请看这里:

现在我需要解析的从 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]);

但不幸的是,这甚至没有编译,我得到了错误消息 没有帮助(至少对我而言)?我想这很简单......但我现在无可救药地陷入困境。 :-(

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

两种方式:

  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 附加到的表达式不公开两个元素,只是 1
    • 它是 明确地 phx::ref 因为否则 ADL¹ 将 select 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")?