【发布时间】:2020-05-25 21:25:23
【问题描述】:
我正在尝试以增强精神编写通用解析器生成器。我想出了以下代码:
auto attr_to_val = [](auto& ctx) { _val(ctx) = boost::fusion::at_c<2>(_attr(ctx)); };
auto parser_gen = [](const std::string a, auto&& p) {
return((boost::spirit::x3::string(a) >> boost::spirit::x3::blank >> p)[attr_to_val]);
};
并尝试像这样使用它:
int a;
auto action = [&a](auto& ctx) { a = _val(ctx); };
auto parser = (parser_gen("aaa", boost::spirit::x3::uint_))[action];
parse(bar.begin(), bar.end(), parser);
但它给出了很多关于无法将boost::fusion::deque 转换为int 的错误。另一方面,当我稍微改变一下时,恕我直言,相当于上面模板代码的扩展:
auto pars = (
boost::spirit::x3::string("aaa") >>
boost::spirit::x3::blank >> boost::spirit::x3::uint_)[attr_to_val];
int a;
auto action = [&a](auto& ctx) { a = _val(ctx); };
parse(bar.begin(), bar.end(), pars);
一切都好。我做错了什么,如何让parser_gen 工作?
【问题讨论】:
标签: c++ c++11 boost boost-spirit