有没有更好的方法可以用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
所以我发现我确实需要一些方法来进一步分解这个问题,而不仅仅是一系列串联的生产规则...