Beispiel #1
0
        public static IMemberExpression Parse(string text, int start, int count, Action <string> onError)
        {
            if (string.IsNullOrEmpty(text))
            {
                return(null);
            }

            if (start < 0 || start >= text.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(start));
            }

            if (count < 1)
            {
                count = text.Length - start;
            }
            else if (count > text.Length - start)
            {
                throw new ArgumentOutOfRangeException(nameof(count));
            }

            //创建解析上下文对象
            var context = new StateContext(text.Length, onError);

            //状态迁移驱动
            for (int i = start; i < start + count; i++)
            {
                context.Character = text[i];

                switch (context.State)
                {
                case State.None:
                    if (!DoNone(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Gutter:
                    if (!DoGutter(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Separator:
                    if (!DoSeparator(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Identifier:
                    if (!DoIdentifier(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Method:
                    if (!DoMethod(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Indexer:
                    if (!DoIndexer(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Parameter:
                    if (!DoParameter(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.Number:
                    if (!DoNumber(ref context, i))
                    {
                        return(null);
                    }

                    break;

                case State.String:
                    if (!DoString(ref context, i))
                    {
                        return(null);
                    }

                    break;
                }
            }

            //获取最终的解析结果
            return(context.GetResult());
        }