Я создал грамматику в ANTLR4. Образец выдержки показан ниже:
list : defunExpr # defun
: lambdaExpr # lambda
: condExpr # cond
...
: items # other
;
Правила перечислены в порядке приоритета и вызываются по мере необходимости при тестировании грамматики. Все правила с более высоким приоритетом #defun, #lambda, #cond и т. д. также будут соответствовать элементам (#other), если они не совпадают с более высоким приоритетом (ожидаемое поведение при размещении правил с более высоким приоритетом перед более низким).
Затем я реализовал простое приложение на основе прослушивателя на Java, которое просто форматирует проанализированный код и выводит его обратно в консоль. Я переопределил соответствующие методы входа/выхода для #defun, #lambda, #cond и т. д. Я хотел бы реализовать обобщенный универсальный метод для элементов, которые не соответствуют более конкретному правилу. Однако, когда я реализую методы входа/выхода для #other, он также выполняется для каждого совпадающего правила с более высоким приоритетом, эффективно выводя отформатированный код дважды для таких правил, как #defun, #lambda, #cond и т. д.
Есть ли способ добиться такого поведения? У меня есть несколько конкретных правил, которые я хочу реализовать, а затем общий случай поймать остальные. Грамматика анализирует правильно (тестовая установка показывает ожидаемое поведение в многочисленных тестовых примерах), но универсальный метод (enterOther), похоже, также действует по определенным правилам.
РЕДАКТИРОВАТЬ: Вау, после всего этого времени и публикации этого вопроса я теперь действительно считаю, что это грамматическая ошибка. Однако я оставлю вопрос открытым, пока не проверю.