Динамическое переключение парсера при разборе - PullRequest
0 голосов
/ 28 ноября 2018

Я анализирую списки специй , для которых у меня уже есть парсер.Поскольку я на самом деле использую Spectre (Cadence, Integrated Electronics), я хочу поддерживать оба языка симуляторов (они отличаются, к сожалению).Я мог бы использовать переключатель (например, командную строку) и использовать правильный парсер с самого начала.Тем не менее, Spectre позволяет 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 (с семантическим действием).Это хороший подход?Если нет, то как еще можно это сделать?

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете использовать qi::lazy (https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/reference/auxiliary/lazy.html).

С этим связан идиоматический паттерн, известный как Трюк с Набиалеком .

У меня есть несколько ответов на этом сайте, которые показывают эти различные техники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...