TreeView C# TreeViewNode

объясните почему создаётся несколько S

введите сюда описание изображения

код программы

   /* S→ ( D !: <1> ) | 
         D→ K | KC
         C → v K | v KC
         K→ A |  AN
         N → ^ A | ^ AN
         A → <2> |  7A  |  ( D )
    */
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using laba1;
using nsLex;

namespace nsSynt
{
    class CSyntAnalyzer
    {
        private String[] strFSource;
        private String[] strFMessage;
        public String[] strPSource { set { strFSource = value; } get { return strFSource; } }
        public String[] strPMessage { set { strFMessage = value; } get { return strFMessage; } }
        public CLex Lex = new CLex();
        public TreeNode GlNodes = new TreeNode("Syntax Tree");
        public void S(TreeNode Parent)
        {
            TreeNode node = new TreeNode("S");
            //if (Lex.enumPToken == TToken.lxmIdentifier)
            //{
            //    TreeNode nodeWord = new TreeNode(Lex.strPLexicalUnit);
            //    nodeWord.Nodes.Add(CurrentWord_to_Tree(Lex.strPLexicalUnit));
            //    node.Nodes.Add(nodeWord);
            //    Lex.NextToken();
            //}
            if (Lex.enumPToken == TToken.lxmLeftParenth)
            {
                TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());//создаем поддрево 

                node.Nodes.Add(nodeWord1);//записываем наше поддрево в дерево S
                Parent.Nodes.Add(node);//объединяем с родиьтелем
                D(node);
                if (Lex.enumPToken == TToken.lxmls)
                {
                    TreeNode nodeWord2 = new TreeNode(Lex.currentsymbol.ToString());//создаем поддрево 

                    node.Nodes.Add(nodeWord2);//записываем наше поддрево в дерево S
                    Parent.Nodes.Add(node);//объединяем с родиьтелем
                    Lex.NextToken();
                    if (Lex.enumPToken == TToken.lxmrs)
                    {
                        TreeNode nodeWord3 = new TreeNode(Lex.currentsymbol.ToString());//создаем поддрево 

                        node.Nodes.Add(nodeWord3);//записываем наше поддрево в дерево S
                        Parent.Nodes.Add(node);//объединяем с родиьтелем
                        Lex.NextToken();
                        //S(node);
                        if (Lex.enumPToken == TToken.lxmIdentifier)
                        {
                            TreeNode nodeWord = new TreeNode(Lex.strPLexicalUnit);
                            nodeWord.Nodes.Add(CurrentWord_to_Tree(Lex.strPLexicalUnit));
                            node.Nodes.Add(nodeWord);
                            Lex.NextToken();
                            if (Lex.enumPToken == TToken.lxmRightParenth)
                            {
                                TreeNode nodeWord5 = new TreeNode(Lex.currentsymbol.ToString());//создаем поддрево 

                                node.Nodes.Add(nodeWord5);//записываем наше поддрево в дерево S
                                Parent.Nodes.Add(node);//объединяем с родиьтелем
                                Lex.NextToken();
                            }
                            else throw new Exception("Ожидалась )");
                        }
                        else throw new Exception("Ожидался !");
                    }
                    else throw new Exception("Ожидалось :");
                }
                else throw new Exception("Ожидался !");
                
            }
            //else throw new Exception("Ожидалась (");
        }
        public void D(TreeNode Parent) // !
        {
            TreeNode node = new TreeNode("D");
            K(node);
            if (Lex.enumPToken == TToken.lxmor)
            {
                C(node);
            }
            Parent.Nodes.Add(node);
        }
        public void K(TreeNode Parent) // Без ошибок !
        {
            TreeNode node = new TreeNode("K");
            A(node);

            if (Lex.enumPToken == TToken.lxmand)
            {
                N(node);
                Lex.NextToken();
            }
            Parent.Nodes.Add(node);
        }
        public void C(TreeNode Parent)
        {
            TreeNode node = new TreeNode("C");
            {
                if (Lex.enumPToken == TToken.lxmor)
                {
                    TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());
                    node.Nodes.Add(nodeWord1);
                    K(node);
                }
                if (Lex.enumPToken == TToken.lxmor)
                {
                    TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());

                    node.Nodes.Add(nodeWord1);
                    K(node);
                    if (Lex.enumPToken == TToken.lxmor)
                    {
                        C(node);
                        Lex.NextToken();
                    }
                    Lex.NextToken();
                }
            }
            Parent.Nodes.Add(node);
        }

        public void A(TreeNode Parent)
        {
            TreeNode node = new TreeNode("A");
            Lex.NextToken();
            if (Lex.enumPToken == TToken.lxmNumber)
            {
                TreeNode nodeWord = new TreeNode(Lex.strPLexicalUnit);
                nodeWord.Nodes.Add(CurrentWord_to_Tree(Lex.strPLexicalUnit));
                node.Nodes.Add(nodeWord);
                Lex.NextToken();
            }

            if (Lex.enumPToken == TToken.lxmotr)
            {
                TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());
                node.Nodes.Add(nodeWord1);
                A(node);
            }

            if (Lex.enumPToken == TToken.lxmLeftParenth)
            {
                TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());
                node.Nodes.Add(nodeWord1);
                D(node);
                if (Lex.enumPToken == TToken.lxmRightParenth)
                {
                    Lex.NextToken();
                }
                else throw new Exception("Ожидалась )");
            }
            Parent.Nodes.Add(node);

        }
        public void N(TreeNode Parent)
        {
            TreeNode node = new TreeNode("N");
            if (Lex.enumPToken == TToken.lxmand)
            {
                TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());
                node.Nodes.Add(nodeWord1);
                A(node);
            }
            if (Lex.enumPToken == TToken.lxmand)
            {
                TreeNode nodeWord1 = new TreeNode(Lex.currentsymbol.ToString());
                node.Nodes.Add(nodeWord1);
                A(node);
                if (Lex.enumPToken == TToken.lxmand)
                {
                    N(node);
                }
                Lex.NextToken();
            }
            Parent.Nodes.Add(node);
        }
        private TreeNode CurrentWord_to_Tree(String word)
        {
            return Character(word, word.Length - 1);
        }

        private TreeNode Character(string str, int num, TreeNode node = null)
        {
            TreeNode tree = new TreeNode(str[num].ToString());
            if (node != null)
                tree.Nodes.Add(node);
            num--;
            if (num >= 0)
                return Character(str, num, tree);
            else
                return tree;

        }
    }
}

Ответы (0 шт):