protected Set<MatcherState> findRuleCallsTo(AbstractRule rule, Set<AbstractRule> visited) { if (!visited.add(rule)) return Collections.emptySet(); Set<MatcherState> result = Sets.newHashSet(); Iterator<EObject> i = rule.eAllContents(); while (i.hasNext()) { EObject obj = i.next(); if (obj instanceof AbstractElement) { MatcherState state = nfaProvider.getNFA((AbstractElement) obj); if (state.hasTransitions()) for (MatcherTransition incoming : state.getAllIncoming()) if (incoming.isRuleCall() && result.add(incoming.getSource()) && incoming.getSource().isEndState()) result.addAll(findRuleCallsTo( GrammarUtil.containingRule(incoming.getSource().getGrammarElement()), visited)); } } return result; }
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 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); } } }