解析时动态切换解析器

Dynamically switch parser while parsing

我正在解析 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 语句(具有语义操作)。这是一个好方法吗?如果没有,还有什么方法可以做到这一点?

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

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

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