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