package edu.stanford.nlp.trees.tregex.tsurgeon;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.tregex.TregexMatcher;
import edu.stanford.nlp.util.Generics;
import java.util.Map;
/**
* @author Roger Levy (rog@nlp.stanford.edu)
*/
class TsurgeonPatternRoot extends TsurgeonPattern {
public TsurgeonPatternRoot(TsurgeonPattern child) {
this(new TsurgeonPattern[] { child });
}
public TsurgeonPatternRoot(TsurgeonPattern[] children) {
super("operations: ", children);
setRoot(this);
}
boolean coindexes = false;
/**
* If one of the children is a CoindexNodes (or something else that
* wants coindexing), it can call this at the time of setRoot()
*/
void setCoindexes() {
coindexes = true;
}
@Override
public TsurgeonMatcher matcher() {
CoindexationGenerator coindexer = null;
if (coindexes) {
coindexer = new CoindexationGenerator();
}
return matcher(Generics.<String,Tree>newHashMap(), coindexer);
}
@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(TsurgeonPatternRoot.this, newNodeNames, coindexer);
}
/**
* returns null if one of the surgeries eliminates the tree entirely. The
* operated-on tree is not to be trusted in this instance.
*/
@Override
public Tree evaluate(Tree tree, TregexMatcher tregex) {
if (coindexer != null) {
coindexer.setLastIndex(tree);
}
for (TsurgeonMatcher child : childMatcher) {
tree = child.evaluate(tree, tregex);
if (tree == null) {
return null;
}
}
return tree;
}
}
}