Parsing 使用ANTLR容忍格式错误的语句(例如,用于代码完成)

Parsing 使用ANTLR容忍格式错误的语句(例如,用于代码完成),parsing,autocomplete,antlr,grammar,Parsing,Autocomplete,Antlr,Grammar,我有一个简单DSL的ANTLR语法,当没有语法错误时,一切都很顺利。然而,现在我需要支持一个自动完成机制,在这里我需要从我的树语法中获取可能的完成,这些树语法对属性、函数等执行基本类型检查 问题是,ANTLR不是在本地语句级别报告语法错误,而是在解析树的更高层,例如在程序或函数级别报告语法错误。因此 program | function / | \ /

我有一个简单DSL的ANTLR语法,当没有语法错误时,一切都很顺利。然而,现在我需要支持一个自动完成机制,在这里我需要从我的树语法中获取可能的完成,这些树语法对属性、函数等执行基本类型检查

问题是,ANTLR不是在本地
语句
级别报告语法错误,而是在解析树的更高层,例如在
程序
函数
级别报告语法错误。因此

             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目标。

看一看

顺便说一句:如果你的目标是eclipse,你应该看看xtext()——它基于ANTLR 3,生成了一个很好的编辑器,带有语法hilighting和代码辅助功能。

看看


顺便说一句:如果你的目标是eclipse,你应该看看xtext()——它基于ANTLR 3,生成了一个很好的编辑器,具有语法hilighting和代码辅助功能。

我有一个catch子句,如wiki中所述,但可以理解的是,异常是在总体函数规则上触发的,而不是特定的hosed语句。我的语法需要(我假设)支持部分语句,但我还没有设法将它们结合起来。。。不过,Xtext是一个有趣的选择。谢谢你的链接。我有一个catch子句,正如wiki中所描述的,但是可以理解的是,异常是基于总体函数规则,而不是特定的hosed语句。我的语法需要(我假设)支持部分语句,但我还没有设法将它们结合起来。。。不过,Xtext是一个有趣的选择。谢谢你的链接。