如何使Antlr查找无效的输入抛出异常

海关

我有以下语法:

grammar Expr;


expr : '-' expr                                       # unaryOpExpr
     | expr ('*'|'/'|'%') expr                        # mulDivModuloExpr
     | expr ('+'|'-') expr                            # addSubExpr
     | '(' expr ')'                                   # nestedExpr
     | IDENTIFIER '(' fnArgs? ')'                     # functionExpr
     | IDENTIFIER                                     # identifierExpr
     | DOUBLE                                         # doubleExpr
     | LONG                                           # longExpr
     | STRING                                         # string
     ;


fnArgs : expr (',' expr)*                             # functionArgs
       ;

IDENTIFIER : [_$a-zA-Z][_$a-zA-Z0-9]* | '"' (ESC | ~ ["\\])* '"';
LONG : [0-9]+;
DOUBLE : [0-9]+ '.' [0-9]*;
WS : [ \t\r\n]+ -> skip ;

STRING: '"' (~["\\\r\n] | ESC)* '"';

fragment ESC : '\\' (['"\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;

MINUS : '-' ;
MUL : '*' ;
DIV : '/' ;
MODULO : '%' ;
PLUS : '+' ;

// math function
MAX: 'MAX';

当我输入以下文字时,它应该有效

-1.1

输入以下文本时出现错误:

-1.1ffff

我认为它应该报告一个错误,错误antlr并没有这样做,antlr捕获了先前的“ -1.1”,放弃了“ ffff”,但是我想更改此行为,没有放弃无效的令牌,而是抛出异常,报告检测到无效令牌。

那我该怎么办,谢谢你的建议

Slackow

您是否使用expr作为主要规则?如果是这样,请制定另一个规则,将其命名为“解析”或“程序”,然后像这样简单地编写它:

parse: expr EOF;

这将使antlr不会忽略没有意义的尾随标记,而实际上会引发错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该抛出检查或无效的输入未经检查的异常?

Python 2.7和ANTLR4:使ANTLR在无效输入上引发异常

Java-异常处理-如何重新输入无效的输入

如果输入不是bigDecimal,如何抛出异常并再次扫描?

异常抛出如何工作?

Mongo抛出“元素名称'名称'无效”异常

GridControl不断抛出无效的路径异常

Spring AOP:如何使用无效的返回类型在异步方法中抛出异常

抛出异常无效的IP以及如何使用异步任务解决它

尝试查找元素时如何在列表上使用流抛出异常?

如何捕获重新抛出的异常?

如何知道抛出哪个异常

如何创建并抛出Java异常?

如何明确不抛出异常?

如何检查是否抛出异常

如何捕获 DataReceivedEventHandler 抛出的异常?

输入错误的类型时,如何防止扫描仪抛出异常?

如何查找txt文件是否为空?条件:文件为空(抛出异常),文件只有空格和新行(抛出异常)

如何从数据集LINQ中获取单个值而不会使用C#抛出无效的强制转换异常

快速捕获无效用户输入的异常

如果输入无效,是否可能引发异常?

为什么SimpleDateFormat的不抛出无效格式异常?

Jackson Converter 应抛出什么异常类型以指示无效值

从Tomcat查询Impala会抛出无效的URL异常

.NET中对于无效或意外参数应抛出哪些异常?

方法返回无效结果时应抛出什么异常

异常处理-如何处理用户输入中的无效数据类型?

抛出“异常 A:异常 B”时如何断言“异常 B”?

ANTLR不会在无效输入上引发错误