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<T> { public SequenceMatchResult<T> apply(SequenceMatchResult<T> matchResult, int... groups); public final static class BoundAction<T> { SequenceMatchAction<T> action; int[] groups; public SequenceMatchResult<T> apply(SequenceMatchResult<T> seqMatchResult) { return action.apply(seqMatchResult, groups); } } public final static class StartMatchAction<T> implements SequenceMatchAction<T> { SequencePattern<T> pattern; public StartMatchAction(SequencePattern<T> pattern) { this.pattern = pattern; } public SequenceMatchResult<T> apply(SequenceMatchResult<T> seqMatchResult, int... groups) { SequenceMatcher<T> matcher = pattern.getMatcher(seqMatchResult.elements()); if (matcher.find()) { return matcher; } else { return null; } } } public final static class NextMatchAction<T> implements SequenceMatchAction<T> { public SequenceMatchResult<T> apply(SequenceMatchResult<T> seqMatchResult, int... groups) { if (seqMatchResult instanceof SequenceMatcher) { SequenceMatcher<T> matcher = (SequenceMatcher<T>) seqMatchResult; if (matcher.find()) { return matcher; } else { return null; } } else { return null; } } } public final static class BranchAction<T> implements SequenceMatchAction<T> { Predicate<SequenceMatchResult<T>> filter; SequenceMatchAction<T> acceptBranch; SequenceMatchAction<T> rejectBranch; public BranchAction(Predicate<SequenceMatchResult<T>> filter, SequenceMatchAction<T> acceptBranch, SequenceMatchAction<T> rejectBranch) { this.filter = filter; this.acceptBranch = acceptBranch; this.rejectBranch = rejectBranch; } public SequenceMatchResult<T> apply(SequenceMatchResult<T> 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<T> implements SequenceMatchAction<T> { List<SequenceMatchAction<T>> actions; public SeriesAction(SequenceMatchAction<T>... actions) { this.actions = Arrays.asList(actions); } public SeriesAction(List<SequenceMatchAction<T>> actions) { this.actions = actions; } public SequenceMatchResult<T> apply(SequenceMatchResult<T> seqMatchResult, int... groups) { SequenceMatchResult<T> res = seqMatchResult; for (SequenceMatchAction<T> a:actions) { res = a.apply(res, groups); } return res; } } }