// Recursively walk an array of tokens
        public SCPInode Find(string[] tokens)
        {
            if (tokens == null || tokens.Length == 0)
            {
                return(null);
            }

            SCPInode child = Children.FirstOrDefault(s => s.Name == tokens[0]);

            if (tokens.Length == 1)
            {
                return(child);
            }
            else
            {
                return(child?.Find(tokens.Skip(1).ToArray()));
            }
        }
        // Override the Add-method, build parsetree here.
        public new void Add(Setting s)
        {
            base.Add(s);

            // Build parse tree
            SCPInode node;
            SCPInode parent = root;

            string[] keywords = s.SCPI.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < keywords.Length; i++)
            {
                node = parent.Find(keywords[i]);

                if (node == null)
                {
                    // If this is the last keyword, add the setting. Else add a new SCPInode.
                    if (i + 1 == keywords.Length)
                    {
                        node = s;
                    }
                    else
                    {
                        node = new SCPInode();
                    }

                    node.Name   = keywords[i];
                    node.Parent = parent;

                    parent.Children.Add(node);
                }
                else
                {
                    // Node is not null. If this is the last keyword, it means this setting has already been defined.
                    if (i == keywords.Length - 1)
                    {
                        throw new Exception("Node already defined");
                    }
                }

                parent = node;
            }
        }