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 Edge drawFollowerEdge(AbstractElement grammarElement, MatcherTransition transition, boolean isParent) { Edge edge = new Edge(grammarElement, transition.getTarget().getGrammarElement()); // if (transition.getPrecedence() > -1) // edge.setLabel(String.valueOf(transition.getPrecedence())); List<String> label = Lists.newArrayList(); if (!transition.getCommonPatterns().isEmpty()) label.add("{" + toStr(transition.getCommonPatterns()) + "}"); // for (Map.Entry<AbstractRule, Set<IElementPattern>> e : transition.getExitPatterns().entrySet()) // label.add(e.getKey().getName() + ":{" + Joiner.on(", ").join(e.getValue()).replace("\\n", "\\\\n") + "}"); for (Map.Entry<MatcherState, Set<IElementPattern>> e : transition.getGuardPatterns().entrySet()) label.add(GrammarUtil.containingRule(e.getKey().getGrammarElement()).getName() + "-" + e.getKey() + ":{" + toStr(e.getValue()) + "}"); if (label.size() > 0) edge.setLabel(Joiner.on("\\n").join(label)); if (isParent) edge.put("arrowtail", "odot"); if (transition.isRuleCall()) edge.put("arrowhead", "onormalonormal"); else edge.put("arrowhead", "onormal"); return edge; }