相关疑难解决方法(0)

更多精神疯狂 - 解析器类型(规则与int_parser <>)和元编程技术

问题在底部以粗体显示,问题也通过最终的蒸馏代码片段进行了总结.

我试图统一我的类型系统(类型系统从类型到字符串)和单个组件(由Lakos定义).我正在使用boost::array,, boost::variantboost::mpl,以实现这一目标.我想让我的类型的解析器和生成器规则统一在一个变体中.有一个未定义的类型,一个int4(见下文)类型和一个int8类型.该变体读作variant<undefined, int4,int8>.

int4特征:

struct rbl_int4_parser_rule_definition
{
  typedef boost::spirit::qi::rule<std::string::iterator, rbl_int4()> rule_type;

  boost::spirit::qi::int_parser<rbl_int4> parser_int32_t;

  rule_type rule;

  rbl_int4_parser_rule_definition()
  {
    rule.name("rbl int4 rule");
    rule = parser_int32_t;  
  }
};

template<>
struct rbl_type_parser_rule<rbl_int4>
{
  typedef rbl_int4_parser_rule_definition string_parser;
};
Run Code Online (Sandbox Code Playgroud)

上面的变体从未定义开始,然后我初始化规则.我有一个问题,导致50页的错误,我终于设法跟踪它,Variant operator=在分配期间使用,而a boost::spirit::qi::int_parser<>不能分配给另一个(operator =).

相比之下,我的未定义类型没有问题:

struct rbl_undefined_parser_rule_definition
{
  typedef boost::spirit::qi::rule<std::string::iterator, void()> rule_type;
  rule_type rule;

  rbl_undefined_parser_rule_definition()
  {
    rule.name("undefined parse rule");
    rule = boost::spirit::qi::eps;
  }
};

template<>
struct rbl_type_parser_rule<rbl_undefined>
{
  typedef rbl_undefined_parser_rule_definition string_parser;
};
Run Code Online (Sandbox Code Playgroud)

蒸馏问题:

#include <string>
#include <boost/spirit/include/qi.hpp> …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit template-meta-programming

80
推荐指数
1
解决办法
3854
查看次数

Boost.spirit:解析数字char和string

我需要解析一行包含unsigned int,X要丢弃的字符和一个字符串,所有这些都用一个或多个空格分隔.例如,1234 X abcd

bool a = qi::phrase_parse(first, last,
      uint_[ref(num) = _1] >> lit('X') >> lexeme[+(char_ - ' ')],
      space, parsed_str);
Run Code Online (Sandbox Code Playgroud)

上面的代码解析了这三个部分,但字符串最终包含一个垃圾字符(?abcd),大小为5而不是4.

我的解析器出了什么问题?为什么字符串中有垃圾?

c++ boost-spirit boost-phoenix boost-spirit-qi

2
推荐指数
1
解决办法
1922
查看次数