2009-11-12 45 views
1

我有一個簡單的DSL的ANTLR語法,當沒有語法錯誤時,所有東西都可以順利運行。然而,現在我需要支持一種自動完成機制,在這種機制中,我需要從我的樹語法中獲得對屬性,函數等進行基本類型檢查的可能的完成。ANTLR容忍格式錯誤的語句(例如代碼完成)

問題是,ANTLR不是在本地statement級別報告語法錯誤,但在分析樹的更上方,例如在programfunction級別。因此,而不是看起來像

   program 
       | 
      function 
      / | \ 
     / |  \ 
     stat hosed stat 

我得到整個樹的頂部垃圾節點,如未能符合statement規則的AST「冒泡」,並阻止匹配function規則。

有沒有辦法寫一個規則,有一個「全部通過」條款吃意想不到的令牌?

我在想是這樣的:

statement 
    : var_declaration 
    | if_statement 
    | for_loop 
    | garbage 
    ; 

garbage 
    : /* Match unexpected tokens, etc. (not actual statements, or closing 
     parens, braces, etc.). Maybe just consume one input token and let 
     the parser try again? */ 
    ; 

,可以有任意數量的AST垃圾節點,但之前的一切(最好)之後的垃圾應該是明智的。

我會很感激任何提示/建議/指針/等。我正在使用ANTLR v3,Java目標。

回答

1

看看http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery

順便說一句:如果你的目標日食,你應該看看XTEXT(http://www.eclipse.org/Xtext/) - 它是基於ANTLR 3,並生成帶有語法高亮顯示和代碼輔助一個很好的編輯器。

+0

我有一個catch子句,如wiki中所述,但可以理解的例外情況是觸發了總體函數規則,而不是特定的hosed語句。我的語法需要(我假設)支持部分語句,但我沒有設法一起破解它...... Xtext是一個有趣的選擇,但是。感謝您的鏈接。 – 2009-11-12 18:33:13