parser_combinator 0.1.6
parser_combinator: ^0.1.6 copied to clipboard
Parser combinator is a collection of parsers that can be used to combine basic parsers to create parsers for more complex rules.
example/example.dart
import 'package:parser_combinator/parser/chainl1.dart';
import 'package:parser_combinator/parser/choice.dart';
import 'package:parser_combinator/parser/delimited.dart';
import 'package:parser_combinator/parser/digit1.dart';
import 'package:parser_combinator/parser/mapped.dart';
import 'package:parser_combinator/parser/opt.dart';
import 'package:parser_combinator/parser/predicate.dart';
import 'package:parser_combinator/parser/recognize_many.dart';
import 'package:parser_combinator/parser/ref.dart';
import 'package:parser_combinator/parser/satisfy16.dart';
import 'package:parser_combinator/parser/skip16_while.dart';
import 'package:parser_combinator/parser/tag.dart';
import 'package:parser_combinator/parser/tags.dart';
import 'package:parser_combinator/parser/terminated.dart';
import 'package:parser_combinator/parser_combinator.dart';
import 'package:parser_combinator/parsing.dart';
void main(List<String> args) {
const id = RecognizeMany([Satisfy16(isAlpha), Skip16While(isAlphanumeric)]);
print(id.parseString('Abc'));
print(id.parseString('xyz123'));
print(calc.parseString('1 + 2 * 3'));
print(calc.parseString('(1 + 2) * 3'));
}
const calc = _expr;
const _add = ChainL1(_mul, _addOps, _mul, _toBinary);
const _addOps = Terminated(Tags(['-', '+']), _ws);
const _closeParenthesis = Terminated(Tag(')'), _ws);
const _expr = Ref(_exprRef);
const _mul = ChainL1(_primary, _mulOps, _primary, _toBinary);
const _mulOps = Terminated(Tags(['*', '/']), _ws);
const _number = Terminated(_number_, _ws);
const _number_ = Mapped(RecognizeMany([Opt(Tag('-')), Digit1()]), num.parse);
const _openParenthesis = Terminated(Tag('('), _ws);
const _primary =
Choice2(_number, Delimited(_openParenthesis, _expr, _closeParenthesis));
const _ws = Skip16While(isWhitespace);
Parser<String, num> _exprRef() => _add;
num _toBinary(num left, String op, num right) {
return switch (op) {
'-' => left - right,
'+' => left + right,
'*' => left * right,
'/' => left * right,
_ => throw ArgumentError.value(op, 'op'),
};
}