public static IArgument Number(CharSource source, ref char chr) { var integral = source.ReadInt(ref chr); if (chr == '.') { if (!source.Advance(out chr)) { throw new FinalCharacterException("Expected fractional value after '.'"); } else if (!char.IsDigit(chr)) { throw new InvalidCharacterException($"Expected fractional value after '.': found '{chr}'"); } var fractional = source.ReadFractional(ref chr); var mantissa = integral >= 0 ? integral + fractional : integral - fractional; if (char.ToLower(chr) == 'e') { if (!source.AdvanceWhiteSpace(out chr)) { throw new FinalCharacterException("Expected exponent after 'e'"); } else if (!CharSource.IsNumberStart(chr)) { throw new InvalidCharacterException($"Expected exponent after 'e': found '{chr}'"); } var exponent = source.ReadInt(ref chr); mantissa *= Math.Pow(10, exponent); } return(new DoubleLiteral() { Value = mantissa }); } return(new IntegerLiteral() { Value = integral }); }
public static IArgument Default(CharSource source, ref char chr) { if (CharSource.IsNameStart(chr)) { var name = source.ReadName(ref chr); if (bool.TryParse(name, out var bval)) { return(new BooleanLiteral() { Value = bval }); } return(new NameArgument() { Value = name }); } else if (CharSource.IsNumberStart(chr)) { return(Number(source, ref chr)); } throw new InvalidCharacterException($"Not a valid name or number start: '{chr}'"); }