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





Вы можете использовать qi::lazy (https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/reference/auxiled/lazy.html).
С этим связан идиоматический паттерн, известный как Уловка Набиалека.
У меня есть несколько ответов на этом сайте, которые показывают эти различные техники.
Так что это так просто. Спасибо, сейчас работаю, выглядит неплохо. Почему-то я подумал, что не смогу применить эту стратегию.
Вы пробовали просто переназначить
line(илиmainили другое подходящее правило)?