我有一個簡單的DSL的ANTLR語法,當沒有語法錯誤時,所有東西都可以順利運行。然而,現在我需要支持一種自動完成機制,在這種機制中,我需要從我的樹語法中獲得對屬性,函數等進行基本類型檢查的可能的完成。ANTLR容忍格式錯誤的語句(例如代碼完成)
問題是,ANTLR不是在本地statement
級別報告語法錯誤,但在分析樹的更上方,例如在program
或function
級別。因此,而不是看起來像
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目標。
我有一個catch子句,如wiki中所述,但可以理解的例外情況是觸發了總體函數規則,而不是特定的hosed語句。我的語法需要(我假設)支持部分語句,但我沒有設法一起破解它...... Xtext是一個有趣的選擇,但是。感謝您的鏈接。 – 2009-11-12 18:33:13