Сгенерированные методы доступа узлов контекста дерева синтаксического анализа не соответствуют стандарту getProperty()/isProperty()/hasProperty(). В результате ST нельзя применить к дереву синтаксического анализа напрямую. Кажется, есть 3 альтернативы для применения ST к сгенерированным деревьям синтаксического анализа:
- Создайте классы адаптера модели ST для каждого созданного узла контекста. Затем ST можно применить непосредственно к сгенерированному дереву синтаксического анализа. Дублирование здесь заключается в создании адаптеров модели.
- Для каждого узла дерева синтаксического анализа создайте узел-оболочку, соответствующий стандарту getProperty()/isProperty()/hasProperty(). Затем ST можно применить к узлам-оболочкам. Здесь дублируется работа по созданию узлов-оболочек. (В этом случае дерево синтаксического анализа даже не требуется; построение автоматического дерева синтаксического анализа можно отключить, а узлы-оболочки (AST) можно создавать в действиях грамматики).
- Создайте посетителя. Каждое посещение*() создает экземпляр ЗБ, относящийся к посещаемому узлу контекста, устанавливает параметры (которые могут быть ЗБ, возвращаемыми при посещении дочерних узлов, или простыми строками) и возвращает ЗБ. Это вариант, который я сейчас использую. Дублирование здесь заключается в создании посетителя и назначении параметров шаблона в коде.
Существует ли опция Antlr4, которая генерирует средства доступа к узлам контекста дерева синтаксического анализа, соответствующие стандарту getProperty()/isProperty()/hasProperty()? Или есть опция ST4, позволяющая обращаться к property() вместо поиска getProperty()?
Было бы неплохо просто создать экземпляр шаблона ST с корневым узлом контекста в качестве параметра и позволить ST пройти по дереву.