2016-05-09 24 views
6

W antlr 4, Mam gramatyki, który trwa ciągi formatu x * y, x + y, etcW Antlr4, C#, obsługa błędów nie jest wyrzucenie jak oczekiwano

chcę złapać błąd podczas używany jest niepoprawny operator, na przykład x & y. Jeśli dodam kod jak:

parser.RemoveErrorListeners(); 
parser.AddErrorListener(new MyErrorListener()); 

i zdefiniować MyErrorListener jak:

public class MyErrorListener : BaseErrorListener 
{ 
    public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e) 
    { 

...

SyntaxError nie jest wywoływana w przypadku X & Y .... ale nazywać się w obudowie X & ...

Jestem całkowicie zdezorientowany, ponieważ odbiornik odsłuchowy pokaże błąd dla obu formularzy, ale mój niestandardowe nie. Wszystko, co naprawdę chciałbym móc zrobić, to powiedzieć: "Jeśli wystąpił błąd parsowania, zrób x", ale nie mogę tego zrozumieć.

Pomoc!

Oto część gramatyki btw:

equation : boolEquation (op=(AND|OR) boolEquation)* ; 
boolEquation : NOT? boolExpression ; 
boolExpression : 
    left=expression (op=relop right=expression)? #BoolExpressionMatch ; 
expression : 
     name=ID LPAREN expList=expressionList RPAREN #FunctionMatch 
     | left=expression op=(TIMES | DIV | MODULUS) right=expression # ExpressionMatch 
     | left=expression op=(PLUS | MINUS) right=expression     #ExpressionMatch 
     | LPAREN expression RPAREN           #ParenthesizedExpressionMatch 
     | atom                #AtomMatch ; 

atom : number      #NumberMatch 
    | string      #StringMatch 
    | variable     #AtomVariableMatch 
    | unaryValue     #UnaryValueMatch 
    | boolean      #BooleanMatch ; 
string : ID ; 
boolean : TRUE | FALSE; 
unaryValue : EMPTY | PRESENT ; 
func : name=ID LPAREN expList=expressionList RPAREN ; 
expressionList : (expression (COMMA expression)*)? ; 
variable : WORD(POINT WORD)*  #VariableMatch ; 

...

Co ciekawe, nawet kiedy usunięcie wszystkich słuchaczy błędach, wciąż widzę to wyjście do konsoli: linii 1 : 1 błąd rozpoznania tokena w: "?"

+0

Może istnieć logika odzyskiwania, którą należy wyłączyć, aby odsłuchać wszystkie błędy. –

Odpowiedz

0

Nie widząc swoją gramatykę mogę się tylko domyślać, co się stało, ale zakładam, że masz regułę, która akceptuje & jako jego części, więc gdy karmisz w X&Y przyjęte jest jako wejście tokena i stąd ważny.

W takich przypadkach pierwszy krok do debugowania powinien polegać na wydrukowaniu listy wszystkich tokenów, które widzi lexer. Zobacz TokenStream.getTokens(). To pokaże ci, czy tokeny są rozpoznawane tak, jak ich oczekiwałeś, gdy pisałeś swoją gramatykę.

+0

Doceniam odpowiedź, ale nie akceptuję x & y gdziekolwiek w mojej gramatyce. Próbowałem nawet zmienić na x? Y z tym samym problemem. – shuri17

0

Wymyśliłem to. Zasadniczo problemem był błąd leksykalny, a nie błąd składniowy. Zastąpienie luminescencyjnego analizatora błędów rozwiązało problem.