Я пытаюсь разобрать диалоги MS SQL. В соответствии со спецификацией «сверху» должны иметь скобки вокруг выраженияantlr4 lexer/parser конфликтует из-за двусмысленности
выберите верхние (@rows * 2) а, б, в ...
, но в качестве исключения они могут быть опущены, если значение без знака буквального целое, таким образом
выберите топ 75 а, б, в ...
Я пытался встроить это буквальное-целое специального случая в моем синтаксическом анализаторе (свободно):
top_clause: 'TOP' [0-9] + | 'TOP' '(' expression ')';
Итак, первая альтернатива - это правило чистого лексера, второе - правило синтаксического анализа. Поскольку целочисленная константа является допустимым выражением, она выбирает ее как выражение.
Вопрос в том, 1) могу ли я заставить его соответствовать правилам лексера без предикатов и 2) самое главное, должен ли я?
Я полагаю, что я не должен - это вопиющая двусмысленность (действительно, ошибка в моей грамматике), и я думаю, что я должен соответствовать ей как чистое правило парсера (просто выражение «TOP») и сортировать его вне после. Совет приветствовать.
изменить: изменен пункт Мэтта Тиммермана.
не хотите '' TOP '[0-9] + | 'TOP' '(' expression ')' '? –
Ну, выражение уже определено, между прочим, как ** '(' выражение ')' **, и потому, что я ожидаю удалить правило только для lexer, я пропустил их здесь (потому что я не хотел требуют, чтобы остальная часть выражения была целым числом). Но да, вы правы. Будет редактировать. – user3779002
теперь это не двусмысленно –