예제 #1
0
            public static void Add(ref ParseTreeNodes nodes, ParseTreeNode node)
            {
                if (node == null)
                {
                    throw new ArgumentNullException("node");
                }

                var items = nodes.items;

                if (items != null)
                {
                    items.Add(node);
                    nodes = new ParseTreeNodes(items);
                    return;
                }

                switch (nodes.Count)
                {
                case 0: nodes = new ParseTreeNodes(node, null, null); break;

                case 1: nodes = new ParseTreeNodes(nodes.item0, node, null); break;

                case 2: nodes = new ParseTreeNodes(nodes.item0, nodes.item1, node); break;

                case 3: nodes = new ParseTreeNodes(new List <ParseTreeNode> {
                        nodes.item0, nodes.item1, nodes.item2, node
                    }); break;

                default: throw new ArgumentOutOfRangeException("node", "Unable to add new node. Tree is full.");
                }
            }
예제 #2
0
 internal ParseTreeNode(TokenType type, Token lexeme, string value)
 {
     this.Type   = type;
     this.Lexeme = lexeme;
     this.Value  = value ?? lexeme.Value;
     this.nodes  = new ParseTreeNodes();
 }
예제 #3
0
        private ParseTreeNode(TokenType type, ParseTreeNode otherNode)
        {
            if (otherNode == null)
            {
                throw new ArgumentNullException("otherNode");
            }

            this.Type   = type;
            this.Lexeme = otherNode.Lexeme;
            this.Value  = otherNode.Value;
            this.nodes  = otherNode.nodes;
        }
예제 #4
0
 internal ParseTreeNode(Token token, TokenType?type = null, string value = null, IEnumerable <ParseTreeNode> nodes = null)
 {
     this.Token = token;
     this.Type  = type ?? token.Type;
     this.Value = value ?? token.Value;
     this.nodes = new ParseTreeNodes();
     if (nodes != null)
     {
         foreach (var node in nodes)
         {
             this.Add(node);
         }
     }
 }
예제 #5
0
            public static void RemoveAt(ref ParseTreeNodes nodes, int index)
            {
                var items = nodes.items;

                if (items != null)
                {
                    items.RemoveAt(index);
                    nodes = new ParseTreeNodes(items);
                    return;
                }

                switch (index)
                {
                case 0: nodes = new ParseTreeNodes(nodes.item1, nodes.item2, null); break;

                case 1: nodes = new ParseTreeNodes(nodes.item0, nodes.item2, null); break;

                case 2: nodes = new ParseTreeNodes(nodes.item0, nodes.item1, null); break;

                default: throw new ArgumentOutOfRangeException("index");
                }
            }
예제 #6
0
            public static bool Remove(ref ParseTreeNodes nodes, ParseTreeNode node)
            {
                if (node == null)
                {
                    throw new ArgumentNullException("node");
                }

                var items = nodes.items;

                if (items != null)
                {
                    if (items.Remove(node) == false)
                    {
                        return(false);
                    }

                    nodes = new ParseTreeNodes(items);
                    return(true);
                }

                if (nodes.item2 == node)
                {
                    nodes = new ParseTreeNodes(nodes.item0, nodes.item1, null);
                }
                else if (nodes.item1 == node)
                {
                    nodes = new ParseTreeNodes(nodes.item0, nodes.item2, null);
                }
                else if (nodes.item0 == node)
                {
                    nodes = new ParseTreeNodes(nodes.item1, nodes.item2, null);
                }
                else
                {
                    return(false);
                }
                return(true);
            }
예제 #7
0
 internal bool Remove(ParseTreeNode node)
 {
     return(ParseTreeNodes.Remove(ref this.nodes, node));
 }
예제 #8
0
 internal void RemoveAt(int index)
 {
     ParseTreeNodes.RemoveAt(ref this.nodes, index);
 }
예제 #9
0
 internal void Insert(int index, ParseTreeNode node)
 {
     ParseTreeNodes.Insert(ref this.nodes, index, node);
 }
예제 #10
0
 internal void Add(ParseTreeNode node)
 {
     ParseTreeNodes.Add(ref this.nodes, node);
 }
예제 #11
0
 internal void Replace(int index, ParseTreeNode node)
 {
     ParseTreeNodes.RemoveAt(ref this.nodes, index);
     ParseTreeNodes.Insert(ref this.nodes, index, node);
 }