parser_combinator 0.2.3 copy "parser_combinator: ^0.2.3" to clipboard
parser_combinator: ^0.2.3 copied to clipboard

discontinuedreplaced by: peg
outdated

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/map.dart';
import 'package:parser_combinator/parser/opt.dart';
import 'package:parser_combinator/parser/predicate.dart';
import 'package:parser_combinator/parser/recognize.dart';
import 'package:parser_combinator/parser/ref.dart';
import 'package:parser_combinator/parser/satisfy.dart';
import 'package:parser_combinator/parser/skip_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';
import 'package:parser_combinator/runtime.dart';

void main(List<String> args) {
  const id = Recognize2(Satisfy(isAlpha), SkipWhile(isAlphanumeric));
  print(parseString(id.parse, 'Abc'));
  print(parseString(id.parse, 'xyz123'));

  print(parseString(calc.parse, '1 + 2 * 3'));
  print(parseString(calc.parse, '(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_ = Map1(Recognize2(Opt(Tag('-')), Digit1()), num.parse);

const _openParenthesis = Terminated(Tag('('), _ws);

const _primary =
    Choice2(_number, Delimited(_openParenthesis, _expr, _closeParenthesis));

const _ws = SkipWhile(isWhitespace);

Parser<StringReader, 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'),
  };
}
0
likes
0
points
76
downloads

Publisher

unverified uploader

Weekly Downloads

Parser combinator is a collection of parsers that can be used to combine basic parsers to create parsers for more complex rules.

Repository (GitHub)
View/report issues

Topics

#parser #parser-combinator #parsing #peg

License

unknown (license)

Dependencies

_fe_analyzer_shared, intl, path

More

Packages that depend on parser_combinator