我正在尝试在antlr4语法文件中设置表达式的大小
我尝试了几种获取尺寸的方法,因为我需要限制尺寸
表达
如果我的表达式具有大于7的整数/十进制值,我需要抛出一个错误。
1)weight : {match(FLOAT); if(_localctx.getText().length()>7){notifyErrorListeners("above 7 count value");}} ;
FLOAT : ('0'..'9')* '.' ('0'..'9')+ ;
2)
(a+=NUMERIC* b+=DECIMAL* c+=NUMERIC+)+ {$a.size()+$b.size()+$c.size() <= 7 && $b.size()<=1}?<fail={"Exceeded weight value"}>
NUMERIC : [0-9];
DECIMAL : '.';
我正在寻找最佳解决方案
请指教
最佳答案
您应该使用最轻松的语法来解析输入内容。例如,如果只允许一个整数包含6位数字,则仍应使用如下规则创建Integer
令牌:
Integer
: [0-9]+
;
词法分析器和解析器将不包含任何有关该整数小于或等于6个字符的验证。解析完成后,您将拥有一棵解析树,请使用一个或多个侦听器和/或访问者来执行对各种语义要求的所有验证。
这种策略对解析器和验证器向用户报告可理解的错误消息的能力产生了巨大的积极影响,以至于它大大超过了将验证代码放在语法本身中的任何可感知的优势。