blob: 4cdaa757ce203fb967a6362d5efeb95bbe824f9d [file] [log] [blame]
part of petitparser;
/// A parser that performs a transformation with a given function on the
/// successful parse result of the delegate.
class ActionParser extends DelegateParser {
final Function _function;
ActionParser(parser, this._function) : super(parser);
@override
Result parseOn(Context context) {
var result = _delegate.parseOn(context);
if (result.isSuccess) {
return result.success(_function(result.value));
} else {
return result;
}
}
@override
Parser copy() => new ActionParser(_delegate, _function);
@override
bool hasEqualProperties(Parser other) {
return other is ActionParser
&& super.hasEqualProperties(other)
&& _function == other._function;
}
}
/// A parser that silently consumes input of another parser around
/// its delegate.
class TrimmingParser extends DelegateParser {
Parser _left;
Parser _right;
TrimmingParser(parser, this._left, this._right) : super(parser);
@override
Result parseOn(Context context) {
var current = context;
do {
current = _left.parseOn(current);
} while (current.isSuccess);
var result = _delegate.parseOn(current);
if (result.isFailure) {
return result;
}
current = result;
do {
current = _right.parseOn(current);
} while (current.isSuccess);
return current.success(result.value);
}
@override
Parser copy() => new TrimmingParser(_delegate, _left, _right);
@override
List<Parser> get children => [_delegate, _left, _right];
@override
void replace(Parser source, Parser target) {
super.replace(source, target);
if (_left == source) {
_left = target;
}
if (_right == source) {
_right = target;
}
}
}
/// A parser that answers a substring or sub-list of the range its delegate
/// parses.
class FlattenParser extends DelegateParser {
FlattenParser(parser) : super(parser);
@override
Result parseOn(Context context) {
var result = _delegate.parseOn(context);
if (result.isSuccess) {
var output = context.buffer is String
? context.buffer.substring(context.position, result.position)
: context.buffer.sublist(context.position, result.position);
return result.success(output);
} else {
return result;
}
}
@override
Parser copy() => new FlattenParser(_delegate);
}
/// A parser that answers a token of the result its delegate parses.
class TokenParser extends DelegateParser {
TokenParser(parser) : super(parser);
@override
Result parseOn(Context context) {
var result = _delegate.parseOn(context);
if (result.isSuccess) {
var token = new Token(
result.value, context.buffer, context.position, result.position);
return result.success(token);
} else {
return result;
}
}
@override
Parser copy() => new TokenParser(_delegate);
}