AntLR4 定义带有字符排除但不是空字符串的解析器规则

AntLR4 define parser rule with character exclusions but not empty string

我定义了这样一个 AntLR4 语法:

catSearch : (NOT? CATEGORY expr)+ | (OPEN_BR (catSearch | booleSearch | TERM*)+ CLOSE_BR) ;

expr : (NOT? searchValue)+ | BETWEEN;

searchValue : (TERM | PHRASE | NULL | NOT_NULL ) ;

CATEGORY : ([Aa][Dd] | [Xx][Ii])'=';

// Brackets
OPEN_BR: '(' ;
CLOSE_BR: ')' ;

// boolean operators
AND : ([Aa][Nn][Dd]) ;
OR : ([Oo][Rr]) ;
NOT : ([Nn][Oo][Tt]) ;

NULL: 'NULL' ;
NOT_NULL: 'NNULL' ;

BETWEEN: TERM'^'TERM ;

// match single search term
TERM : ~['('')''='' ''^']+ ;

// any double quoted string
PHRASE : '"' .*? '"' ;  

// skip spaces, tabs, newlines
WS : [ \t\r\n]+ -> skip ;

在 catSearch AntLR 规则中给出了 TERM 可以匹配空字符串的错误。我如何定义 TERM 以便它匹配至少一个不在禁止字符列表中但不为空的字符?

我相信Antlr告诉你TERM*可以匹配空字符串,而不是TERM可以。 TERM 不能匹配空字符串,但是 TERM* 当然可以,这将导致 catSearch 中的问题:

catSearch : ... (OPEN_BR (catSearch | booleSearch | TERM*)+ CLOSE_BR) ;

Antlr 无法处理可以匹配空字符串的重复模式,因为重复是完全不明确的。它可以在任意位置匹配任意数量的空字符串,因此无法知道要匹配多少次重复。

如果更改内部重复,:

 (catSearch | booleSearch | TERM*)+ 

 (catSearch | booleSearch | TERM)+ 

它将匹配完全相同的字符串,但不会产生歧义。