解析ANTLR AST时跳过树的一部分

时间:2009-07-22 11:42:47

标签: antlr

我正在使用ANTLR 3来创建AST。我想要有两个AST分析器,一个用于生产代码,一个用于我们已有的Eclipse插件。但是,该插件不需要树中的所有信息。我正在寻找的是一种解析树而不指定语法中所有分支的方法。有办法吗?

2 个答案:

答案 0 :(得分:2)

您可能已经想到了这一点,但我在树语法中使用了..*来跳过给定节点或任意数量的节点。

例如,我有一个允许函数声明的DSL,我的一个树语法只关心名称和参数,但不关心内容(可能是任意长的)。我使用.*作为占位符跳过了代码块的处理:

^(Function type_specifier? variable_name formal_parameters implemented_by? .*)

我不知道运行时性能命中,如果有的话,但我没有在性能对我的应用程序有问题的任何领域使用此构造。

答案 1 :(得分:1)

我不知道你究竟想做什么,但是当我上次遇到这个问题时,我在树步行者中设置了一个布尔标志。例如:

@members
{
    boolean executeAction = true;
}
...

equation:
@init{
    if(executeAction){
        //do your things
    }
}
@after{
    if(executeAction){
        //do your things
    }
}
    exp { if(executeAction){/* Do your things */} } EQU exp
;
exp:
@init{
    if(executeAction){
        //do your things
    }
}
@after{
    if(executeAction){
        //do your things
    }
}
    integer OPE integer
;

...

这样,您可以轻松地打开或关闭执行。您只需将所有代码包装到if语句中即可。

事实上,在Antlr中,没有一种叫做跳过后续规则的东西。无论如何他们都要走了。所以我们只能手动完成。