Обработка исключений ANTLR с "$", Java

Для моей грамматики в ANTLR мой код Java может отлавливать и печатать ошибки для входных данных, содержащих "$". В моей реализации мне нужно распечатать "успех" для успешного ввода. Итак, я делаю следующее в своем коде Java,

CharStream charStream = new ANTLRFileStream(filePath);
myLexer lexer = new myLexer(charStream);
TokenStream tokens = new CommonTokenStream(lexer);
myParser parser = new myParser(tokens);

/*if there is an error throws an exception message*/
parser.program(); 

/*if there is an error find how many, if 0 then print success,*/
int errorsCount = parser.getNumberOfSyntaxErrors();
if(errorsCount == 0){
  System.out.println("parsing successful");
}

getNumberofSyntaxErrors возвращает числа больше 0 для неправильных входных данных в моем случае. Для "int i;" вывод просто;

parsing successful 

Когда я запускаю свой код для ввода типа int $i; java-код выводит сообщение об ошибке с "успешным синтаксическим анализом", потому что getNumberofSyntaxErrors() возвращает 0;

line 1:4 no viable alternative at character '$' /*this is what I expect to see*/
parsing successful /*this is not what i expect to see*/

1 ответ

Решение

Возможно, лексер (или синтаксический анализатор) пытается восстановиться после (незначительных) ошибок и продолжает токенизацию или анализ. Если вы хотите завершить каждый раз, когда появляется какой-либо недопустимый символ, проще всего создать какое-то "сквозное" правило, которое помещается в конце всех ваших правил лексера, которые будут совпадать, если ни одно из вышеприведенных правил лексера не совпало, и пусть это правило выдает исключение:

grammar T;

// parser rules

// lexer rules

/* last lexer rules */
FALL_THROUGH
  :  .  {throw new RuntimeException("Illegal character: " + getText());}
  ;
Другие вопросы по тегам