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

时间:2015-03-31 12:06:51

标签: parsing boost lambda

感谢用户的帮助' sehe'我现在处于可以接受的地步 编译我的。

(请参见此处: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]);

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

有人知道我做错了吗?

1 个答案:

答案 0 :(得分: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附加的表达式不会暴露两个元素,只有1个
    • 明确 phx::ref因为否则ADL¹会选择std::ref(因为std::string
    • 使用as_string来强制std::vector<char>
    • 中的属性类型


  2. 然而,当然,一如既往:Boost Spirit: "Semantic actions are evil"?

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

    使用解析器API绑定对属性的引用。

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