private Graph<Symbol, double> CreateTreeSyntax(List<RuleProduction> rules, List<Symbol> tokens) { iToken = 0; Stack<Node<Symbol, double>> stack = new Stack<Node<Symbol, double>>(); int iRule = rules.Count - 1; var nodeActual = new Node<Symbol, double>(rules[iRule].Source.Name + (iRule), rules[iRule].Source); var firstNode = nodeActual; stack.Push(nodeActual); Graph<Symbol, double> result = new Graph<Symbol, double>(); while (stack.Count > 0) { nodeActual = stack.Pop(); RuleProduction ruleActual = rules[iRule--]; nodeActual.SetCustomOject("Rule", ruleActual); for (int j = 0; j < ruleActual.Destiny.Count; j++) { Node<Symbol, double> nodeChild = new Node<Symbol, double>(ruleActual.Destiny[j].Name, ruleActual.Destiny[j]); if (ruleActual.Destiny[j].Terminal) { if (ruleActual.Destiny[j].Id == tokens[iToken].Id) { nodeChild.Info = ruleActual.Destiny[j]; } } else { stack.Push(nodeChild); } nodeActual.AddEdge(ruleActual.Pertinence, nodeChild, ruleActual.Pertinence); } } iToken = 0; FillTerminals(firstNode, tokens); result = firstNode.ToGraph(); return result; }
public void FillTerminals(Node<Symbol, double> nodeActual, List<Symbol> tokens) { if (nodeActual != null) { for (int j = 0; j < nodeActual.Edges.Count; j++) { FillTerminals(nodeActual.Edges[j].Destiny, tokens); } if (iToken < tokens.Count) { var first = GrammarChomsky.Rules.FirstOrDefault(r => r.Source == nodeActual.Info && r.FirstDestiny().Id == tokens[iToken].Id); if (first != null) { Node<Symbol, double> nodeChild = new Node<Symbol, double>(tokens[iToken].Name, tokens[iToken]); nodeActual.AddEdge(first.Pertinence, nodeChild, first.Pertinence); iToken++; } } } }