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