如何在Boost.Parser中向解析器传递参数?
如何在Boost.Parser中向解析器传递参数?
我太懂这种转新库的迷茫了!刚从Boost.Spirit.Qi转用Boost.Parser的时候,我也纠结过怎么传递符号表这类参数——毕竟Qi里靠带成员的grammar就能轻松搞定,但Boost.Parser取消了grammar,规则还得写在全局作用域,确实有点不适应。
先给你揪出你代码里的核心问题:你的规则模板参数没声明要接收参数!你定义的toprule只指定了返回类型double,但没告诉它需要接收一个bp::symbols<double> const &类型的参数,所以编译肯定会报错。
下面是修正后的完整代码,我会一步步给你解释:
#include <boost/parser/parser.hpp> namespace bp = ::boost::parser; // 调整rule的模板参数,第三个模板参数指定规则要接收的参数类型(这里是const引用的symbols<double>) bp::rule<struct toprule, double, bp::symbols<double> const &> toprule = "toprule"; // 这里用_bp<0>引用第一个传入的参数,和你原来的写法一致,现在参数类型匹配了 auto const toprule_def = bp::double_ >> bp::_p<0>; BOOST_PARSER_DEFINE_RULES(toprule); static void ParamTest(const bp::symbols<double> &syms) { // 这里的with()传参写法是对的,现在规则能正确接收参数了 auto result = bp::parse("10.3", toprule.with(syms), bp::ws); }
关键的修改点:
- 规则模板参数:在
bp::rule的第三个模板参数位置,加上你要传递的参数类型bp::symbols<double> const &——Boost.Parser的规则模板参数顺序是:标签类型、返回值类型、参数类型列表(可以是多个,用逗号分隔)。 - 参数引用:
bp::_p<0>确实对应你传入的第一个参数,这个写法没问题,之前报错只是因为规则没声明要接收参数。
再帮你理清楚Boost.Parser的思路:它不需要像Qi那样把符号表存在grammar成员里,而是通过带参数的规则来实现外部数据的传递。你只需要在规则定义时声明好要接收的参数类型,然后在调用解析的时候用with()方法把参数传进去就行,完美替代了Qi里grammar成员的作用。
如果以后要传递多个参数,只需要在规则的模板参数里依次添加,比如bp::rule<struct my_rule, int, int, std::string const &>,然后用_p<0>、_p<1>分别引用第一个和第二个参数就行。
内容来源于stack exchange
相关产品推荐
相关产品推荐

