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

时间:2009-11-12 15:57:48

标签: parsing autocomplete antlr grammar

我有一个简单的DSL的ANTLR语法,当没有语法错误时,一切都在游泳。但是,现在我需要支持一个自动完成机制,我需要从我的树语法中获得可能的完成,这些语法对属性,函数等进行基本的类型检查。

问题是,ANTLR没有在本地statement级别报告语法错误,而是在解析树的更远处报告,例如,在programfunction级别。因此,而不是看起来像

的AST
             program
                |
             function   
            /   |    \
           /    |     \
       stat   hosed   stat

我在树顶部获得了垃圾节点,因为无法匹配statement规则“冒泡”并阻止function规则匹配。

有没有办法编写一个具有“catch-all”子句的规则来吃掉意想不到的令牌?

我想的是:

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 个答案:

答案 0 :(得分:1)

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

顺便说一下:如果你的目标是eclipse,你应该看一下xtext(http://www.eclipse.org/Xtext/) - 它基于ANTLR 3并生成一个很好的编辑器,带有语法高亮和代码辅助。