【 以下文字转载自 Java 讨论区 】
发信人: lokta (部落), 信区: Java
标 题: ANtlr4如何实现特定场景的not操作?
发信站: 水木社区 (Tue Jun 8 14:53:44 2021), 站内
之前在本版问过的一个问题,如果用sql实现a and (b or c)这样的逻辑,最终通过anltr4实现了这样的语法结构:
grammar Search;
expr : left=expr AND right=expr # opAnd
| left=expr OR right=expr # opOr
| STRING # string
| '(' expr ')' # parens
;
NOT : 'NOT' | 'not' ;
AND : 'AND' | 'and' ;
OR : 'OR' | 'or' ;
STRING : [0-9a-zA-Z\u4e00-\u9fa5]+ ;
WS : [ \t\r\n]+ -> skip
目前使用除了not逻辑之外,实现了如下功能:
a and (b or c) 转为:
filed like '%a%' and (field like '%b%' or field like '%c%')
但是如果要实现not功能的话,就有点抓瞎了。简单的还好说:
not a可以转化为 field not like '%a%'
但是遇到not (a and b)就难了,语法数visit的时候先实现了
field like '%a%' and field like '%b%', 然后才是not。
除非在处理的时候,先把not (a and b)变换为等价的表达式(not a or not b)。
求问这种等价表达如何替换。。
--
FROM 223.104.96.*