Как стать автором
Обновить

Комментарии 10

Вы совершенно не разобрались для чего visitor и listener предназначены, в каких случаях надо применять одно, а в каких другое. И как их правильно комбинировать между собой. У каждого из этих механизмов есть довольно конкретное предназначение и области применения.
Здесь рассматривается конкретная задача, и ее решение двумя способами. Так же проводиться сравнение двух подходов для решения (да да, я повторяюсь) конкретной задачи. Так же я написал, что если оставить исходную постановку задачи (трансляция JSON в текст XML), по слушатель подойдет лучше.
И как их правильно комбинировать между собой.
Сначала подумал «бред», потом все ж пришел к выводу, что это вполне возможно (одно поддерево скушать, а другое посещать). Есть какой ни будь пример (заинтересовало)?
А можно как то формализовать области применения одного и другого?
А теперь для посетителя создаём глубокое дерево…
для слушателя то же самое дерево, только слушатель обойдет все дерево (обходом нельзя управлять), а посещением можно управлять, например для оптимизированных bool выражений (target != null && target.Value > 100 — если target == null, то правое условие даже проверять не нужно, что удобно. Выполнение же правой части выдаст ошибку)
Во-1х, для слушателя совсем не обязательно держать всё дерево в памяти.

Во-2х, слушатель может отписываться когда он закончил, или возвращать подсказки (hint'ы) для обхода (которые, впрочем, автомат может и игнорировать — например, если на одном дереве сейчас параллельно запущено 5 слушателей), впрочем, не вычислять если он уже всё знает он может всегда в любом случае.

В-3их, построить дерево можно линейно, а вот посетитель расходует стек. А стек это такой мерзкий предмет — то он есть, то его нет.ж
с 1м согласен.
Со 2м не согласен. Отписка — ее нет (ну может я плохо искал). Хоте ее можно реализовать самостоятельно (допиливая существующий функционал или написав новый, чего не особо хочется)
с 3м согласен, злоупотреблять стэком это не хорошо.
Если её нет именно у antlr — то это отличный способ внести лепту в опенсорс :)
а вот оптимизация вычислений таки доступна вне зависимости от возможности отписки.

В ANTLR Listener реализованы с помощью переопределения базовых листенеров. Поэтому никаких отписок быть не может. Для реализации многопоточных алгоритмов нужно использовать либо разные экземпляры листенеров, что предпочтительней, либо примитивы синхронизации.

В свойствах файла необходимо выставить Generate Listener и Generate Visitor

поясните, плиз
в первом кусочке кода уберите лишние отступы для pair: STRING':'value; чтобы было читать удобно

Спасибо за статью!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории