Odpowiedź zawiera link, który podałeś. Nie chcę, aby skopiować oryginalną odpowiedź całkowicie więc spróbuję i parafrazując nieco ...
In antlr4 lexer, How to have a rule that catches all remaining "words" as Unknown token?
Dodaj niewiadomych do lexer, który będzie pasował wielokrotności tych ...
unknowns : Unknown+ ;
...
Unknown : . ;
Dokonano edycji tego posta, aby uwzględnić przypadek, w którym używano leksera i nie używano analizatora składni. Jeśli używasz parsera, nie musisz przesłonić metody nextToken
, ponieważ błąd może być przetwarzany w parserze w znacznie czystszy sposób, np. unknowns
jest tylko kolejnym typem znacznika, jeśli chodzi o lexer. Lexer przekazuje je do analizatora składni, który może wtedy obsługiwać błędy. Używając parsera normalnie rozpoznaję wszystkie tokeny jako indywidualne tokeny, a następnie w parserze emituję błędy tj. Grupuję je lub nie. Powodem tego jest to, że obsługa błędów odbywa się w jednym miejscu, tzn. Nie znajduje się w lexer i parserze. Ułatwia także pisanie i testowanie leksykonu, tzn. Musi rozpoznawać cały tekst i nigdy nie zawieść na żadnym z wejść utf8. Niektórzy ludzie prawdopodobnie robiliby to inaczej, ale to działało dla mnie z ręcznie napisanymi lexerami w C. Parser jest odpowiedzialny za ustalenie, co jest rzeczywiście poprawne i jak na nim popełnić błąd. Inną korzyścią jest to, że lekser jest dość ogólny i może być ponownie użyty.
Dla Lexer jedyne rozwiązanie ...
Sprawdź odpowiedź na link i spojrzeć na ten komentarz w odpowiedzi ...
... ale mam tylko lexer, bez parserami ...
państwa odpowiedź, że można zastąpić metodę nextToken
i zostaje szczegółowo, w jaki sposób to zrobić
@Override
public Token nextToken() {
i ważnym elementem w kodzie jest to ...
Token next = super.nextToken();
if(next.getType() != Unknown) {
return next;
}
Kod, który przychodzi po to obsługuje przypadek, w którym można dopasować złe znaki.
Miałem nadzieję na proste rozwiązanie (pro blem jest prosty), ale wygląda na to, że nie ma. Dziękuję za potwierdzenie. – msteiger