Комментарии 10
Вы совершенно не разобрались для чего visitor и listener предназначены, в каких случаях надо применять одно, а в каких другое. И как их правильно комбинировать между собой. У каждого из этих механизмов есть довольно конкретное предназначение и области применения.
0
Здесь рассматривается конкретная задача, и ее решение двумя способами. Так же проводиться сравнение двух подходов для решения (да да, я повторяюсь) конкретной задачи. Так же я написал, что если оставить исходную постановку задачи (трансляция JSON в текст XML), по слушатель подойдет лучше.
А можно как то формализовать области применения одного и другого?
И как их правильно комбинировать между собой.Сначала подумал «бред», потом все ж пришел к выводу, что это вполне возможно (одно поддерево скушать, а другое посещать). Есть какой ни будь пример (заинтересовало)?
А можно как то формализовать области применения одного и другого?
+1
А теперь для посетителя создаём глубокое дерево…
0
для слушателя то же самое дерево, только слушатель обойдет все дерево (обходом нельзя управлять), а посещением можно управлять, например для оптимизированных bool выражений (target != null && target.Value > 100 — если target == null, то правое условие даже проверять не нужно, что удобно. Выполнение же правой части выдаст ошибку)
0
Во-1х, для слушателя совсем не обязательно держать всё дерево в памяти.
Во-2х, слушатель может отписываться когда он закончил, или возвращать подсказки (hint'ы) для обхода (которые, впрочем, автомат может и игнорировать — например, если на одном дереве сейчас параллельно запущено 5 слушателей), впрочем, не вычислять если он уже всё знает он может всегда в любом случае.
В-3их, построить дерево можно линейно, а вот посетитель расходует стек. А стек это такой мерзкий предмет — то он есть, то его нет.ж
Во-2х, слушатель может отписываться когда он закончил, или возвращать подсказки (hint'ы) для обхода (которые, впрочем, автомат может и игнорировать — например, если на одном дереве сейчас параллельно запущено 5 слушателей), впрочем, не вычислять если он уже всё знает он может всегда в любом случае.
В-3их, построить дерево можно линейно, а вот посетитель расходует стек. А стек это такой мерзкий предмет — то он есть, то его нет.ж
0
с 1м согласен.
Со 2м не согласен. Отписка — ее нет (ну может я плохо искал). Хоте ее можно реализовать самостоятельно (допиливая существующий функционал или написав новый, чего не особо хочется)
с 3м согласен, злоупотреблять стэком это не хорошо.
Со 2м не согласен. Отписка — ее нет (ну может я плохо искал). Хоте ее можно реализовать самостоятельно (допиливая существующий функционал или написав новый, чего не особо хочется)
с 3м согласен, злоупотреблять стэком это не хорошо.
0
В ANTLR Listener реализованы с помощью переопределения базовых листенеров. Поэтому никаких отписок быть не может. Для реализации многопоточных алгоритмов нужно использовать либо разные экземпляры листенеров, что предпочтительней, либо примитивы синхронизации.
0
В свойствах файла необходимо выставить Generate Listener и Generate Visitor
поясните, плиз
0
в первом кусочке кода уберите лишние отступы для pair: STRING':'value; чтобы было читать удобно
Спасибо за статью!
Спасибо за статью!
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Битва «Слушатель vs Посетитель» на стадионе antlr4