传递参数以提升精神自定义解析器
Passing arguments to boost spirit custom parser
我正在尝试按照此处的说明创建自定义解析器:http://boost-spirit.com/home/articles/qi-example/creating-your-own-parser-component-for-spirit-qi/。在本文中,解析器没有参数,即我不能写类似qi::parse(first, input.end(), +qi::alpha >> custom_parser::iter_pos("my argument"));
的东西。如何修改示例以传递参数?我试过这个:
using namespace boost::spirit;
namespace parsernm { BOOST_SPIRIT_TERMINAL(aparser); }
namespace boost { namespace spirit {
template <typename A0>
struct use_terminal<
qi::domain
, terminal_ex<
parsernm::tag::aparser
, fusion::vector1<A0>
>
> : mpl::true_
{};
}}
namespace parsernm
{
struct aparser_impl : boost::spirit::qi::primitive_parser<aparser_impl>
{
aparser_impl(int _param)
: param(_param)
{}
template <typename Iterator, typename Context, typename Skipper, typename Attribute>
bool parse(Iterator& first, Iterator const& last, Context&,
Skipper const& skipper, Attribute& attr) const
{
return true;
}
template <typename Context>
boost::spirit::info what(Context&) const {
return boost::spirit::info("aparser");
}
int param;
};
}
namespace boost { namespace spirit { namespace qi {
template <typename Modifiers>
struct make_primitive<parsernm::tag::aparser, Modifiers>
{
typedef parsernm::aparser_impl result_type;
template <typename Terminal>
result_type operator()(Terminal const& term, unused_type) const
{
return result_type(fusion::at_c<0>(term.args));
}
};
}}}
int main(int argc, char* argv[])
{
std::string input("");
std::string::iterator first = input.begin();
bool result = qi::parse(first, input.end(), parsernm::aparser(10));
return 0;
}
结果是 boost\spirit\home\qi\detail\parse.hpp(32):错误 C2338:error_invalid_expression。
我明白了。 BOOST_SPIRIT_TERMINAL
必须更改为 BOOST_SPIRIT_TERMINAL_EX
.make_primitive
应如下所示:
namespace boost { namespace spirit { namespace qi {
template <typename Modifiers, typename A0>
struct make_primitive<
terminal_ex<
parsernm::tag::aparser
, fusion::vector1<A0>
>
, Modifiers
>
{
typedef parsernm::aparser_impl result_type;
template <typename Terminal>
result_type operator()(Terminal const& term, unused_type) const
{
return result_type(fusion::at_c<0>(term.args));
}
};
}}}
相关文章:
- 参数化自定义CMake工具链
- 没有默认构造函数作为模板参数的自定义比较器
- C++ 通过自定义赋值运算符隐式转换函数参数
- C++自定义分配器大小参数作为模板参数会引发编译器错误
- 如何实现接受参数的自定义流操纵器?
- 将自定义对象作为参数从目标 C 传递到 C++
- 有没有办法使用 googletest 创建自定义参数生成器?
- 使用自定义参数的过载删除操作员
- 如何将参数传递到自定义比较C 中分类的函数
- 示例自定义共享_ptr-我如何传递构造函数参数 - 我在此处使用variadic模板
- 自定义一元/二进制Expr() eigen3 的参数
- JNI自定义异常具有多个参数
- 与自定义比较函数作为模板参数的编译器错误
- 特征自定义类和函数参数
- 初始化在 C++ 中自定义类的构造函数中没有参数的静态 const 类成员
- Cython:具有自定义参数类型的STD ::功能回调
- 将自定义参数传递到Qt/C++中的插槽
- 使用自定义参数进行 QAction
- Qt-具有自定义参数的可重用绘制函数
- 带有自定义参数的Sendmessage /postmessage