ANTLR容忍格式错误的语句(例如代码完成)

问题描述:

我有一个简单的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目标。

看看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