You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决SQL语法中BETWEEN与AND的解析歧义问题

解决ANTLR中BETWEEN与AND的语法歧义问题

问题根源

原语法将所有表达式类型(括号、比较、BETWEEN、逻辑AND)都放在同一个expr规则中,ANTLR无法区分BETWEEN后的AND是语法关键字还是逻辑运算符,导致解析歧义。比如会错误地将col1 BETWEEN 1 AND 5 AND col3=10解析为col1 BETWEEN 1 AND (5 AND col3=10),完全不符合SQL语义。

解决方案:拆分表达式规则,明确优先级

通过拆分不同优先级的表达式规则,让BETWEEN这类比较级表达式的优先级高于逻辑AND,确保ANTLR先解析BETWEEN完整结构,再处理逻辑组合。

修改后的ANTLR语法如下:

grammar DBParser;

statement: logicalExpr EOF;

// 逻辑表达式:最低优先级,处理AND组合
logicalExpr
    : comparisonExpr
    | logicalExpr 'AND' comparisonExpr
    ;

// 比较表达式:处理=和BETWEEN结构
comparisonExpr
    : primaryExpr
    | primaryExpr '=' primaryExpr
    | primaryExpr 'BETWEEN' primaryExpr 'AND' primaryExpr
    ;

// 基础表达式:原子和括号包裹的表达式
primaryExpr
    : ATOM
    | '(' logicalExpr ')'
    ;

ATOM: [a-zA-Z0-9]+;

WHITESPACE: [ \t\r\n] -> skip;

语法说明

  1. primaryExpr:定义最基础的表达式单元,包括原子标识符/数值,以及用括号包裹的完整逻辑表达式,确保括号能改变优先级。
  2. comparisonExpr:包含比较运算符=和BETWEEN...AND...结构,优先级高于逻辑AND,会被优先解析,避免BETWEEN后的AND被误判为逻辑运算符。
  3. logicalExpr:处理逻辑AND组合,只能将comparisonExpr或其他logicalExpr用AND连接,保证逻辑组合的正确性。

测试验证

  • 对于语句col1 BETWEEN 1 AND 5 AND col3 = 10,会被正确解析为(col1 BETWEEN 1 AND 5) AND (col3 = 10)。
  • 对于带括号的语句(col1 BETWEEN 1 AND 5) AND (col3 = 10),括号内的完整表达式会被优先解析,再进行逻辑AND组合,无歧义。

内容的提问来源于stack exchange,提问作者samuelbrody1249

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:09:23