2016-05-09 8 views
6

In Antlr habe ich eine Grammatik, die In Antlr4, C#, wird Fehlerbehandlung nicht 4, erwartet gefeuert als

Ich möchte fangen einen Fehler nimmt Saiten Format x * Y, x + y, etc

wenn ein ungültiger Operator wird verwendet, z. B. x & y. Wenn ich hinzufügen Code wie:

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

Und definieren MyErrorListener als:

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

...

Syntax nicht in der X & Y Fall genannt wird .... aber wird in der X & Fall aufgerufen werden ...

Ich bin gründlich verwirrt, da der Konsolen-Listener einen Fehler für beide Formen, aber meine zeigen wird Brauch wird nicht. Alles, was ich wirklich tun möchte, ist zu sagen: "Wenn es irgendeinen Parsingfehler gibt, tu x", aber ich kann das nicht herausfinden.

Hilfe!

Hier ist ein Teil der Grammatik ist 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 ; 

...

Interessanterweise, auch wenn ich alle Fehler Hörer entfernen, sehe ich immer noch diese Ausgabe an die Konsole: Linie 1 : 1 Token-Erkennungsfehler bei: '?'

+0

Möglicherweise gibt es eine Wiederherstellungslogik, die Sie deaktivieren müssen, wenn Sie alle Fehler abhören möchten. –

Antwort

0

Ohne Ihre Grammatik zu sehen, kann ich nur raten, was falsch ist, aber ich nehme an, Sie haben eine Regel, die & als Teil davon akzeptiert. Wenn Sie also X&Y einspeisen, wird es als Token und somit gültige Eingabe akzeptiert.

In solchen Fällen sollte der erste Schritt zum Debuggen darin bestehen, eine Liste aller Token auszudrucken, die der Lexer sieht. Siehe TokenStream.getTokens(). Dies zeigt Ihnen, ob Token so erkannt werden, wie Sie es beim Schreiben Ihrer Grammatik erwartet haben.

+0

Ich schätze die Antwort, aber ich akzeptiere nicht x & y irgendwo in meiner Grammatik. Ich habe sogar versucht, mit demselben Problem zu x? Y zu wechseln. – shuri17

0

Ich fand es heraus. Im Wesentlichen war das Problem, dass es sich um einen Lexical-Fehler handelte, nicht um einen Syntaxfehler. Also hat das Ersetzen des Fehler-Listeners des lexikalischen Analysators den Trick gemacht.

Verwandte Themen