private static bool DoInclude(ref StateContext context)
        {
            switch (context.Character)
            {
            case ',':
                context.Include();
                context.State = State.None;
                break;

            case ':':
                context.Include();
                context.State = State.PagingCount;
                break;

            case '(':
                context.Include();
                context.State = State.SortingField;
                break;

            case '{':
                context.Include();
                context.Push();
                context.State = State.None;
                break;

            case '}':
                context.Include();
                context.Pop();
                context.State = State.None;
                break;

            default:
                if (context.IsLetterOrDigitOrUnderscore())
                {
                    //判断标识中间是否含有空白字符
                    if (context.Flags.HasWhitespace())
                    {
                        context.OnError("SyntaxError: The identifier of the data schema contains whitespace characters.");
                        return(false);
                    }

                    context.Accept();
                }
                else if (!context.IsWhitespace())
                {
                    context.OnError($"SyntaxError: The identifier of the data schema contains '{context.Character}' illegal character.");
                    return(false);
                }

                break;
            }

            //重置是否含有空格的标记
            context.Flags.HasWhitespace(context.IsWhitespace());

            return(true);
        }
        private static bool DoExclude(ref StateContext context)
        {
            switch (context.Character)
            {
            case ',':
                context.Exclude();
                context.State = State.None;
                break;

            case '}':
                context.Exclude();
                context.Pop();
                context.State = State.None;
                break;

            default:
                if (context.IsLetterOrDigitOrUnderscore())
                {
                    //如果首字符是数字,则激发错误
                    if (char.IsDigit(context.Character) && !context.HasBuffer())
                    {
                        context.OnError("SyntaxError: The identifier of the data schema cannot start with a digit.");
                        return(false);
                    }

                    //判断标识中间是否含有空白字符
                    if (context.Flags.HasWhitespace())
                    {
                        context.OnError("SyntaxError: The identifier of the data schema contains whitespace characters.");
                        return(false);
                    }

                    context.Accept();
                }
                else if (!context.IsWhitespace())
                {
                    context.OnError($"SyntaxError: The identifier of the data schema contains '{context.Character}' illegal character.");
                    return(false);
                }

                break;
            }

            //重置是否含有空格的标记
            context.Flags.HasWhitespace(context.IsWhitespace());

            return(true);
        }
        private static bool DoExclude(ref StateContext context)
        {
            switch (context.Character)
            {
            case ',':
                context.Exclude();
                context.State = State.None;
                break;

            case '}':
                context.Exclude();
                context.Pop();
                context.State = State.None;
                break;

            default:
                if (context.IsLetterOrDigitOrUnderscore())
                {
                    //如果首字符是数字,则激发错误
                    if (char.IsDigit(context.Character) && !context.HasBuffer())
                    {
                        context.OnError("");
                        return(false);
                    }

                    //判断标识中间是否含有空白字符
                    if (context.Flags.HasWhitespace())
                    {
                        context.OnError("");
                        return(false);
                    }

                    context.Accept();
                }
                else if (!context.IsWhitespace())
                {
                    context.OnError("");
                    return(false);
                }

                break;
            }

            //重置是否含有空格的标记
            context.Flags.HasWhitespace(context.IsWhitespace());

            return(true);
        }
