package edu.stanford.nlp.trees.tregex.tsurgeon;
import java.util.Map;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.tregex.TregexMatcher;
/**
* An object factored out to keep the state of a <code>Tsurgeon</code>
* operation separate from the <code>TsurgeonPattern</code> objects.
* This makes it easier to reset state between invocations and makes
* it easier to use in a threadsafe manner.
* <br>
* TODO: it would be nice to go through all the patterns and make sure
* they update <code>newNodeNames</code> or look for appropriate nodes
* in <code>newNodeNames</code> when possible.
* <br>
* It would also be nicer if the call to <code>matcher()</code> took
* the tree & tregex instead of <code>evaluate()</code>, but that
* is a little more complicated because of the way the
* <code>TsurgeonMatcher</code> is used in <code>Tsurgeon</code>.
* Basically, you would need to move that code from
* <code>Tsurgeon</code> to <code>TsurgeonMatcher</code>.
*
* @author John Bauer
*/
public abstract class TsurgeonMatcher {
Map<String,Tree> newNodeNames;
CoindexationGenerator coindexer;
TsurgeonMatcher[] childMatcher;
// TODO: ideally we should have the tree and the tregex matcher be
// part of this as well. That would involve putting some of the
// functionality in Tsurgeon.java in this object
public TsurgeonMatcher(TsurgeonPattern pattern, Map<String, Tree> newNodeNames, CoindexationGenerator coindexer) {
this.newNodeNames = newNodeNames;
this.coindexer = coindexer;
this.childMatcher = new TsurgeonMatcher[pattern.children.length];
for (int i = 0; i < pattern.children.length; ++i) {
this.childMatcher[i] = pattern.children[i].matcher(newNodeNames, coindexer);
}
}
/**
* Evaluates the surgery pattern against a {@link Tree} and a {@link TregexMatcher}
* that has been successfully matched against the tree.
*
* @param tree The {@link Tree} that has been matched upon; typically this tree will be destructively modified.
* @param tregex The successfully matched {@link TregexMatcher}.
* @return Some node in the tree; depends on implementation and use of the specific subclass.
*/
public abstract Tree evaluate(Tree tree, TregexMatcher tregex);
}