如何让antlr发现无效输入抛出异常
How to make antlr find invalid input throw exception
我有以下语法:
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
我觉得应该是报错,bug antlr没做,antlr捕获前面的“-1.1”,丢弃"ffff",
但我想改变这种行为,没有丢弃无效令牌,而是抛出异常,报告
检测到无效令牌。
那我该怎么办,谢谢你的建议
您是否使用 expr 作为主要规则?如果是这样,请制定另一条规则,将其称为解析或程序之类的东西,然后简单地这样写:
parse: expr EOF;
这将使 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
我觉得应该是报错,bug antlr没做,antlr捕获前面的“-1.1”,丢弃"ffff", 但我想改变这种行为,没有丢弃无效令牌,而是抛出异常,报告 检测到无效令牌。
那我该怎么办,谢谢你的建议
您是否使用 expr 作为主要规则?如果是这样,请制定另一条规则,将其称为解析或程序之类的东西,然后简单地这样写:
parse: expr EOF;
这将使 antlr 不会忽略没有意义的尾随标记,而实际上会抛出错误。