Как мне сделать вложенные скобки в antlr4?
У меня есть следующая грамматика
query
: unquoted_str+
| '(' query ')'
;
unquoted_str
: UNQUOTED_STR
;
UNQUOTED_STR
: [A-Za-z_][A-Za-z0-9_-]*
;
WS
: [ \t\r\n]+ -> skip
;
Я хочу иметь возможность выполнить следующий запрос:
abc (def (hij))
Но я продолжаю получать ошибку:
line 1:4 extraneous input '(' expecting {<EOF>, UNQUOTED_STR}
line 1:8 extraneous input ')' expecting {<EOF>, UNQUOTED_STR}
Попытался решить проблему, добавив EOF в разные места, но безрезультатно. Любая помощь будет отличной.
1 ответ
Согласно вашей грамматике запрос может быть:
Последовательность из одного или нескольких
unquoted_str
с или(
query
и а )
Является abc (def)
query
?
Нет. (def)
это не unquoted_str
, поэтому первый вариант не применяется. А также abc
не начинается с (, поэтому второй вариант тоже не применяется. Так как это только два варианта, мы заключаем, что это не так. Как и Antlr; он сообщает, что после того, как он видит unquoted_str
(abc
), он ожидает увидеть еще один, или конец ввода.
Из вашего примера, я полагаю, вы могли иметь в виду, что запрос представляет собой один или несколько элементов запроса, где элемент запроса представляет собой один unquoted_str
или в скобках query
, Если это то, что вы имели в виду, вы должны изменить свою грамматику, чтобы указать это.