我试图将一个X3解析器封装在一个类中,其中规则(及其定义)是成员,即类似于Qi解析器的结构,其中一个必须派生自boost :: spirit :: qi :: grammar
这种方法的优点是什么:
但这似乎不太可能。在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中构建可重用的解析器?
答案 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}
。