internal ParserExpression(string scheme, string content, ParserExpression next = null)
        {
            if (string.IsNullOrWhiteSpace(scheme))
            {
                throw new ArgumentNullException(nameof(scheme));
            }

            _scheme  = scheme.ToLowerInvariant().Trim();
            _content = content?.Trim();
            _next    = next;
        }
        public static bool TryParse(string text, out ParserExpression result)
        {
            result = null;

            if (string.IsNullOrWhiteSpace(text))
            {
                return(false);
            }

            using (var reader = new StringReader(text))
            {
                while (reader.Peek() > 0)
                {
                    var isFailed = false;
                    var current  = ParseCore(reader, _ => isFailed = true);

                    //如果解析失败则重置输出参数为空并返回假
                    if (isFailed)
                    {
                        result = null;
                        return(false);
                    }

                    if (current == null)
                    {
                        continue;
                    }

                    if (result == null)
                    {
                        result = current;
                    }
                    else
                    {
                        var item = result;

                        while (item.Next != null)
                        {
                            item = item.Next;
                        }

                        item.Next = current;
                    }
                }
            }

            return(true);
        }
        public static ParserExpression Parse(string text)
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                return(null);
            }

            ParserExpression result  = null;
            ParserExpression current = null;

            using (var reader = new StringReader(text))
            {
                while (reader.Peek() > 0)
                {
                    current = ParseCore(reader, message =>
                    {
                        throw new ParserException(message);
                    });

                    if (result == null)
                    {
                        result = current;
                    }
                    else                     //线性查找命令表达式的管道链,并更新其指向
                    {
                        var item = result;

                        while (item.Next != null)
                        {
                            item = item.Next;
                        }

                        item.Next = current;
                    }
                }
            }

            return(result);
        }