package edu.stanford.nlp.trees.tregex.tsurgeon;
import java.util.Map;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.tregex.TregexMatcher;
import edu.stanford.nlp.util.Pair;
/**
* @author Roger Levy (rog@stanford.edu)
*/
class InsertNode extends TsurgeonPattern {
TreeLocation location;
/**
* Does the item being inserted need to be deep-copied before
* insertion?
*/
boolean needsCopy = true;
public InsertNode(TsurgeonPattern child, TreeLocation l) {
super("insert", new TsurgeonPattern[] { child });
this.location = l;
}
@Override
protected void setRoot(TsurgeonPatternRoot root) {
super.setRoot(root);
location.setRoot(root);
}
public InsertNode(AuxiliaryTree t, TreeLocation l) {
this(new HoldTreeNode(t), l);
// Copy occurs in HoldTreeNode's `evaluate` method
needsCopy = false;
}
@Override
public TsurgeonMatcher matcher(Map<String,Tree> newNodeNames, CoindexationGenerator coindexer) {
return new Matcher(newNodeNames, coindexer);
}
private class Matcher extends TsurgeonMatcher {
TreeLocation.LocationMatcher locationMatcher;
public Matcher(Map<String,Tree> newNodeNames, CoindexationGenerator coindexer) {
super(InsertNode.this, newNodeNames, coindexer);
locationMatcher = location.matcher(newNodeNames, coindexer);
}
@Override
public Tree evaluate(Tree tree, TregexMatcher tregex) {
Tree nodeToInsert = childMatcher[0].evaluate(tree, tregex);
Pair<Tree,Integer> position = locationMatcher.evaluate(tree, tregex);
position.first().insertDtr(needsCopy ? nodeToInsert.deepCopy() : nodeToInsert,
position.second());
return tree;
}
}
@Override
public String toString() {
return label + '(' + children[0] + ',' + location + ')';
}
}