Ejemplo n.º 1
0
        /**
         * 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);
        }
Ejemplo n.º 2
0
        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++;
                }
            }
        }