Запуск TestRig с неверной входной строкой не выдает сообщение об ошибке - PullRequest
0 голосов
/ 17 мая 2018

Я сделал грамматику, которая строит сравнение между выражениями следующим образом.

grammar EtlExpression;

/** The start rule; begin parsing here. */
prog   : comp ; 

comp   : expr ('='|'<='|'>='|'<'|'>') expr ;

expr   : expr ('*'|'/') expr   
       | expr ('+'|'-') expr   
       | '(' expr ')'         
       | func
       | ID                    
       | STR                    
       | NUM    
       ;

func   : ID '(' expr (',' expr)* ')' ;    // function 

STR    : '"' ('\\"'|.)*? '"' ;                       // match identifiers 
ID     : LETTER (LETTER|DIGIT)* ;                    // match identifiers 
NUM    : '-'? ('.' DIGIT+ | DIGIT+ ('.' DIGIT*)? ) ; // match number
WS     : [ \t\r\n]+ -> skip ;                        // toss out whitespace

fragment
LETTER : [a-zA-Z] ;
fragment
DIGIT  : [0-9] ;

, затем я запустил testRig после компиляции.Результат выглядит следующим образом.

java -cp .;C:\App\Antlr4\antlr-4.7.1-complete.jar org.antlr.v4.gui.TestRig test.antlr.EtlExpression prog -tree
a < b = c
^Z
(prog (comp (expr a) < (expr b)))

Правило comp определяет только один операнд сравнения, и я думаю, что эта тестовая входная строка должна выдавать какую-то ошибку типа "ошибка распознавания токена строки 1: 6"at: '=' ", но он просто игнорирует часть" = c ".

Не могли бы вы помочь мне Что не так с грамматикой или как я могу получить правильное сообщение?Заранее спасибо.

1 Ответ

0 голосов
/ 17 мая 2018

Парсер просто останавливается, когда он не может соответствовать = и за его пределами. Если вы заставите синтаксический анализатор использовать весь ввод, на вашем стандартном выводе появится ошибка. Вы можете сделать это, добавив EOF к своему правилу prog:

prog : comp EOF; 
...