Как заставить ANTLR 4 выйти при первой ошибке лексирования или синтаксического анализа?

Я пытаюсь решить ту же проблему, что и в Как заставить ANTLR 3.2 выйти при первой ошибке? но в antlr4, так как нет функции recoveryFromMismatchedToken()


person ps_messenger    schedule 09.08.2016    source источник


Ответы (2)


Antlr4 обычно использует ANTLRErrorStrategy интерфейс. Посмотрите на BailErrorStrategy< /a> в частности.

Чтобы немедленно избавиться от ошибки лексера, переопределите два метода recover(....) в Класс Lexer. Сделайте это, реализуя (1) методы-члены лексера; или (2) создание суперкласса Lexer, содержащего методы переопределения.

person GRosenberg    schedule 09.08.2016
comment
Я уже сделал это, но он не завершается при ошибке, если это ошибка лексирования. - person ps_messenger; 10.08.2016

Это сработало, Грозенберг!

Я скачал файл BailErrorStrategy.java (см. примечание GRosenberg выше).

Затем я перестал использовать Lexer по умолчанию и создал свой собственный простой Lexer подкласса как:

package ...;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.LexerNoViableAltException;
import org.antlr.v4.runtime.RecognitionException;

public class MyYAMLANTLR4Lexer extends YAMLANTLR4Lexer {
    public MyYAMLANTLR4Lexer(CharStream input) {
        super(input);
    }
    public void recover(LexerNoViableAltException e) { }
    public void recover(RecognitionException re) { }
}
person Sarma    schedule 29.03.2020