Я считаю, что Antlr говорит вам, что TERM*
может соответствовать пустой строке, а не TERM
. TERM
не может соответствовать пустой строке, но, конечно, TERM*
может, и это вызовет проблему в catSearch
:
catSearch : ... (OPEN_BR (catSearch | booleSearch | TERM*)+ CLOSE_BR) ;
Antlr не может обрабатывать повторения шаблонов, которые могут соответствовать пустой строке, потому что повторение является совершенно неоднозначным. Он может соответствовать произвольному количеству пустых строк в любом указателе, поэтому нет способа узнать даже, сколько повторений должно быть сопоставлено.
Если вы измените внутреннее повторение:
(catSearch | booleSearch | TERM*)+
до
(catSearch | booleSearch | TERM)+
Он будет соответствовать точно таким же строкам, но однозначно.