ANTLR шаблонные правила - PullRequest
0 голосов
/ 14 октября 2019

Я использую ANTLR 4 для анализа подмножества SQL, и в настоящее время я столкнулся с проблемой. Мне нужно правило для предиката со следующей структурой:

predicate
    :
    expr relation expr
    | between_clause
    | predicate OR predicate
    | predicate AND predicate
    | '(' predicate ')'
    ;

Проблема здесь в правиле expr. Существуют разные типы предикатов, в которых expr должны отличаться, но вся вышеупомянутая структура сохраняется.

Я бы хотел параметризовать правило predicate, чтобы автоматически создать несколько правил для разных типов предикатов. (правило выше, где подставляются конкретные expr типы).

Возможно ли это в ANTLR 4?

PS Я вижу два альтернативных варианта:

  • Копировать-paste predicate править и заменять различные expr правила вручную
  • иметь все возможные альтернативы в правиле expr и проверять, что только один тип из них используется для определенного предиката в коде целевого языка

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

1 Ответ

1 голос
/ 14 октября 2019

Возможно ли это в ANTLR 4?

Нет, ANTLR не имеет такой функции.

Ваши две альтернативы - именно то, как эти вещи обычно выполняются впрактика. Какой из них предпочтительнее, зависит от того, насколько точно различаются различные замены для expr.

, второе приводит к принятию множества неверных предикатов на уровне грамматики.

Всегда будут типы ошибок, которые вы не можете предотвратить в грамматике, и которые нужно будет обрабатывать на отдельной фазе. Введите ошибки или необъявленные ошибки переменных, например. Таким образом, грамматика, принимающая неверные программы, не является чем-то необычным.

...