public string Verbose()
        {
            var result = GetType().Name;

            if (_position != null)
            {
                var start = _position.Start;
                var end   = _position.End;

                var line   = end.Line;
                var symbol = Math.Min(start.Symbol, end.Symbol);
                var length = Math.Abs(end.Symbol - start.Symbol);

                result += $" at {line + 1}:{symbol + 1}:{length}:";

                if (Source != null)
                {
                    var prevLine  = Source.FetchLine(line - 1, null);
                    var errorPart = Source.Highlight(line, symbol, length);
                    var nextLine  = Source.FetchLine(line + 1, null);

                    var codePart = "*----------------------------*\n";
                    if (prevLine != null)
                    {
                        codePart += prevLine + "\n";
                    }
                    codePart += errorPart;
                    if (nextLine != null)
                    {
                        codePart += "\n" + nextLine;
                    }
                    codePart += "\n*----------------------------*";

                    result += "\n\n" + codePart;
                }
            }

            return(result + "\n\n" + ToString());
        }