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: '?'
Möglicherweise gibt es eine Wiederherstellungslogik, die Sie deaktivieren müssen, wenn Sie alle Fehler abhören möchten. –