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); } } }
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); } }
protected void installBefore(IBeforeElement pattern) { Set<MatcherState> states = getAllStates(pattern.matchBefore()); for (MatcherState state : states) { state.getBeforePatterns().add(pattern); for (MatcherTransition incoming : state.getAllIncoming()) if (pattern.matchBefore() == incoming.getLoopCenter() || !states.contains(incoming.getSource())) incoming.addPattern(pattern); } }
protected void installAfter(IAfterElement pattern) { Set<MatcherState> states = getAllStates(pattern.matchAfter()); AbstractRule rule = GrammarUtil.containingRule(pattern.matchAfter()); for (MatcherState state : states) { state.getAfterPatterns().add(pattern); for (MatcherTransition out : state.isParserRuleCall() ? state.getOutgoingAfterReturn() : state .getOutgoing()) if (pattern.matchAfter() == out.getLoopCenter() || !states.contains(out.getTarget())) out.addPattern(pattern); if (state.isEndState()) for (MatcherState caller : findRuleCallsTo(rule, Sets.<AbstractRule> newHashSet())) for (MatcherTransition afterReturn : caller.getOutgoingAfterReturn()) afterReturn.addPattern(state, pattern); } }