platform-common-utilities/packages/combinator/lib/src/combinator/check.dart
thomashii@dukefirehawk.com f3d07b762a Updated to SDK 2.17
2022-07-06 23:20:10 +08:00

42 lines
1 KiB
Dart

part of lex.src.combinator;
class _Check<T> extends Parser<T> {
final Parser<T> parser;
final Matcher matcher;
final String? errorMessage;
final SyntaxErrorSeverity severity;
_Check(this.parser, this.matcher, this.errorMessage, this.severity);
@override
ParseResult<T> __parse(ParseArgs args) {
var matchState = {};
var result = parser._parse(args.increaseDepth()).change(parser: this);
if (!result.successful) {
return result;
} else if (!matcher.matches(result.value, matchState)) {
return result.change(successful: false).addErrors([
SyntaxError(
severity,
errorMessage ??
'${matcher.describe(StringDescription('Expected '))}.',
result.span,
),
]);
} else {
return result;
}
}
@override
void stringify(CodeBuffer buffer) {
var d = matcher.describe(StringDescription());
buffer
..writeln('check($d) (')
..indent();
parser.stringify(buffer);
buffer
..outdent()
..writeln(')');
}
}