parseNumber function

Token? parseNumber(
  1. String input,
  2. int index,
  3. int line,
  4. int column,
)

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