package edu.stanford.nlp.trees.tregex.tsurgeon;
import java.util.Map;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.Trees;
import edu.stanford.nlp.trees.tregex.TregexMatcher;
/** Excises all nodes from the top to the bottom, and puts all the children of bottom node in where the top was.
* @author Roger Levy (rog@stanford.edu)
*/
class ExciseNode extends TsurgeonPattern {
/**
* Top should evaluate to a node that dominates bottom, but this is not checked!
*/
public ExciseNode(TsurgeonPattern top, TsurgeonPattern bottom) {
super("excise", new TsurgeonPattern[] { top, bottom });
}
/**
* Excises only the directed node.
*/
public ExciseNode(TsurgeonPattern node) {
super("excise", new TsurgeonPattern[] { node,node });
}
@Override
public TsurgeonMatcher matcher(Map<String,Tree> newNodeNames, CoindexationGenerator coindexer) {
return new Matcher(newNodeNames, coindexer);
}
private class Matcher extends TsurgeonMatcher {
public Matcher(Map<String,Tree> newNodeNames, CoindexationGenerator coindexer) {
super(ExciseNode.this, newNodeNames, coindexer);
}
@Override
public Tree evaluate(Tree tree, TregexMatcher tregex) {
Tree topNode = childMatcher[0].evaluate(tree, tregex);
Tree bottomNode = childMatcher[1].evaluate(tree, tregex);
if(Tsurgeon.verbose) {
System.err.println("Excising...original tree:");
tree.pennPrint(System.err);
System.err.println("top: " + topNode + "\nbottom:" + bottomNode);
}
if (topNode == tree) {
if (bottomNode.children().length == 1) {
return bottomNode.children()[0];
} else {
return null;
}
}
Tree parent = topNode.parent(tree);
if(Tsurgeon.verbose)
System.err.println("Parent: " + parent);
int i = Trees.objectEqualityIndexOf(parent,topNode);
parent.removeChild(i);
for(Tree child : bottomNode.children()) {
parent.addChild(i,child);
i++;
}
if(Tsurgeon.verbose)
tree.pennPrint(System.err);
return tree;
}
}
}