protected void installBetween(IBetweenElements pattern, AbstractElement loopCenter) { Set<MatcherState> states = getAllStates(loopCenter); for (MatcherState state : states) { state.getBeforeBetweenElements().add(pattern); state.getAfterBetweenElements().add(pattern); for (MatcherTransition transition : state.getAllOutgoing()) if (transition.getLoopCenter() == loopCenter && states.contains(transition.getTarget())) transition.addPattern(pattern); } }
@SuppressWarnings("unchecked") protected Collection<T> patternsForTwoStates(MatcherState first, MatcherState second) { Collection<IElementPattern> result = Sets.newHashSet(); if (first != null) { result.addAll(first.getAfterPatterns()); for (IBetweenElements between : first.getAfterBetweenElements()) if (getAllStates(between.matchBetween().getSecond()).contains(second)) result.add(between); for (IBetweenElements between : second.getBeforeBetweenElements()) if (getAllStates(between.matchBetween().getFirst()).contains(first)) result.add(between); } result.addAll(second.getBeforePatterns()); return (Collection<T>) result; } }
protected void installBetween(IBetweenElements pattern, AbstractElement first, AbstractElement second) { Set<MatcherState> sources = getAllStates(first); Set<MatcherState> targets = getAllStates(second); for (MatcherState target : targets) target.getBeforeBetweenElements().add(pattern); for (MatcherState source : sources) { source.getAfterBetweenElements().add(pattern); for (MatcherTransition transition : findTransitionsToToken(source, targets, source.isParserRuleCall(), true, Sets.<MatcherState> newHashSet())) { if (transition.getSource() == source) transition.addPattern(pattern); else transition.addPattern(source, pattern); } } }