1

我有一个用于简单 DSL 的 ANTLR 语法,并且在没有语法错误的情况下一切正常。然而,现在我需要支持自动完成机制,我需要从我的树语法中获得可能的完成,这些语法对属性、函数等执行基本类型检查。

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

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

我在树的顶部得到垃圾节点,因为未能匹配statement规则“冒泡”并阻止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 目标。

4

1 回答 1

1

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

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

于 2009-11-12T17:37:40.470 回答