Boost Spirit顺序键值解析器

时间:2019-03-22 15:29:48

标签: boost boost-spirit boost-spirit-qi

有没有更好的方法可以用Spirit做到这一点?我正在解析一系列连续的键值对,中间有一些行尾和其他残端。格式不一致,以至于我只能用一个规则提取键值对。所以我有一个适配器和生产规则,例如:

BOOST_FUSION_ADAPT_STRUCT(
  Record,
  ( std::string, messageHeader )
  ( double, field1 )
  ( std::string, field2 )
  ( Type3, field3 )
  // ...
  ( TypeN, fieldN )
)

template< typename Iterator, typename Skipper >
class MyGrammar : public qi::grammar< Iterator, Record(), Skipper >
{
public:
  MyGrammar() : MyGrammar::base_type{ record }
  {
    record =
      qi::string( "Message header" )
      >> field1 >> field2
      // ...
      >> fieldN;
    field1 = qi::lit( "field 1:" ) >> qi::double_;
    // ...
  }

  // field rule declarations...
};

这是一种简单但乏味的处理方式,而且我已经超过了编译器的规则复杂性阈值,这迫使我将字段重构为单独的规则。同样,如果在解析消息时出错,解析器将始终在字符串的开头显示错误,就像规则没有给它足够的上下文来指出问题的实际出处。我认为这是通过>>运算符的工作方式得出的。

编辑:

为回答sehe的问题,我在使用此方法和MSVC 15编译器时遇到了两个问题。第一个是我的顶级产品上的编译器错误,当它击中>>分隔的80个组件附近时:

recursive type or function dependency context too complex

因此,我将所有可能的事情都归入下级规则,以降低复杂性。不幸的是,在添加更多规则之后,我遇到了:

fatal error C1060: compiler is out of heap space

所以我发现我确实需要一些方法来进一步分解这个问题,而不仅仅是一系列串联的生产规则...

0 个答案:

没有答案