所以,我在boost 1.59提供的boost :: spirit :: x3中遇到了奇怪的行为:
我定义了一个动态的'符号表通过:
struct instructions : x3::symbols<OpCode> {
instructions()
{
name("instructions");
}
void set_instruction_set(const std::unordered_map<std::string, OpCode>& instruction_set) {
for (const auto& var : instruction_set) {
add(var.first, var.second);
}
}
} instructions_parser;
OpCode
定义为
struct OpCode
{
std::string mnemonic;
std::vector<...> variants;// actual type in vector<> not important.
};
现在,在解析输入字符串(如
)时,符号表嵌入在必要的规则中mov r2 r1
mov r1 @80
结果只包含第一个mov
及其操作数。
第二个mov缺失但操作数被正确解析。
打印生成的AST时,这可能如下所示:
mov r2 r1
r1 @80
使用调试器,我在symbol_parser::parse()
中的symbols.hpp中找到了错误的来源:
template <typename Iterator, typename Context, typename Attribute>
bool parse(Iterator& first, Iterator const& last
, Context const& context, unused_type, Attribute& attr) const
{
x3::skip_over(first, last, context);
if (value_type* val_ptr
= lookup->find(first, last, get_case_compare<Encoding>(context)))
{
x3::traits::move_to(*val_ptr, attr); //<- the error originates from here
return true;
}
return false;
}
与move_to
建立:
template <typename T>
inline void move_to(T& src, T& dest)
{
if (boost::addressof(src) != boost::addressof(dest))
dest = std::move(src);
}
如您所见,移动了symbol_parser中添加的src
我的OpCode实例。这意味着在第一次调用之后它再次为空,这就是为什么只出现第一条指令的原因。简单地说,它已移出符号表。
现在终于我的问题了: 这是一个错误还是我犯了错误?
答案 0 :(得分:3)
正如我的解决方法所建议的那样:
我找到了一个临时解决方法:通过将模板参数声明为const,可以抑制移动语义。然后调用复制器。
I.E。:x3::symbols<const std::string>