Example #1
0
        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
            });
        }
Example #2
0
 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}'");
 }