edu.stanford.nlp.ling.tokensregex.SequenceMatchAction Maven / Gradle / Ivy
package edu.stanford.nlp.ling.tokensregex;
import java.util.function.Predicate;
import java.util.Arrays;
import java.util.List;
/**
* Performs action on a sequence
*
* @author Angel Chang
*/
public interface SequenceMatchAction {
public SequenceMatchResult apply(SequenceMatchResult matchResult, int... groups);
public final static class BoundAction {
SequenceMatchAction action;
int[] groups;
public SequenceMatchResult apply(SequenceMatchResult seqMatchResult) {
return action.apply(seqMatchResult, groups);
}
}
public final static class StartMatchAction implements SequenceMatchAction {
SequencePattern pattern;
public StartMatchAction(SequencePattern pattern) {
this.pattern = pattern;
}
public SequenceMatchResult apply(SequenceMatchResult seqMatchResult, int... groups) {
SequenceMatcher matcher = pattern.getMatcher(seqMatchResult.elements());
if (matcher.find()) {
return matcher;
} else {
return null;
}
}
}
public final static class NextMatchAction implements SequenceMatchAction {
public SequenceMatchResult apply(SequenceMatchResult seqMatchResult, int... groups) {
if (seqMatchResult instanceof SequenceMatcher) {
SequenceMatcher matcher = (SequenceMatcher) seqMatchResult;
if (matcher.find()) {
return matcher;
} else {
return null;
}
} else {
return null;
}
}
}
public final static class BranchAction implements SequenceMatchAction {
Predicate> filter;
SequenceMatchAction acceptBranch;
SequenceMatchAction rejectBranch;
public BranchAction(Predicate> filter, SequenceMatchAction acceptBranch, SequenceMatchAction rejectBranch) {
this.filter = filter;
this.acceptBranch = acceptBranch;
this.rejectBranch = rejectBranch;
}
public SequenceMatchResult apply(SequenceMatchResult seqMatchResult, int... groups) {
if (filter.test(seqMatchResult)) {
return (acceptBranch != null)? acceptBranch.apply(seqMatchResult):null;
} else {
return (rejectBranch != null)? rejectBranch.apply(seqMatchResult):null;
}
}
}
public final static class SeriesAction implements SequenceMatchAction {
List> actions;
public SeriesAction(SequenceMatchAction... actions) {
this.actions = Arrays.asList(actions);
}
public SeriesAction(List> actions) {
this.actions = actions;
}
public SequenceMatchResult apply(SequenceMatchResult seqMatchResult, int... groups) {
SequenceMatchResult res = seqMatchResult;
for (SequenceMatchAction a:actions) {
res = a.apply(res, groups);
}
return res;
}
}
}