Совместное использование antlr и DLR — преобразование AST
-
22-09-2019 - |
Вопрос
У меня есть AST, созданный с помощью ANTLR, и мне нужно преобразовать его в DLR-совместимый (деревья выражений).Однако может показаться, что я не могу использовать для этого средства сопоставления шаблонов деревьев, поскольку деревьям выражений нужны их поддеревья при создании экземпляра (чего я не могу получить).Какое решение мне лучше всего использовать?
Решение
Несколько лет назад я сделал нечто очень похожее — я не строил структуру DLR, а построил свою собственную древовидную структуру выражений, для которой также требовались аргументы во время построения (для достижения неизменяемости).
Тогда я работал с ANTLR v2 — и должен признаться, что я не знаком с новым синтаксисом v3, плюс я не помню всех подробностей о том, как я это делал тогда — поэтому вместо того, чтобы предоставить вам полную проработанный пример, я просто попробую рассказать вам свою историю (не уверен, применима ли она и к вашей проблеме!):
Во-первых, не нужно было строить свою структуру от АСТ.В качестве средства передвижения я использовал только конструктор AST от ANLTR:Каждое правило построения AST может возвращать объект в дополнение к самому узлу AST.Возвращаемое значение затем можно использовать во внешнем правиле в качестве аргумента конструктора и так далее.Таким образом, эта структура автоматически выстраивается для вас снизу вверх!
IOW, вы создаете окончательную структуру одновременно с построением AST (AST создается только для обеспечения правил синтаксиса и может быть выброшен). Этот подход очень надежный и даже быстрее, чем первое построение AST. , а затем преобразовываем это!Но он по-прежнему использует возможности парсера AST (в отличие от использования только обычного парсера/лексера).А если вам тоже нужен AST — просто сохраните его где-нибудь.
Однако если вы хотите пройти готовый AST — я думаю, вы можете использовать для этого любую программную процедуру — просто убедитесь, что она работает снизу вверх для построения вашего результата!
Надеюсь, это каким-то образом поможет!