⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree.cs

📁 关于CMM语言的解释器
💻 CS
字号:
using System;
using System.Windows.Forms;
using System.Xml;
using System.Text;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;

namespace CmmInterpretor
{

    public class  Tree
    {

        //将树保存成XML文件
        internal XmlDocument Tree2XML(ref TreeView treeView)
        {
            StringBuilder strOutput = new StringBuilder();
            strOutput.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
            strOutput.Append("<GrammerTree>\n");
            WalkTreeNodes(treeView.Nodes, ref strOutput);
            strOutput.Append("</GrammerTree>");

            XmlDocument xmlDoc = new XmlDocument();
            try
            {
                xmlDoc.LoadXml(strOutput.ToString());
            }
            catch (XmlException excp)
            {
                MessageBox.Show("无法保存XML文件");
                return null;
            }
            return xmlDoc;
        }

        //遍历各节点
        private void WalkTreeNodes(TreeNodeCollection nodeCol, ref System.Text.StringBuilder strOut)
        {
            foreach (TreeNode node in nodeCol)
            {
                string nodeText = node.Text;
                if (nodeText.Contains("<") || nodeText.Contains("&"))
                {
                    nodeText = Regex.Replace(nodeText, @"<", "&lt;").ToString();
                    nodeText = Regex.Replace(nodeText, @"&", "&amp;").ToString();
                }
                strOut.Append("<node>\n"); 
                strOut.Append("<text>"+nodeText+"</text>\n");
                if (node.GetNodeCount(true) > 0)
                {
                    WalkTreeNodes(node.Nodes, ref strOut);
                }
                strOut.Append("</node>\n");
                
            }
        }

        //根据输入的XML还原语法树
        internal void CreateTree(string str, TreeNodeCollection treeNodeCol)
        {
            XmlTextReader xtr = new XmlTextReader(new StringReader(str));
            int LastDepth = -1;
            int CurrentDepth = -1;
            TreeNode node = null;
            TreeNodeCollection nodeCol = null;
            xtr.WhitespaceHandling = WhitespaceHandling.None;
            while (xtr.Read())
            {
                if (xtr.NodeType == XmlNodeType.Element)
                {
                    switch (xtr.Name)
                    {
                        case "node":
                            node = new TreeNode();
                            CurrentDepth = xtr.Depth;

                            if (LastDepth == -1) //根节点
                            {
                                nodeCol = treeNodeCol;
                            }
                            else if (CurrentDepth < LastDepth) //上一级
                            {
                                for (int i = 0; i < LastDepth - CurrentDepth; i++)
                                {
                                    nodeCol = nodeCol[nodeCol.Count - 1].Parent.Parent.Nodes;
                                }
                            }
                            else if (CurrentDepth > LastDepth) // 下一级
                            {
                                for (int i = 0; i < CurrentDepth - LastDepth; i++)
                                {
                                    nodeCol = nodeCol[nodeCol.Count - 1].Nodes;
                                }
                            }
                            xtr.MoveToElement();
                            LastDepth = xtr.Depth;
                            break;
                        case "text":
                            node.Text = xtr.ReadString();
                            nodeCol.Add(node);
                            break;
                        default:
                            break;
                    }
                }
            }
            xtr.Close();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -