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: "?"
Może istnieć logika odzyskiwania, którą należy wyłączyć, aby odsłuchać wszystkie błędy. –