示例#4
0
        private static bool DoGutter(ref StateContext context, int position)
        {
            switch (context.Character)
            {
            case '.':
                context.State = State.Separator;
                return(true);

            case '[':
                context.State = State.Indexer;

                //追加索引器表达式,并将索引器加入到递归栈中
                context.AppendIndexer();

                return(true);

            default:
                if (context.IsWhitespace())
                {
                    return(true);
                }

                context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                return(false);
            }
        }
        private static bool DoAsterisk(ref StateContext context)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            switch (context.Character)
            {
            case ',':
                context.Include("*");
                context.State = State.None;
                return(true);

            case '}':
                context.Include("*");
                context.Pop();
                context.State = State.None;
                return(true);

            default:
                context.OnError($"SyntaxError: Contains the illegal character '{context.Character}' in the data schema.");
                return(false);
            }
        }
        private static bool DoNone(ref StateContext context)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            switch (context.Character)
            {
            case '*':
                context.State = State.Asterisk;
                return(true);

            case '!':
                context.State = State.Exclude;
                return(true);

            case '}':
                return(context.Pop() != null);

            case ',':
                return(true);

            default:
                if (context.IsLetterOrUnderscore())
                {
                    context.Accept();
                    context.State = State.Include;
                    return(true);
                }

                context.OnError($"SyntaxError: Contains the illegal character '{context.Character}' in the data schema.");
                return(false);
            }
        }
示例#7
0
        private static bool DoMethod(ref StateContext context, int position)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            if (context.Character == '\'' || context.Character == '\"')
            {
                context.State = State.String;
                context.Flags.SetConstantType(TypeCode.String);
                context.Flags.SetStringQuote(context.Character);
                return(true);
            }

            if (context.Character >= '0' && context.Character <= '9')
            {
                context.State = State.Number;
                context.Flags.SetConstantType(TypeCode.Int32);
                context.Accept();
                return(true);
            }

            if (context.IsLetterOrUnderscore())
            {
                context.State = State.Identifier;
                context.Accept();
                return(true);
            }

            if (context.Character == '[')
            {
                context.AppendIndexer();
                return(true);
            }

            if (context.Character == ')')
            {
                context.Stack.Pop();
                context.ResetState();
                return(true);
            }

            context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
            return(false);
        }
示例#8
0
        private static bool DoSeparator(ref StateContext context, int position)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            if (context.IsLetterOrUnderscore())
            {
                context.State = State.Identifier;
                context.Accept();
                return(true);
            }

            context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
            return(false);
        }
        private static bool DoSortingGutter(ref StateContext context)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            if (context.IsLetterOrUnderscore())
            {
                context.Accept();
                context.State = State.SortingField;
                return(true);
            }

            context.OnError($"SyntaxError: Contains the illegal character '{context.Character}' in the data schema.");
            return(false);
        }
        private static bool DoSortingGutter(ref StateContext context)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            if (context.IsLetterOrUnderscore())
            {
                context.Accept();
                context.State = State.SortingField;
                return(true);
            }

            context.OnError("");
            return(false);
        }
示例#11
0
        private static bool DoParameter(ref StateContext context, int position)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            switch (context.Character)
            {
            case ',':
                context.State = context.GetOwnerState();
                break;

            case ']':
                if (context.GetOwnerState() != State.Indexer)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.Stack.Pop();
                context.ResetState();

                break;

            case ')':
                if (context.GetOwnerState() != State.Method)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.Stack.Pop();
                context.ResetState();

                break;

            default:
                context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                return(false);
            }

            return(true);
        }
示例#12
0
        private static bool DoNone(ref StateContext context, int position)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            if (context.IsLetterOrUnderscore())
            {
                context.State = State.Identifier;
                context.Accept();
                return(true);
            }

            if (context.Character == '[')
            {
                context.State = State.Indexer;
                context.Stack.Push(context.Head = MemberExpression.Indexer());
                return(true);
            }

            context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
            return(false);
        }
        private static bool DoNone(ref StateContext context)
        {
            if (context.IsWhitespace())
            {
                return(true);
            }

            switch (context.Character)
            {
            case '*':
                //context.Accept();
                context.State = State.Asterisk;
                return(true);

            case '!':
                context.State = State.Exclude;
                return(true);

            case '}':
                return(context.Pop() != null);

            case ',':
                return(true);

            default:
                if (context.IsLetterOrUnderscore())
                {
                    context.Accept();
                    context.State = State.Include;
                    return(true);
                }

                context.OnError("");
                return(false);
            }
        }
