如何调整词法分析规则,验证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,再在业务逻辑层做二次验证:
- 调整语法规则:
wholeNumber : INTEGER | FLOAT ;
- 在处理
wholeNumber的代码中做判断:INTEGER类型直接通过FLOAT类型检查是否无小数部分(比如1e2实际值为整数,1.5则不是),不符合则抛出参数错误
方案对比
- 词法层面约束:错误反馈更早,语法规则更严谨,但需要调整词法逻辑,确保科学计数法的整数形式被正确识别
- 下游验证:词法规则更简洁,无需改动原有定义,但错误检查延后到业务逻辑阶段,需要额外编写判断代码
内容的提问来源于stack exchange,提问作者samuelbrody1249
相关产品推荐
相关产品推荐

