blob: 16736b5c13cd4bbac017e46c6dca4802f784867c [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);
}