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