Как заставить antlr находить недопустимое исключение броска ввода - PullRequest
1 голос
/ 24 февраля 2020

У меня есть следующая грамматика:

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», но я хочу изменить это поведение, не сбрасывал недействительный токен, но бросил исключение, отчет об обнаружении недействительного токена.

Итак, что мне делать, спасибо за ваш совет

1 Ответ

0 голосов
/ 24 февраля 2020

Вы используете expr в качестве основного правила? если это так, создайте другое правило, назовите его как-нибудь как parse или program и просто напишите его так:

parse: expr EOF;

Это заставит antlr не игнорировать конечные токены, которые не имеют смысла, и фактически выдаст ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...