解析时动态切换解析器
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。
我在这个网站上有几个答案展示了这些不同的技术。
我正在解析 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。
我在这个网站上有几个答案展示了这些不同的技术。