我正在解析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
语句(使用语义动作)。这是一个好方法吗?如果没有,那怎么办呢?
答案 0 :(得分:2)
您可以使用qi::lazy
(https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/reference/auxiliary/lazy.html)。
有一个与此相关的惯用模式,称为The Nabialek Trick。
我在此站点上有几个答案,展示了这些不同的技术。