public JsonItem ParseNext()
        {
            this.state = JsonNumberParseState.Start;
            while (this.state != JsonNumberParseState.End)
            {
                switch (this.state)
                {
                case JsonNumberParseState.Start:
                    if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.Digit;
                    }
                    else if (this.Consume('-'))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.Neg;
                    }
                    else
                    {
                        return(this.MakeError(Numbers, '-'));
                    }
                    break;

                case JsonNumberParseState.Neg:
                    if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.Digit;
                    }
                    else
                    {
                        return(this.MakeError(Numbers));
                    }
                    break;

                case JsonNumberParseState.Digit:
                    if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                    }
                    else if (this.Consume('.'))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.Decimal;
                    }
                    else if (this.Consume('e', 'E'))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.ExpSign;
                    }
                    else
                    {
                        this.state = JsonNumberParseState.End;
                    }
                    break;

                case JsonNumberParseState.Decimal:
                    if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                    }
                    else if (this.Consume('e', 'E'))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.ExpSign;
                    }
                    else
                    {
                        this.state = JsonNumberParseState.End;
                    }
                    break;

                case JsonNumberParseState.ExpSign:
                    if (this.Consume('+', '-'))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.Exp;
                    }
                    else if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.ExpValue;
                    }
                    else
                    {
                        return(this.MakeError(Numbers, '+', '-'));
                    }
                    break;

                case JsonNumberParseState.Exp:
                    if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonNumberParseState.ExpValue;
                    }
                    else
                    {
                        return(this.MakeError(Numbers));
                    }
                    break;

                case JsonNumberParseState.ExpValue:
                    if (this.Consume(Numbers))
                    {
                        this.stringBuilder.Append(this.OutChar);
                    }
                    else
                    {
                        this.state = JsonNumberParseState.End;
                    }
                    break;
                }
            }
            long   asLong;
            double asDouble;
            var    str = this.stringBuilder.ToString();

            if (long.TryParse(str, out asLong))
            {
                return(new JsonInteger(asLong));
            }
            if (this.TryParse(str, out asDouble))
            {
                return(new JsonFloat(asDouble));
            }
            return(this.MakeError("the supplied number could not be parsed into a numerical value acceptable to the runtime."));
        }
 public JsonItem ParseNext()
 {
     this.state = JsonNumberParseState.Start;
     while (this.state != JsonNumberParseState.End)
     {
         switch (this.state)
         {
             case JsonNumberParseState.Start:
                 if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.Digit;
                 }
                 else if (this.Consume('-'))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.Neg;
                 }
                 else
                 {
                     return this.MakeError(Numbers, '-');
                 }
                 break;
             case JsonNumberParseState.Neg:
                 if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.Digit;
                 }
                 else
                 {
                     return this.MakeError(Numbers);
                 }
                 break;
             case JsonNumberParseState.Digit:
                 if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                 }
                 else if (this.Consume('.'))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.Decimal;
                 }
                 else if (this.Consume('e', 'E'))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.ExpSign;
                 }
                 else
                 {
                     this.state = JsonNumberParseState.End;
                 }
                 break;
             case JsonNumberParseState.Decimal:
                 if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                 }
                 else if (this.Consume('e', 'E'))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.ExpSign;
                 }
                 else
                 {
                     this.state = JsonNumberParseState.End;
                 }
                 break;
             case JsonNumberParseState.ExpSign:
                 if (this.Consume('+', '-'))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.Exp;
                 }
                 else if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.ExpValue;
                 }
                 else
                 {
                     return this.MakeError(Numbers, '+', '-');
                 }
                 break;
             case JsonNumberParseState.Exp:
                 if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonNumberParseState.ExpValue;
                 }
                 else
                 {
                     return this.MakeError(Numbers);
                 }
                 break;
             case JsonNumberParseState.ExpValue:
                 if (this.Consume(Numbers))
                 {
                     this.stringBuilder.Append(this.OutChar);
                 }
                 else
                 {
                     this.state = JsonNumberParseState.End;
                 }
                 break;
         }
     }
     long asLong;
     double asDouble;
     var str = this.stringBuilder.ToString();
     if (long.TryParse(str, out asLong))
     {
         return new JsonInteger(asLong);
     }
     if (this.TryParse(str, out asDouble))
     {
         return new JsonFloat(asDouble);
     }
     return this.MakeError("the supplied number could not be parsed into a numerical value acceptable to the runtime.");
 }