public override Expression Scan(ParseEngine engine)
{
var start = engine.Pointer;
var chars = engine.Characters;
var ch = chars[start];
var isreal = false;
if (ParseEngine.IsNumber(ch) || (ch == '.' && start + 1 < chars.Length && ParseEngine.IsNumber(chars[start + 1])))
{
var index = start;
var exp = new NumberExpression(engine);
var number = 0.0;
var pow = 0;
if (ch != '.')
{
number += ToDoubleNumber(chars[index++]);
while (index < chars.Length && ParseEngine.IsNumber(ch = chars[index]))
{
number *= 10.0;
number += ToDoubleNumber(ch);
index++;
}
}
if (ch == '.')
{
isreal = true;
index++;
if (index < chars.Length && ParseEngine.IsNumber(chars[index]))
{
do
{
number *= 10.0;
number += ToDoubleNumber(chars[index++]);
pow++;
}
while (index < chars.Length && ParseEngine.IsNumber(ch = chars[index]));
}
}
if (ch == 'e' || ch == 'E')
{
isreal = true;
var epow = 0;
var sign = 1;
index++;
if (index < chars.Length && (chars[index] == '+' || chars[index] == '-'))
{
sign = chars[index] == '-' ? -1 : +1;
index++;
}
while (index < chars.Length && ParseEngine.IsNumber(ch = chars[index]))
{
epow *= 10;
epow += ToInt32Number(ch);
index++;
}
pow -= epow * sign;
}
var value = number / Math.Pow(10.0, pow);
if (ch == 'i')
{
exp.value = new ScalarValue(0.0, value);
index++;
}
else if (isreal)
exp.value = new ScalarValue(value);
else
exp.value = new ScalarValue((int)value);
exp.Length = index - start;
engine.SetPointer(index);
return exp;
}
return null;
}