2016-05-09 22 views
6

在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令牌識別錯誤:'?'

+0

如果您想要收聽所有錯誤,則可能需要禁用恢復邏輯。 –

回答

0

沒有看到你的語法,我只能猜測什麼是錯的,但我假設你有一個接受&作爲其一部分的規則,所以當你在X&Y餵養它被接受爲一個令牌,從而有效的輸入。

在這種情況下,調試的第一步應該是打印出詞法分析器看到的所有標記列表。見TokenStream.getTokens()。這會告訴你,如果令牌在您編寫語法時按照您期望的方式識別出來。

+0

我很欣賞答案,btut我不接受語法中任何地方的x&y。我甚至嘗試改變x?y同樣的問題。 – shuri17

0

我想通了。本質上,問題在於它是一個詞法錯誤,而不是語法錯誤。因此,替換詞法分析器的錯誤偵聽器就是一個竅門。