Antlr странный синтаксис круглых скобок

введите здесь описание изображения

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


person Denis Tribrat    schedule 03.03.2021    source источник
comment
Это называется группировка. Когда вы пишете последовательность символов, заключенных в круглые скобки (круглые скобки), эта последовательность рассматривается как одна группа, которая встречается до или после других символов правила. Например S : а (b | c) * d; может обозначать язык {ad, abd, acd, abd, accd, abcd, acbd и т. д.}. Вы всегда можете написать эквивалентную грамматику BNF для грамматики EBNF, и вы бы сделали это, если у вас есть проблемы с Antlr4, принимающим вашу грамматику, что бывает нечасто.   -  person kaby76    schedule 04.03.2021


Ответы (1)


Не обязательно его писать,

Это правильно, не надо. Просто удалите их.

но иногда это может привести к ошибке левой рекурсии.

Если это действительно так, вы можете открыть вопрос здесь: https://github.com/antlr/antlr4/issues

РЕДАКТИРОВАТЬ

Увидев комментарий kaby76, просто чтобы убедиться: вы не можете просто удалить их из файла грамматики в любом случае. Их можно удалить из вашего примера правила.

При использовании следующим образом:

rule
 : ID '=' ( NUMBER | STRING ) // match either `ID '=' NUMBER` 
                              //           or `ID '=' STRING`
 ;

их нельзя удалить, потому что их удаление приведет к:

rule
 : ID '=' NUMBER | STRING // match either `ID '=' NUMBER` 
                          //           or `STRING`
 ;

Или с повторением:

rule
 : ( ID STRING )+ // match: `ID STRING ID STRING ID STRING ...`
 ;

и это:

rule
 : ID STRING+ // match: `ID STRING STRING STRING ...`
 ;
person Bart Kiers    schedule 03.03.2021