在类

时间:2016-11-29 16:31:20

标签: c++ boost-spirit-x3

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

这种方法的优点是什么:

  • 比示例中使用的命名空间方法更好地分离代码(例如,避免命名空间冲突)
  • 解析器仅在生成此类的对象而不是解析器(单个规则)为静态时实例化
  • 潜在参数(例如问题Parser rule dependent on parameter)可能会被赋予构造函数并集成在" direct"而不是使用与<>指令

但这似乎不太可能。在auto name = rule<class name, std::string>() = alpha >> *alnum;形式中定义规则(或者说规则定义)不是一个选项,因为类成员不能使用auto。另一方面,除了非常小的解析器之外,说明实际类型似乎也不实用。 建模替代方案是将规则作为成员并在构造函数中创建定义,但是这里它们之间的链接(通常使用BOOST_SPIRIT_DEFINE)是不可能的,并且单独的规则不足以解析(static_assert failed&#34; BOOST_SPIRIT_DEFINE未定义此规则。&#34;)。

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

您知道是否可以在类中封装X3解析器?除此之外,您有什么建议在X3中构建可重用的解析器?

1 个答案:

答案 0 :(得分:0)

是的,而不是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}