コード例 #1
0
        public void OrderProductionRules()
        {
            Dictionary <ProductionRule, int> orderDict = new Dictionary <ProductionRule, int>();

            Queue <ProductionRule> q = new Queue <ProductionRule>();
            int num = 0;

            foreach (NonTerminal initialNonTerminal in InitialNonTerminals)
            {
                foreach (ProductionRule productionRule in ProductionRules.Where(r => r.LeftHandNonTerminal == initialNonTerminal))
                {
                    if (!q.Contains(productionRule) && !orderDict.ContainsKey(productionRule))
                    {
                        q.Enqueue(productionRule);
                        orderDict[productionRule] = num++;
                    }
                }
            }

            while (q.Count != 0)
            {
                ProductionRule takenRule = q.Dequeue();
                foreach (ProductionRuleToken productionRuleToken in takenRule.RightHandSide.GetTokens())
                {
                    if (productionRuleToken is NonTerminalToken)
                    {
                        foreach (ProductionRule productionRule in ProductionRules.Where(r => r.LeftHandNonTerminal == ((NonTerminalToken)productionRuleToken).NonTerminal))
                        {
                            if (!q.Contains(productionRule) && !orderDict.ContainsKey(productionRule))
                            {
                                q.Enqueue(productionRule);
                                orderDict[productionRule] = num++;
                            }
                        }
                    }
                }
            }

            foreach (ProductionRule productionRule in ProductionRules)
            {
                if (!orderDict.ContainsKey(productionRule))
                {
                    q.Enqueue(productionRule);
                    orderDict[productionRule] = num++;
                }
            }

            productionRules.Sort(delegate(ProductionRule r1, ProductionRule r2) { return(orderDict[r1].CompareTo(orderDict[r2])); });
        }
コード例 #2
0
        public void GenerateElementAttributeDeclarationProductionRules()
        {
            foreach (PSMAttribute psmAttribute in Schema.PSMAttributes.Where(a => !a.Element))
            {
                NonTerminal nonTerminal = Grammar.GetNonTerminal(psmAttribute);
                Terminal    terminal    = Grammar.GetTerminal(psmAttribute.Name);
                Grammar.Terminals.Add(terminal);

                ProductionRule p = new ProductionRule();
                p.LeftHandNonTerminal = nonTerminal;
                p.RightHandSide       = new RightHandAttributeDeclaration
                {
                    t = terminal,
                    D = psmAttribute.AttributeType
                };
                Grammar.ProductionRules.Add(p);
                Grammar.Interpretation.Add(nonTerminal, psmAttribute);
            }
        }
コード例 #3
0
        public void GenerateElementComplexContentProductionRules()
        {
            foreach (PSMAssociation association in Schema.PSMAssociations.Where(a => a.IsNamed && a.Child is PSMClass))
            {
                NonTerminal nonTerminal = Grammar.GetNonTerminal(association);
                Terminal    terminal    = Grammar.GetTerminal(association.Name);
                Grammar.Terminals.Add(terminal);

                ProductionRule p = new ProductionRule();
                p.LeftHandNonTerminal = nonTerminal;
                p.RightHandSide       = new RightHandElementComplexContentDeclaration
                {
                    t  = terminal,
                    re = RewriteDown(association.Child)
                };

                Grammar.ProductionRules.Add(p);
                Grammar.Interpretation.Add(nonTerminal, association.Child);
            }
        }