Вопрос

У меня есть AST, созданный с помощью ANTLR, и мне нужно преобразовать его в DLR-совместимый (деревья выражений).Однако может показаться, что я не могу использовать для этого средства сопоставления шаблонов деревьев, поскольку деревьям выражений нужны их поддеревья при создании экземпляра (чего я не могу получить).Какое решение мне лучше всего использовать?

Это было полезно?

Решение

Несколько лет назад я сделал нечто очень похожее — я не строил структуру DLR, а построил свою собственную древовидную структуру выражений, для которой также требовались аргументы во время построения (для достижения неизменяемости).

Тогда я работал с ANTLR v2 — и должен признаться, что я не знаком с новым синтаксисом v3, плюс я не помню всех подробностей о том, как я это делал тогда — поэтому вместо того, чтобы предоставить вам полную проработанный пример, я просто попробую рассказать вам свою историю (не уверен, применима ли она и к вашей проблеме!):

Во-первых, не нужно было строить свою структуру от АСТ.В качестве средства передвижения я использовал только конструктор AST от ANLTR:Каждое правило построения AST может возвращать объект в дополнение к самому узлу AST.Возвращаемое значение затем можно использовать во внешнем правиле в качестве аргумента конструктора и так далее.Таким образом, эта структура автоматически выстраивается для вас снизу вверх!

IOW, вы создаете окончательную структуру одновременно с построением AST (AST создается только для обеспечения правил синтаксиса и может быть выброшен). Этот подход очень надежный и даже быстрее, чем первое построение AST. , а затем преобразовываем это!Но он по-прежнему использует возможности парсера AST (в отличие от использования только обычного парсера/лексера).А если вам тоже нужен AST — просто сохраните его где-нибудь.

Однако если вы хотите пройти готовый AST — я думаю, вы можете использовать для этого любую программную процедуру — просто убедитесь, что она работает снизу вверх для построения вашего результата!

Надеюсь, это каким-то образом поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top