ANTLR删除树上的节点

时间:2012-11-28 13:01:53

标签: c# parsing tree antlr abstract-syntax-tree

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

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

attribute  : ^(ATTRIBUTE ID ATTR_VALUE) -> ;

但是我得到一个NullPointerException。

另外,你能编写一般规则来匹配具有一系列根令牌的树吗?

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

fragment root : A | B;

我似乎一直在获取EmptyRewriteExceptions:)

1 个答案:

答案 0 :(得分:1)

  

在树木漫步过程中删除节点/树是否有问题?

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

  

另外,你能编写一般规则来匹配具有一系列根令牌的树吗?

不,运营商+=创建了ListCommon[Token/Tree]。你需要将.*移动到另一个规则,就像这样(未经测试!):

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

children : .* ;