在ANTLR的4解僱,我有一個語法這需要格式X * Y,X + Y的字符串等在Antlr4,C#,錯誤處理是沒有得到預期
我要趕時出錯使用無效的運算符,如x & y。 如果我添加如下代碼:
parser.RemoveErrorListeners();
parser.AddErrorListener(new MyErrorListener());
,並定義爲MyErrorListener:
public class MyErrorListener : BaseErrorListener
{
public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
...
SyntaxError錯誤不在X &Ÿ情況下叫....但會被稱爲X &的情況下...
我完全困惑,因爲控制檯偵聽器將顯示兩種形式的錯誤,但我的自定義一個不會。我真正希望能夠做的是說「如果有任何類型的解析錯誤,請執行x」,但我似乎無法弄清楚這一點。
幫助!
這裏順便說一句語法的一部分:
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 ;
...
有趣的是,甚至當我刪除所有錯誤的聽衆,我仍然看到這個輸出到控制檯: 線1 :1令牌識別錯誤:'?'
如果您想要收聽所有錯誤,則可能需要禁用恢復邏輯。 –