2

我在 ANTLR 邮件列表档案中问过这个问题,但没有得到回复,所以我会在这里尝试。

在树遍历期间删除节点/树是否有问题?我想找到任何特定的子树并摆脱它们。我以为这条规则会起作用...

attribute  : ^(ATTRIBUTE ID ATTR_VALUE) -> ;

但我得到一个 NullPointerException。

此外,您能否编写通用规则来匹配具有一系列根标记的树?

tree : : ^(root attribute+ children+=.*) -> ^(root $children*);

fragment root : A | B;

我似乎一直在收到 EmptyRewriteExceptions :)

4

1 回答 1

1

在树遍历期间删除节点/树是否有问题?

在某些情况下,这可能会出错。例如,每当attribute(您刚刚重写以被删除)成为其他树的根时。可能还有其他原因,但这是其中之一。何时attribute将永远是树上的领先者,我认为它不会造成任何伤害。如果这不能回答您的问题,请考虑发布SSCCE(请务必发布实际的 SSCCE!)。

此外,您能否编写通用规则来匹配具有一系列根标记的树?

不,操作员+=创建了一个Lists Common[Token/Tree]。您需要将 移至.*另一个规则,如下所示(未经测试!):

tree : ^(root attribute+ children) -> ^(root children);

children : .* ;
于 2012-11-28T19:09:38.457 回答