我有一个简单的DSL的ANTLR语法,当没有语法错误时,一切都在游泳。但是,现在我需要支持一个自动完成机制,我需要从我的树语法中获得可能的完成,这些语法对属性,函数等进行基本的类型检查。
问题是,ANTLR没有在本地statement
级别报告语法错误,而是在解析树的更远处报告,例如,在program
或function
级别。因此,而不是看起来像
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目标。
答案 0 :(得分:1)
查看http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery
顺便说一下:如果你的目标是eclipse,你应该看一下xtext(http://www.eclipse.org/Xtext/) - 它基于ANTLR 3并生成一个很好的编辑器,带有语法高亮和代码辅助。