示例#14
0
        private static bool DoNumber(ref StateContext context, int position)
        {
            switch (context.Character)
            {
            case ',':
                var ownerState = context.GetOwnerState();

                if (ownerState != State.Indexer && ownerState != State.Method)
                {
                    context.OnError(EXCEPTION_UNKNOWN_MESSAGE);
                    return(false);
                }

                context.State = ownerState;
                context.AppendParameterConstant(context.Stack.Peek());

                break;

            case ']':
                if (context.GetOwnerState() != State.Indexer)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.AppendParameterConstant(context.Stack.Pop());
                context.ResetState();

                break;

            case ')':
                if (context.GetOwnerState() != State.Method)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.AppendParameterConstant(context.Stack.Pop());
                context.ResetState();

                break;

            case '.':
                var numberType = context.Flags.GetConstantType();

                if (numberType == TypeCode.Double || numberType == TypeCode.Single || numberType == TypeCode.Decimal)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.Flags.SetConstantType(TypeCode.Double);
                context.Accept();

                break;

            case 'L':
                context.State = State.Parameter;
                context.Flags.SetConstantType(TypeCode.Int64);
                context.AppendParameterConstant(context.Stack.Peek());

                break;

            case 'f':
            case 'F':
                context.State = State.Parameter;
                context.Flags.SetConstantType(TypeCode.Single);
                context.AppendParameterConstant(context.Stack.Peek());

                break;

            case 'm':
            case 'M':
                context.State = State.Parameter;
                context.Flags.SetConstantType(TypeCode.Decimal);
                context.AppendParameterConstant(context.Stack.Peek());

                break;

            default:
                if (context.Character >= '0' && context.Character <= '9')
                {
                    context.Accept();
                }
                else if (context.IsWhitespace())
                {
                    context.State = State.Parameter;
                    context.AppendParameterConstant(context.Stack.Peek());
                }
                else
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                break;
            }

            return(true);
        }
示例#15
0
        private static bool DoIdentifier(ref StateContext context, int position)
        {
            switch (context.Character)
            {
            case '.':
                context.State = State.Separator;

                context.AppendIdentifier(context.Peek());
                context.Flags.IsAttaching(true);

                break;

            case '[':
                context.State = State.Indexer;

                context.AppendIdentifier(context.Peek());
                context.AppendIndexer();
                context.Flags.IsAttaching(false);

                break;

            case '(':
                context.State = State.Method;

                context.AppendMethod();
                context.Flags.IsAttaching(false);

                break;

            case ',':
                var ownerState = context.GetOwnerState();

                if (ownerState == State.Indexer || ownerState == State.Method)
                {
                    context.State = ownerState;
                }
                else
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.AppendIdentifier(context.Peek());
                context.Flags.IsAttaching(false);

                break;

            case ']':
                if (context.GetOwnerState() != State.Indexer)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.AppendIdentifier(context.Stack.Pop());
                context.Flags.IsAttaching(false);

                //重置状态
                context.ResetState();

                break;

            case ')':
                if (context.GetOwnerState() != State.Method)
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                context.AppendIdentifier(context.Stack.Pop());
                context.Flags.IsAttaching(false);

                //重置状态
                context.ResetState();

                break;

            default:
                if (context.IsLetterOrDigitOrUnderscore())
                {
                    //判断标识表达式中间是否含有空白字符
                    if (context.Flags.HasWhitespace())
                    {
                        context.OnError(string.Format(EXCEPTION_IDENTIFIER_WHITESPACE_MESSAGE, position));
                        return(false);
                    }

                    context.Accept();
                }
                else if (!context.IsWhitespace())
                {
                    context.OnError(GetIllegalCharacterExceptionMessage(context.Character, position));
                    return(false);
                }

                break;
            }

            //重置是否含有空格的标记
            context.Flags.HasWhitespace(context.IsWhitespace());

            return(true);
        }