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