我试图将一个X3解析器封装在一个类中,其中的规则(及其定义)是成员,也就是说,类似于气解析器的结构,其中必须从boost::spirit::Qi::语法派生出来。
这种方法的优点是:
但这似乎是不可能的。在表单auto name = rule<class name, std::string>() = alpha >> *alnum;中定义规则(或者更确切地说是规则定义)不是一个选项,因为类成员不可能使用auto。另一方面,除了非常小的解析器之外,声明实际类型似乎也不实际。另一种建模方法是将规则作为成员并在构造函数中创建定义,但是在这里,它们之间的链接(通常是用BOOST_SPIRIT_DEFINE完成的)是不可能的,而且仅靠规则本身还不足以解析(static_assert失败了“未为此规则定义的BOOST_SPIRIT_DEFINE”)。
另外,将整个解析器放在类方法中,例如ParseXYZ::parse(),它创建解析器--可能是通过另一种方法创建的,只创建一次--并且解析输入,在代码重用方面(除了复制和粘贴之外),实际上并不是一个选项。
您知道是否可以将X3解析器封装在类中吗?此外,您对在X3中构建可重用解析器有什么建议?
发布于 2017-12-06 12:19:06
是的,它是可能的,而不是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}。
https://stackoverflow.com/questions/40870934
复制相似问题