x3 :: symbols移动结果,因此将其从symbol_parser本身中删除

时间:2016-02-21 21:38:11

标签: c++ boost boost-spirit boost-spirit-x3

所以,我在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实例。这意味着在第一次调用之后它再次为空,这就是为什么只出现第一条指令的原因。简单地说,它已移出符号表。

现在终于我的问题了: 这是一个错误还是我犯了错误?

1 个答案:

答案 0 :(得分:3)

正如我的解决方法所建议的那样:

我找到了一个临时解决方法:通过将模板参数声明为const,可以抑制移动语义。然后调用复制器。

I.E。:x3::symbols<const std::string>