添加语义动作提振精神解析器时编译错误(Compile error when adding seman

2019-10-22 10:54发布

由于从用户sehe“我现在在哪里我可以编译我的AST点帮助。

(请在这里看到: 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]);

但不幸的是,这并不甚至编译和错误消息我得到的是没有帮助的(至少我)? 我想这是简单的东西......但我现在绝望地卡住。 :-(

是否有人有一个想法,我做错了什么?

Answer 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. 但是,当然,一如既往: 升压精神:“语义行为是邪恶的”?

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

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

¹ 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?



文章来源: Compile error when adding semantic action to Boost Spirit parser