解析时动态切换解析器

Posted

技术标签:

【中文标题】解析时动态切换解析器【英文标题】:Dynamically switch parser while parsing 【发布时间】:2018-11-28 16:37:08 【问题描述】:

我正在解析spice netlists,我已经有一个解析器。由于我实际上使用幽灵(节奏,集成电子),我想支持两种模拟器语言(不幸的是,它们不同)。我可以使用开关(例如命令行)并从一开始就使用正确的解析器。但是,幽灵允许 simulator lang=spectre 声明,我也想支持(当然反之亦然)。如何使用 boost::spirit 做到这一点?

我的语法大致是这样的:

line = component_parser             | 
       command_parser               |  
       comment_parser               | 
       subcircuit_parser            | 
       subcircuit_instance_parser;

main = -line % qi::eol >> qi::eoi;

这种***结构对两种语言都适用,所以我需要更改子解析器。我的第一个想法是让***解析器将实例(或对象)保存到相应的解析器并打开查找simulator lang 语句(带有语义操作)。这是一个好方法吗?如果没有,其他人会怎么做呢?

【问题讨论】:

您是否尝试过重新分配给line(或main 或其他合适的规则)? 到目前为止我还没有尝试过任何东西,但这与我对各个解析器的不同实例的想法相似。但是,使用 boost 精神从来都不是一件容易的事,所以我不确定在实际使用解析器来消耗输入的同时切换解析器是否可以。另外,也许有一种很好的、​​精神上的方式来做这样的事情。 【参考方案1】:

您可以使用qi::lazy (https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/reference/auxiliary/lazy.html)。

有一个与之相关的惯用模式,称为The Nabialek Trick。

我在这个网站上有几个答案展示了这些不同的技术。

https://***.com/search?q=user%3A85371+qi%3A%3Alazy

【讨论】:

所以就这么简单。谢谢,我目前正在研究它,看起来不错。不知何故,我认为我无法应用此策略。

以上是关于解析时动态切换解析器的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 3.6动态方言解析器

Flink的类加载器解析

3Python迭代器列表解析及生成器(0530)

通用日志解析器算法

Swagger OpenApi 动态查询参数名称使用 Spring 自定义解析器的注释

使用 buildSchema 时如何访问字段解析器中父解析器的值?