Как мне сделать вложенные скобки в 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, Если это то, что вы имели в виду, вы должны изменить свою грамматику, чтобы указать это.

Другие вопросы по тегам