我在ANTLR邮件列表档案中问过这个问题,但我没有收到回复,所以我会在这里试试。
在树行走期间删除节点/树是否有问题?我想找到任何特定的子树并摆脱它们。我认为这个规则会起作用......
attribute : ^(ATTRIBUTE ID ATTR_VALUE) -> ;
但是我得到一个NullPointerException。
另外,你能编写一般规则来匹配具有一系列根令牌的树吗?
tree : : ^(root attribute+ children+=.*) -> ^(root $children*);
fragment root : A | B;
我似乎一直在获取EmptyRewriteExceptions:)
答案 0 :(得分:1)
在树木漫步过程中删除节点/树是否有问题?
在某些情况下, 可能会出错。例如,每当attribute
(您刚刚重写被删除)成为其他树的根时。可能还有其他原因,但这就是其中之一。当attribute
始终是树中的领导者时,我认为它不会造成任何伤害。如果这不能回答您的问题,请考虑发布SSCCE(请务必发布实际的SSCCE!)。
另外,你能编写一般规则来匹配具有一系列根令牌的树吗?
不,运营商+=
创建了List
个Common[Token/Tree]
。你需要将.*
移动到另一个规则,就像这样(未经测试!):
tree : ^(root attribute+ children) -> ^(root children);
children : .* ;