ANTLR容忍格式错误的语句(例如代码完成)
问题描述:
我有一个简单的DSL的ANTLR语法,当没有语法错误时,所有东西都可以顺利运行。然而,现在我需要支持一种自动完成机制,在这种机制中,我需要从我的树语法中获得对属性,函数等进行基本类型检查的可能的完成。ANTLR容忍格式错误的语句(例如代码完成)
问题是,ANTLR不是在本地statement
级别报告语法错误,但在分析树的更上方,例如在program
或function
级别。因此,而不是看起来像
program
|
function
/ | \
/ | \
stat hosed stat
我得到整个树的顶部垃圾节点,如未能符合statement
规则的AST“冒泡”,并阻止匹配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目标。
答
看看http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery
顺便说一句:如果你的目标日食,你应该看看XTEXT(http://www.eclipse.org/Xtext/) - 它是基于ANTLR 3,并生成带有语法高亮显示和代码辅助一个很好的编辑器。
我有一个catch子句,如wiki中所述,但可以理解的例外情况是触发了总体函数规则,而不是特定的hosed语句。我的语法需要(我假设)支持部分语句,但我没有设法一起破解它...... Xtext是一个有趣的选择,但是。感谢您的链接。 – 2009-11-12 18:33:13