Обработка исключений 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());}
;