Я сделал грамматику, которая строит сравнение между выражениями следующим образом.
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 ".
Не могли бы вы помочь мне Что не так с грамматикой или как я могу получить правильное сообщение?Заранее спасибо.