我有一个用于简单 DSL 的 ANTLR 语法,并且在没有语法错误的情况下一切正常。然而,现在我需要支持自动完成机制,我需要从我的树语法中获得可能的完成,这些语法对属性、函数等执行基本类型检查。
问题是,ANTLR 不是在本地statement
级别报告语法错误,而是在解析树的更远处,例如在program
orfunction
级别。因此,而不是看起来像的 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 目标。