x3::symbols 移动结果,因此将其从 symbol_parser 本身中删除
x3::symbols moves result and therefore removes it from the symbol_parser itself
因此,我 运行 进入 st运行ge 行为 boost::spirit::x3,如 boost 1.59 中提供的那样:
我通过以下方式定义了一个 'dynamic' 符号 table:
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.
};
现在,在解析像
这样的输入字符串时,符号table嵌入到必要的规则中
mov r2 r1
mov r1 @80
生成的 ast 仅包含第一个 mov
及其操作 运行ds。
第二个 mov 丢失,但 ope运行ds 被正确解析。
在打印结果 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);
}
如您所见,src
是我在 symbol_parser 中添加的 OpCode 实例被移动了。这意味着在第一次调用后再次为空,这就是为什么只出现第一条指令的原因。简单地说,它移出符号 table.
现在我的问题终于来了:
这是错误还是我弄错了?
正如 sehe 所建议的,我的解决方法作为答案:
我找到了一个临时解决方法:通过将模板参数声明为 const 可以抑制移动语义。然后调用copy-ctor。
即:x3::symbols<const std::string>
因此,我 运行 进入 st运行ge 行为 boost::spirit::x3,如 boost 1.59 中提供的那样:
我通过以下方式定义了一个 'dynamic' 符号 table:
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.
};
现在,在解析像
这样的输入字符串时,符号table嵌入到必要的规则中mov r2 r1
mov r1 @80
生成的 ast 仅包含第一个 mov
及其操作 运行ds。
第二个 mov 丢失,但 ope运行ds 被正确解析。
在打印结果 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);
}
如您所见,src
是我在 symbol_parser 中添加的 OpCode 实例被移动了。这意味着在第一次调用后再次为空,这就是为什么只出现第一条指令的原因。简单地说,它移出符号 table.
现在我的问题终于来了: 这是错误还是我弄错了?
正如 sehe 所建议的,我的解决方法作为答案:
我找到了一个临时解决方法:通过将模板参数声明为 const 可以抑制移动语义。然后调用copy-ctor。
即:x3::symbols<const std::string>