parse method

  1. @override
Result<String>? parse(
  1. State<StringReader> state
)
override

Implementation

@override
Result<String>? parse(State<StringReader> state) {
  final input = state.input;
  final length = input.length;
  final list = <String>[];
  var last = state.pos;
  while (true) {
    final start = state.pos;
    final r = p.parse(state);
    if (r != null) {
      if (start != last) {
        list.add(input.substring(last, start));
      }

      last = state.pos;
      final s = input.substring(start, state.pos);
      final v = f(s);
      if (v.isNotEmpty) {
        list.add(v);
      }
    }

    if (state.pos >= length) {
      break;
    }

    if (state.pos == start) {
      input.readChar(state.pos);
      state.pos += input.count;
    }
  }

  if (state.pos != last) {
    list.add(input.substring(last, state.pos));
  }

  switch (list.length) {
    case 0:
      return const Result('');
    case 1:
      return Result(list[0]);
    default:
      return Result(list.join());
  }
}