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

如何调整词法分析规则,验证SQL LIMIT参数为合法整数值?

解决方案

方案一:词法层面直接约束

可以调整词法规则,把符合整数形式的科学计数法归到整数词法单元里,同时限制浮点数仅匹配带小数的情况,让词法阶段直接过滤不符合要求的输入。

修改后的语法示例:

grammar DBParser;

statement: expr EOF;
expr: 'LIMIT' wholeNumber;

wholeNumber
    : INTEGER  // 现在INTEGER包含普通整数和整数形式的科学计数法
    ;

INTEGER
    : [0-9]+ (Exponent)?  // 允许数字后跟指数部分
    ;

FLOAT
    : ([0-9]+ '.' [0-9]* | '.' [0-9]+) Exponent?  // 仅匹配带小数点的浮点数
    ;

fragment Exponent
    : 'E' [+-]? [0-9]+
    ;

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

效果:

  • 10 和 1e2 会被识别为INTEGER,符合wholeNumber规则
  • 1.5 会被识别为FLOAT,无法匹配wholeNumber,直接在语法分析阶段报错

方案二:下游代码/监听器中验证

如果不想改动原有词法规则,也可以先在语法中允许匹配INTEGER或FLOAT,再在业务逻辑层做二次验证:

  1. 调整语法规则:
wholeNumber
    : INTEGER | FLOAT
    ;
  1. 在处理wholeNumber的代码中做判断:
    • INTEGER类型直接通过
    • FLOAT类型检查是否无小数部分(比如1e2实际值为整数,1.5则不是),不符合则抛出参数错误

方案对比

  • 词法层面约束:错误反馈更早,语法规则更严谨,但需要调整词法逻辑,确保科学计数法的整数形式被正确识别
  • 下游验证:词法规则更简洁,无需改动原有定义,但错误检查延后到业务逻辑阶段,需要额外编写判断代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:06:32