1

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

4

2 回答 2

2

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

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

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

我不知道运行时性能是否受到影响(如果有的话),但我没有在性能对我的应用程序有问题的任何领域使用此构造。

于 2009-10-19T13:15:31.710 回答
1

虽然我不知道你到底想做什么,但是当我上次遇到这个问题时,我在 tree walker 中设置了一个布尔标志。例如:

@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 中,没有所谓的跳过后续规则这种事情。无论如何,他们都要经过。所以我们只能手动完成。

于 2009-07-28T07:01:54.400 回答