2015-02-10 1 views
1

У меня есть следующая грамматикаКак вставить скобки в 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 с или

  • (, A query и )

Факс: abc (def) a query?

Номер (def) не является unquoted_str, поэтому первый вариант не применяется. И abc не начинается с (, поэтому второй вариант также не применяется. Поскольку это единственные два варианта, мы заключаем, что это не так. И Antlr также говорит вам, что после того, как он видит unquoted_str (abc), он ожидает увидеть еще одну, или конец ввода.

От вас, например, я полагаю, вы могли бы иметь в виду, что запрос представляет собой один или несколько элементов запроса, когда элемент запроса либо один unquoted_str или в скобках query.Если это то, что вы имели в виду, вы должны изменить свою грамматику, чтобы указать это.

+1

Это было, спасибо! Просто изменил запрос на следующий: query: (unquoted_str | '(' query ')') +; – whisperstream