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); }
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); }
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); }