Irontalk.Compiler.GetNumberLiteral C# (CSharp) Method

GetNumberLiteral() public method

public GetNumberLiteral ( PerCederberg.Grammatica.Runtime.Token literal ) : STObject
literal PerCederberg.Grammatica.Runtime.Token
return STObject
        public STObject GetNumberLiteral(Token literal)
        {
            try {
                string input = literal.Image;
                int rloc = input.IndexOf("r");

                if (rloc > 0) {
                    // Radix numbers

                    if (input.EndsWith("r"))
                        throw new ParseException(Source, literal.StartLine, "Expected a digit between 0 and 9 following 'r'");

                    int sign = 1;

                    if (input.StartsWith("-")) {
                        sign *= -1;
                        input = input.Substring(1);
                        --rloc;
                    }

                    int @base = int.Parse(input.Substring(0, rloc));
                    input = input.Substring(rloc + 1);

                    if (input.StartsWith("-")) {
                        sign *= -1;
                        input = input.Substring(1);
                    }

                    string[] parts = input.Split('.');
                    long wholePart = 0;
                    string wholePartStr = parts[0];

                    for (int i = wholePartStr.Length - 1, power = 0; i >= 0; --i, ++power)
                        wholePart += GetDigitValue(wholePartStr[i], @base) * (int)Math.Pow(@base, power);

                    if (parts.Length > 1) {
                        // has decimal point
                        double dec = wholePart;
                        string decStr = parts[1];

                        for (int i = 0, max = decStr.Length; i < max; ++i)
                            dec += GetDigitValue(decStr[i], @base) * Math.Pow(@base, -(i + 1));

                        return new STInstance(dec * sign);
                    }

                    return new STInstance(wholePart * sign);
                }

                if (input.Contains("."))
                    return STInstance.For(double.Parse(literal.Image));
                else
                    return STInstance.For(long.Parse(literal.Image));
            } catch (ParseException e) {
                throw e;
            } catch (Exception e) {
                throw new CompileException(Source, literal.StartLine, "Error parsing numeric literal: " + e.Message, e);
            }
        }