parse method
Parses the input and returns a result wrapped in Result if successful,
null
otherwise.
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());
}
}