parseNumber function
Implementation
Token? parseNumber(String input, int index, int line, int column) {
final startIndex = index;
var passedValueIndex = index;
var state = _NumberState.start;
iterator:
while (index < input.length) {
final char = input[index];
switch (state) {
case _NumberState.start:
{
if (char == '-') {
state = _NumberState.minus;
} else if (char == '0') {
passedValueIndex = index + 1;
state = _NumberState.zero;
} else if (isDigit1to9(char)) {
passedValueIndex = index + 1;
state = _NumberState.digit;
} else {
return null;
}
break;
}
case _NumberState.minus:
{
if (char == '0') {
passedValueIndex = index + 1;
state = _NumberState.zero;
} else if (isDigit1to9(char)) {
passedValueIndex = index + 1;
state = _NumberState.digit;
} else {
return null;
}
break;
}
case _NumberState.zero:
{
if (char == '.') {
state = _NumberState.point;
} else if (isExp(char)) {
state = _NumberState.exp;
} else {
break iterator;
}
break;
}
case _NumberState.digit:
{
if (isDigit(char)) {
passedValueIndex = index + 1;
} else if (char == '.') {
state = _NumberState.point;
} else if (isExp(char)) {
state = _NumberState.exp;
} else {
break iterator;
}
break;
}
case _NumberState.point:
{
if (isDigit(char)) {
passedValueIndex = index + 1;
state = _NumberState.digitFraction;
} else {
break iterator;
}
break;
}
case _NumberState.digitFraction:
{
if (isDigit(char)) {
passedValueIndex = index + 1;
} else if (isExp(char)) {
state = _NumberState.exp;
} else {
break iterator;
}
break;
}
case _NumberState.exp:
{
if (char == '+' || char == '-') {
state = _NumberState.expDigitOrSign;
} else if (isDigit(char)) {
passedValueIndex = index + 1;
state = _NumberState.expDigitOrSign;
} else {
break iterator;
}
break;
}
case _NumberState.expDigitOrSign:
{
if (isDigit(char)) {
passedValueIndex = index + 1;
} else {
break iterator;
}
break;
}
}
index++;
}
if (passedValueIndex > 0) {
return Token(TokenType.number, line, column + passedValueIndex - startIndex,
passedValueIndex, safeSubstring(input, startIndex, passedValueIndex));
}
return null;
}