2013-08-28 2 views
1

런타임에 Lexing을 할 때 렉서 오류를 누적하려고합니다. this answer에서와 같이 파서 오류에 대해이를 달성하는 정확한 방법을 따랐습니다. 하지만 내가 이것을 렉서에게하려고 할 때.ANTLR 4 누적 오류 Lexer 4

class Class2 : IAntlrErrorListener<IToken> 
{ 
    public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e) 
    { 
     Console.WriteLine("Error in lexer at line " + ":" + e.OffendingToken.Column + e.OffendingToken.Line + e.Message); 
    } 
} 

아래와 같이이 청취자를 등록하십시오.

 Class2 z = new Class2(); 

     lexer.AddErrorListener(z); 

그러나 예상치 못한 오류가 발생합니다.

Argument 1: cannot convert from 'CSSParserAntlr.Class2' to 'Antlr4.Runtime.IAntlrErrorListener<int>'  

The best overloaded method match for 'Antlr4.Runtime.Recognizer<int,Antlr4.Runtime.Atn.LexerATNSimulator>.AddErrorListener(Antlr4.Runtime.IAntlrErrorListener<int>)' has some invalid arguments 

나에게 이런 일이 왜 어떤 이유를주십시오.

는 렉서의 클래스 서명과 일치하기 위해
class Class2 : IAntlrErrorListener<int> 

정의 다음과 같이 : 다음과 같이 Class2의 선언해야하기 때문에

답변

2

먼저,이 예외를 받고있는 이유는

public abstract class Lexer : Recognizer<int, LexerATNSimulator>, ITokenSource 

AddErrorListener의 메서드 서명은 다음과 같이 Recognizer에서 클래스 정의의 Symbol 형식과 일치하도록 정의됩니다.

public abstract class Recognizer<Symbol, ATNInterpreter> : IRecognizer 

즉, 인식기를 확장 할 때 Lexer가 "심볼"로 "int"를 지정하므로 AddErrorListener 메소드에 int 유형의 IAntlrErrorListener가 필요합니다.

이제 진짜 대답 질문 : 렉서에 대한 오류 수신기를 작성하지 마십시오. 렉싱의 오류는 사용자 입력이 아닌 렉스 문법의 오류입니다. 에러 리스너는 Parser에서 잘못된 사용자 입력을 처리 할 때 유용합니다. Lexer 문법은 개발 중에 적용 범위를 테스트해야합니다. 즉, 가능한 모든 입력이 일부 토큰과 일치해야합니다. 개발 중에 렉스 에러가 발생하면, 디폴트 에러 리스너는 정상적으로 작동합니다.

자세한 내용은 여기를 참조하십시오. ANTLR4 Lexer error reporting (length of offending characters)