Совместное использование antlr и DLR - преобразование AST - PullRequest
2 голосов
/ 24 февраля 2010

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

1 Ответ

2 голосов
/ 21 марта 2010

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

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

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

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

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

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

...