2

我试图将 X3 解析器封装在一个类中,其中规则(及其定义)是成员,即类似于 Qi 解析器的结构,其中必须从 boost::spirit::qi::grammar 派生。

这种方法的优点是什么:

  • 比示例中使用的命名空间方法更好地分离代码(例如,避免命名空间冲突)
  • 解析器仅在生成此类的对象时才被实例化,而不是解析器(各个规则)是静态的
  • 潜在参数(例如依赖于参数的问题解析器规则)可能会被提供给构造函数并以“直接”方式集成,而不是使用with<> 指令

但这似乎不可能。在表单中定义规则(或者更确切地说是规则定义)auto name = rule<class name, std::string>() = alpha >> *alnum;不是一个选项,因为auto对于类成员来说是不可能的。另一方面,除了非常小的解析器之外,说明实际类型似乎也不实用。一种建模替代方法是将规则作为成员并在构造函数中创建定义,但在这里它们之间的链接通常使用 BOOST_SPIRIT_DEFINE 完成,是不可能的,并且仅靠规则不足以解析(static_assert failed "BOOST_SPIRIT_DEFINE undefined for这条规则。”)。

此外,将整个解析器放在一个类方法中,例如ParseXYZ::parse(),它创建解析器 - 可能通过另一种方法,这样它只创建一次 - 并解析输入,在代码重用方面并不是一个真正的选择(除了复制和粘贴)。

您知道是否可以将 X3 解析器封装在一个类中?除此之外,您对在 X3 中构建可重用解析器有何建议?

4

1 回答 1

1

是的,有可能,而不是auto name = rule<class name, std::string>() = alpha >> *alnum;decltype(rule<class name, std::string>() = alpha >> *alnum) name;在定义和name{rule<class name, std::string>() = alpha >> *alnum}构造函数中做。

于 2017-12-06T12:19:06.913 回答