gpt4 book ai didi

c++ - 在类中封装 Spirit X3 解析器

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:52 25 4
gpt4 key购买 nike

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

这种方法的优点是什么:

  • 代码分离比示例中使用的 namespace 方法更好(例如,避免 namespace 冲突)
  • 解析器仅在生成此类的对象时实例化,而不是解析器(单独的规则)是静态的
  • 可能会将潜在参数(例如问题 Parser rule dependent on parameter)提供给构造函数并以“直接”方式集成,而不是使用with<> 指令

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

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

你知道是否可以在一个类中封装一个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}在构造函数中。

关于c++ - 在类中封装 Spirit X3 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40870934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com