/// <summary>
        /// Gets the close symbol which corresponds to the specified open symbol.
        /// </summary>
        private CommentSymbol GetCloseSymbol(CommentSymbol open)
        {
            Contract.Require(open, nameof(open));

            if (open.Type != CommentSymbolType.Open)
            {
                throw new ArgumentException(nameof(open));
            }

            if (open.Nesting > 0)
            {
                return(null);
            }

            var index = symbols.IndexOfKey(open.Position);

            for (int i = index + 1; i < symbols.Count; i++)
            {
                var symbol = symbols.Values[i];
                if (symbol.Type == CommentSymbolType.Close && symbol.Nesting == 0)
                {
                    return(symbol);
                }
            }

            return(null);
        }
        /// <summary>
        /// Gets the open symbol which corresponds to the specified close symbol.
        /// </summary>
        private CommentSymbol GetOpenSymbol(CommentSymbol close)
        {
            Contract.Require(close, nameof(close));

            if (close.Type != CommentSymbolType.Close)
            {
                throw new ArgumentException(nameof(close));
            }

            if (close.Nesting < 0)
            {
                return(null);
            }

            var index = symbols.IndexOfKey(close.Position);

            for (int i = index - 1; i >= 0; i--)
            {
                var symbol = symbols.Values[i];
                if (symbol.Type == CommentSymbolType.Open && symbol.Nesting == 0)
                {
                    return(symbol);
                }
            }

            return(null);
        }
        /// <summary>
        /// Gets the open symbol which corresponds to the specified close symbol.
        /// </summary>
        private CommentSymbol GetOpenSymbol(CommentSymbol close)
        {
            Contract.Require(close, nameof(close));

            if (close.Type != CommentSymbolType.Close)
                throw new ArgumentException(nameof(close));

            if (close.Nesting < 0)
                return null;

            var index = symbols.IndexOfKey(close.Position);

            for (int i = index - 1; i >= 0; i--)
            {
                var symbol = symbols.Values[i];
                if (symbol.Type == CommentSymbolType.Open && symbol.Nesting == 0)
                {
                    return symbol;
                }
            }

            return null;
        }
        /// <summary>
        /// Gets the close symbol which corresponds to the specified open symbol.
        /// </summary>
        private CommentSymbol GetCloseSymbol(CommentSymbol open)
        {
            Contract.Require(open, nameof(open));

            if (open.Type != CommentSymbolType.Open)
                throw new ArgumentException(nameof(open));

            if (open.Nesting > 0)
                return null;

            var index = symbols.IndexOfKey(open.Position);

            for (int i = index + 1; i < symbols.Count; i++)
            {
                var symbol = symbols.Values[i];
                if (symbol.Type == CommentSymbolType.Close && symbol.Nesting == 0)
                {
                    return symbol;
                }
            }

            return null;
        }