/** * Vraci asociace, ktere ovlivnuji asociaci association podle toho, v jake casti tvorby konecneho automatu se nachazime. * * atribut mode urcuje, v jake casti tvorby konecneho automatu se nachazime **/ public static List <PSMAssociation> getAssociations(PSMAssociation association, CreationPhase mode) { List <PSMAssociation> associations = null; switch (mode) { case CreationPhase.ATTRIBUTE: associations = AssociationsUtils.associationsPropagatingAttributes(association, false); break; case CreationPhase.ELEMENT_ATTRIBUTE: associations = AssociationsUtils.associationsPropagatingAttributes(association, true); break; case CreationPhase.ELEMENT: associations = AssociationsUtils.associationsPropagatingElements(association); break; case CreationPhase.CONTENT_MODEL: associations = AssociationsUtils.associationsPropagatingAttributes(association, true); associations.AddRange(AssociationsUtils.associationsPropagatingElements(association)); break; } return(associations); }
private void inicialize(PSMAssociation topAssociation, String leftSideOfRules) { if (!rightSideToLeftSide.ContainsKey(topAssociation.Name)) { rightSideToLeftSide.Add(topAssociation.Name, new HashSet <string>()); } rightSideToLeftSide[topAssociation.Name].Add(leftSideOfRules); List <String> leftSideNames = new List <string>(); if (topAssociation.Child is PSMClass) { foreach (PSMAttribute attribute in ((PSMClass)topAssociation.Child).GetActualPSMAttributesIncludingInherited()) { String attLeftSideName = leftSideName + treeStateCount; treeStateCount++; leftSideNames.Add(attLeftSideName); if (!rightSideToLeftSide.ContainsKey(attribute.Name)) { rightSideToLeftSide.Add(attribute.Name, new HashSet <string>()); } rightSideToLeftSide[attribute.Name].Add(attLeftSideName); } } foreach (PSMAssociation association in AssociationsUtils.namedAssociations(topAssociation, false, false)) { if (!association.IsNamed && ((PSMClass)association.Child).PSMAttributes.Count > 0) { foreach (PSMAttribute attribute in ((PSMClass)association.Child).PSMAttributes) { String attLeftSideName = leftSideName + treeStateCount; leftSideNames.Add(attLeftSideName); treeStateCount++; if (!rightSideToLeftSide.ContainsKey(attribute.Name)) { rightSideToLeftSide.Add(attribute.Name, new HashSet <string>()); } rightSideToLeftSide[attribute.Name].Add(attLeftSideName); } } } foreach (PSMAssociation association in AssociationsUtils.namedAssociations(topAssociation, false, false)) { if (association.IsNamed) { if (associationLeftSideName.ContainsKey(association)) { leftSideNames.Add(associationLeftSideName[association]); } else { leftSideNames.Add(leftSideName + treeStateCount); associationLeftSideName.Add(association, leftSideName + treeStateCount); treeStateCount++; } } } automatUtils.createFiniteAutomatForAssociation(topAssociation, leftSideNames, leftSideOfRules, ref forestStatesTransitions, ref wordToState); int index = topAssociation.Child is PSMClass ? ((PSMClass)topAssociation.Child).PSMAttributes.Count : 0; foreach (PSMAssociation association in AssociationsUtils.namedAssociations(topAssociation, false, false)) { if (!association.IsNamed && !association.IsNonTreeAssociation) { index++; } } foreach (PSMAssociation association in AssociationsUtils.namedAssociations(topAssociation, false, false)) { if (association.IsNamed && !inicializedAssociations.Contains(association)) { inicializedAssociations.Add(association); inicialize(association, leftSideNames[index]); } if (association.IsNamed) { index++; } } }