我试图将 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 中构建可重用解析器有何建议?