将精神X3解析器封装在课堂上

Encapsulate Spirit X3 parser in class

本文关键字:封装 课堂 X3      更新时间:2023-10-16

我试图将X3解析器封装在类中,其中规则(及其定义)是成员,即与Qi解析器的结构相似,其中必须从Boost::Spirit :: Qi ::语法。

这种方法的优点是什么:

  • 代码分离比示例中使用的名称空间方法更好(例如,避免命名空间冲突)
  • 仅当生成此类的对象而不是解析器(单个规则)为静态时,解析器才实例化
  • 潜在参数(例如问题解析器规则取决于参数)可以给出构造函数并以"直接"方式集成,而不是使用<>指令
  • 使用

但这似乎是不可能的。auto name = rule<class name, std::string>() = alpha >> *alnum;表格中定义规则(或规则定义)不是一个选项,因为类成员无法使用auto。另一方面,除了很小的解析器外,实际类型似乎也不实用。建模替代方案是将规则作为成员并在构造函数中创建定义,但是在这里,通常使用boostrongpirit_define进行的链接是不可能的,并且仅规则不足以解析(static_assert失败"这个规则。")。

另外,将整个解析器都以类方法的形式使用,例如创建解析器的 ParseXYZ::parse()可能是通过另一种方法使其仅创建一次 - 并且解析输入,在代码重复使用时并不是一个选择(除了复制&amp; paste)。

您知道是否可以将X3解析器封装在班级中?除此之外,您还建议在x3中构建可重复使用的解析器?

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