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])); }); }
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); } }
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); } }