2011-12-25 85 views
0

我正在使用antlr編寫語言的詞法分析器。
定義了語法後,antlr爲其生成了nextToken函數的lexer類的java代碼。每次使用此功能時,會返回一個公認的令牌給我,但如果它看到一個未定義的令牌,它拋出一個RecognitionException異常,當它抓住它,它拋出另一個異常:antlr錯誤(發生RecognitionException時出現無限循環)

catch (RecognitionException e) {throw new TokenStreamRecognitionException(e);} 

我已經寫了一個catch塊來捕獲這個異常並在輸出中打印某些內容,但問題出現在這之後,似乎不是隻打印錯誤並轉到下一個標記,而是在此之前返回到標記,再次測試並返回再次對這個未定義的令牌,結束到一個無限循環,如:

ID  a_1 
error occured at: rowNum:1 colNum:8 
line 1:8: unexpected char: '&' 
ID  a_1 
error occured at: rowNum:1 colNum:8 
line 1:8: unexpected char: '&' 
ID  a_1 
error occured at: rowNum:1 colNum:8 
line 1:8: unexpected char: '&' 
... 

我該如何修復nextToken只打印錯誤,並去其餘的輸入程序?

我搜索了整個網頁,但我無法解決問題,我想也許你以前遇到過這個錯誤。

回答

0

您可以在詞法分析器規則的末尾定義一個OTHER規則,並讓規則匹配任何字符。如果前面的詞法分析規則不匹配,這將始終匹配任何內容。然後,覆蓋nextToken()並檢查它是否是一個OTHER型與否:

lexer grammar T; 

@members { 
    @Override 
    public Token nextToken() { 
    Token t = super.nextToken(); 
    if(t.getType() == OTHER) { 
     // do something 
    } 
    return t; 
    } 
} 

// other lexer rules 

OTHER 
: . 
; 

請注意,如果您使用的是聯合語法,grammar T;,那麼你應該明確定義詞法分析器成員塊這樣的:

grammar T; 

@lexer::members { 
    @Override 
    public Token nextToken() { 
    Token t = super.nextToken(); 
    if(t.getType() == OTHER) { 
     // do something 
    } 
    return t; 
    } 
} 

... 
+0

感謝Bart,是的,我需要定義「OTHER」規則,但是我的主要問題是我在Eclipse中使用了「AntlrEclipse」插件來生成我的語法的java代碼和它生成的「nextToken」函數,似乎是我的主要問題,當它來錯過匹配錯誤,而不是說明錯誤,並去th它會回到輸入文件中,並嘗試再次檢查這個未定義的標記,所以它會導致無限循環,所以我想我必須使用Antlr的「nextToken」函數並按照您所說的覆蓋它。 – nafiseh 2011-12-28 06:09:25