2012-11-19 63 views
2

所述的Antlr某種程度上忽略字符如〜,@,#,$,%,* ,(,),{,},[,]來自輸入字符串。

我測試了輸入字符串的下面的語法,如show ~~~,show〜@#$%等,但Antlr轉義eclipse/antlr工程解釋器上的字符。我希望這樣的場景拋出一個異常,而不是從它們中恢復。如果你之前遇到過這種情況,請告訴我,如果是這樣,你做了什麼來擺脫它。

grammar Sample; 
options {language = Java;} @header {package a.b.c;} @lexer::header {package a.b.c;} 
prog: stat+ ; stat: expr ; expr: paramValueChildStructure ; 
paramValueChildStructure: ALPHANUMERIC; 
ALPHANUMERIC: ('a'..'z' |'A'..'Z' | '0'..'9')+ ; 

我想下面的選項擺脫上述問題,但是這給可達代碼編譯時間問題我產生lexer.java

OTHER  : . {throw new RuntimeException("unknown char: '" + $text + "'");}; 

感謝, 阿希什

+1

我決定添加此代碼的問題。 @lexer :: members { \t \t public void recover(RecognitionException re){ \t \t \t \t System.out。println(「lexer memeber recover」); \t \t \t \t throw new RuntimeException(re); \t \t} } – user1836974

回答

1

看這裏:http://www.antlr3.org/wiki/display/ANTLR3/Custom+Syntax+Error+Recovery

結論之前的最後一段可能是你需要的:

其他恢復機制內ANTLR運行時

沒有恢復,您可能需要定製, 的一個其它方面,那就是當不匹配()時會發生什麼。您將在 生成的代碼中看到有很多調用match()方法。 檢查的默認實現(在Java運行時),我們發現 的比賽方法調用的方法 recoverFromMismatchedToken(),這反過來會嘗試使用 當前按照設置堆棧來確定,如果我們不匹配的原因是 是有一個在輸入一個虛假令牌:XYZ當我們想 只是XZ或者丟失的令牌:XZ當我們想XY Z.如果ANTLR可以 確定,使用跟蹤組,通過跳過一個道理,它會 看有效的語法,那麼它將消耗虛假標記,報告額外的標記,但不會引發RecognitionException。同樣,如果 ANTLR可以看到輸入的 流中只有一個令牌丟失,如果存在,會使語法有效,那麼它會製造這個缺少的令牌,報告錯誤,但不會再提起 RecognitionException。

如果您想要與此不同的行爲,那麼您可以覆蓋match()方法的 方法,或者更可能的方式爲recoverFromMismatchedToken() 方法。也許你不想要虛假/缺少錯誤檢測? 或者,你會從默認的實現看,ANTLR將首先 看它是否可以忽略令牌解決的事情,然後去,看看它是否 可以通過添加令牌解決的事情。不過,也有可以使用兩種方法來恢復一些語法錯誤 - 也許你想 逆轉,這些戰略試驗的順序?

+0

鏈接已死亡。您能否將相關信息添加到帖子中。 – bolov