代码之家  ›  专栏  ›  技术社区  ›  Sam Martin

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

  •  1
  • Sam Martin  · 技术社区  · 17 年前

    对于一个简单的DSL,我有一个ANTLR语法,当没有语法错误的时候,所有的东西都可以很好地工作。然而,现在我需要支持一种自动完成机制,在这种机制中,我需要从对属性、函数等执行基本类型检查的树语法中获得可能的完成。

    问题是,antlr没有在本地报告语法错误 statement 级别,但更高的分析树,例如 program 或 function 水平。因此,不是像

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

    我将垃圾节点放在树的顶部,因为无法匹配 陈述 规则“冒泡”并防止 功能 来自匹配的规则。

    有没有一种方法可以写一个规则,它有一个“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 回复  |  直到 17 年前
        1
  •  1
  •   Scott Stanchfield    17 年前

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

    顺便说一句:如果你的目标是Eclipse,你应该看看xtext( http://www.eclipse.org/Xtext/ )-它基于antlr 3,生成了一个很好的编辑器,具有语法无关性和代码辅助功能。