首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类中封装精神X3解析器

在类中封装精神X3解析器
EN

Stack Overflow用户
提问于 2016-11-29 16:31:19
回答 1查看 211关注 0票数 2

我试图将一个X3解析器封装在一个类中,其中的规则(及其定义)是成员,也就是说,类似于气解析器的结构,其中必须从boost::spirit::Qi::语法派生出来。

这种方法的优点是:

  • 比示例中使用的命名空间方法更好地分离代码(例如,避免名称空间冲突)
  • 只有当生成该类的对象时,解析器才被实例化,而不是解析器(单个规则)是静态的。
  • 可能的参数(例如,问题Parser rule dependent on parameter)可以给构造函数,并以“直接”的方式进行集成,而不是使用with<>指令。

但这似乎是不可能的。在表单auto name = rule<class name, std::string>() = alpha >> *alnum;中定义规则(或者更确切地说是规则定义)不是一个选项,因为类成员不可能使用auto。另一方面,除了非常小的解析器之外,声明实际类型似乎也不实际。另一种建模方法是将规则作为成员并在构造函数中创建定义,但是在这里,它们之间的链接(通常是用BOOST_SPIRIT_DEFINE完成的)是不可能的,而且仅靠规则本身还不足以解析(static_assert失败了“未为此规则定义的BOOST_SPIRIT_DEFINE”)。

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

您知道是否可以将X3解析器封装在类中吗?此外,您对在X3中构建可重用解析器有什么建议?

EN

回答 1

Stack Overflow用户

发布于 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}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40870934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档