2013-08-28 4 views
6

Я обновил Antlr 3 до Antlr 4. Я использовал этот код для исключения исключений с помощью этого кода. Но это не работает для Antlr 4.Как собрать ошибки во время выполнения, заданные парсером в Antlr4

partial class XParser 
{ 
    public override void ReportError(RecognitionException e) 
    { 
     base.ReportError(e); 
     Console.WriteLine("Error in Parser at line " + ":" + e.OffendingToken.Column + e.OffendingToken.Line + e.Message); 
    } 
} 

Это ошибка, которая появляется

'Parser.ReportError(Antlr4.Runtime.RecognitionException)': no suitable method found to override 

В Antlr 4, что является ожидаемым способом накопления ошибок, который происходит во входном потоке. Я не смог найти способ добиться этого в сети. Пожалуйста, предоставьте мне некоторые рекомендации.

EDIT:

Я реализовал XParser ниже

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

Как вы сказали, что я могу расширить этот класс анализатора с помощью любого из указанных классов. Но я не смог зарегистрировать этого слушателя, в основной программе меня путают с передающим аргументом как listener. Пожалуйста, помогите мне с регистрацией.

Как я вижу, эти классы могут создавать более значимые сообщения об ошибках, не так ли?

ответ

9

Вам необходимо реализовать IAntlrErrorListener<IToken>. Если все, что вы хотите, сообщает о таких ошибках, как у вас, вы должны сосредоточиться на методе SyntaxError. Несколько базовых классов доступны, если вы хотите их расширить.

Слушатель ошибка прилагается к экземпляру синтаксического анализатора с помощью вызова parser.AddErrorListener(listener).

Редактировать: Вам необходимо создать новый класс, который реализует интерфейс прослушивателя ошибок. Затем вы присоединяете слушателя к парсеру. Сам анализатор не будет реализовывать интерфейс прослушивателя ошибок.

+0

Пожалуйста, взгляните на мое редактирование. У меня есть путаница и разъяснения. Спасибо за большую помощь в работе. Цените это много. –

+0

@Diode Я обновил свое сообщение. :) –

+1

@ 290Z28 Спасибо, что работает. Почему я не могу сделать то же самое с Лексером. Я попытался подражать тому, что я сделал для парсера, создав еще один класс и выполнив его из 'IAntlrErrorListener '. У экземпляра lexer есть метод AddErrorListener. –