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++;
                    }
                }
            }
        }