parseOn method
Primitive method doing the actual parsing.
The method is overridden in concrete subclasses to implement the
parser specific logic. The methods takes a parse context
and
returns the resulting context, which is either a Success or
Failure context.
Implementation
@override
Result<List<R>> parseOn(Context context) {
var current = context;
final elements = <R>[];
while (elements.length < min) {
final result = delegate.parseOn(current);
if (result.isFailure) {
return result.failure(result.message);
}
elements.add(result.value);
current = result;
}
final contexts = <Context>[current];
while (elements.length < max) {
final result = delegate.parseOn(current);
if (result.isFailure) {
break;
}
elements.add(result.value);
contexts.add(current = result);
}
for (;;) {
final limiter = limit.parseOn(contexts.last);
if (limiter.isSuccess) {
return contexts.last.success(elements);
}
if (elements.isEmpty) {
return limiter.failure(limiter.message);
}
contexts.removeLast();
elements.removeLast();
if (contexts.isEmpty) {
return limiter.failure(limiter.message);
}
}
}