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)+
它将匹配完全相同的字符串,但不会产生歧义。
我定义了这样一个 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)+
它将匹配完全相同的字符串,但不会产生歧义。