向 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]);
但不幸的是,这甚至没有编译,我得到了错误消息
没有帮助(至少对我而言)?我想这很简单......但我现在无可救药地陷入困境。 :-(
有人知道我做错了什么吗?
两种方式:
修复 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_string
从std::vector<char>
强制属性类型
不过,当然一如既往: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")?
感谢用户 '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]);
但不幸的是,这甚至没有编译,我得到了错误消息 没有帮助(至少对我而言)?我想这很简单......但我现在无可救药地陷入困境。 :-(
有人知道我做错了什么吗?
两种方式:
修复 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¹ 将 selectstd::ref
(因为std::string
) - 使用
as_string
从std::vector<char>
强制属性类型
- 它是
不过,当然一如既往: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")?