@Override
  public boolean visit(final CFGNode node, final Element element) {
    final LinkedList<Pair<XMLPattern, SimpleAutomatonID>> matchings =
        new LinkedList<Pair<XMLPattern, SimpleAutomatonID>>();
    for (XMLPattern pattern : getXMLAutomatonDefinition().getXMLpatterns()) {
      final Pair<Boolean, XMLPatternVariablesAssignment> matchResult =
          pattern.matchesNode(node, aliasResolver);
      if (matchResult.getFirst()) {
        final XMLPatternVariablesAssignment assign = matchResult.getSecond();
        final boolean isGlobal = isGlobalAssignement(assign);
        matchings.add(Pair.make(pattern, new SimpleAutomatonID(assign, isGlobal)));
      }
    }

    if (matchings.size() > 1) checkMatchingConflict(element, matchings);

    if (!matchings.isEmpty()) {
      final PatternLocation newLocation = createCommonPatternLocation(node, matchings);
      getNodeLocationDictionary().put(node, Pair.make(newLocation, newLocation));
      if (matchings.getFirst().getFirst().isConstructive())
        getAutomataIDs().add(matchings.getFirst().getSecond());
    } else if (getNavigator().isCallNode(node)) {
      final PatternLocation callLocation = createRuleLessPatternLocation(node);
      final PatternLocation returnLocation = createRuleLessPatternLocation(node);
      getNodeLocationDictionary().put(node, Pair.make(callLocation, returnLocation));
      callLocation.setLocationForCallNotPassedStates(returnLocation);
    }

    return true;
  }
  private void createStartEndPatternLocations() {
    final PatternLocation startLocation = createRuleLessPatternLocation(getCfg().getStartNode());
    getNodeLocationDictionary()
        .put(getCfg().getStartNode(), Pair.make(startLocation, startLocation));

    final PatternLocation endLocation = createRuleLessPatternLocation(getCfg().getEndNode());
    getNodeLocationDictionary().put(getCfg().getEndNode(), Pair.make(endLocation, endLocation));
  }