Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/thosakwe/combinator
Parser combinators that support static typing, file spans, and more.
https://github.com/thosakwe/combinator
dart parser parser-combinators parsing
Last synced: 3 months ago
JSON representation
Parser combinators that support static typing, file spans, and more.
- Host: GitHub
- URL: https://github.com/thosakwe/combinator
- Owner: thosakwe
- License: mit
- Created: 2017-11-02T10:03:18.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2019-01-08T12:30:14.000Z (about 6 years ago)
- Last Synced: 2024-10-04T09:41:43.117Z (4 months ago)
- Topics: dart, parser, parser-combinators, parsing
- Language: Dart
- Homepage: https://pub.dartlang.org/packages/combinator
- Size: 59.6 KB
- Stars: 11
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# combinator
[![version](https://img.shields.io/pub/v/combinator.svg)](https://pub.dartlang.org/packages/combinator)
[![build status](https://travis-ci.org/thosakwe/combinator.svg)](https://travis-ci.org/thosakwe/combinator)Packrat parser combinators that support static typing, generics, file spans, memoization, and more.
**RECOMMENDED:**
Check `example/` for examples.
The examples contain examples of using:
* Generic typing
* Reading `FileSpan` from `ParseResult`
* More...## Basic Usage
```dart
void main() {
// Parse a Pattern (usually String or RegExp).
var foo = match('foo');
var number = match(new RegExp(r'[0-9]+'), errorMessage: 'Expected a number.');
// Set a value.
var numWithValue = number.map((r) => int.parse(r.span.text));
// Expect a pattern, or nothing.
var optional = numWithValue.opt();
// Expect a pattern zero or more times.
var star = optional.star();
// Expect one or more times.
var plus = optional.plus();
// Expect an arbitrary number of times.
var threeTimes = optional.times(3);
// Expect a sequence of patterns.
var doraTheExplorer = chain([
match('Dora').space(),
match('the').space(),
match('Explorer').space(),
]);
// Choose exactly one of a set of patterns, whichever
// appears first.
var alt = any([
match('1'),
match('11'),
match('111'),
]);
// Choose the *longest* match for any of the given alternatives.
var alt2 = longest([
match('1'),
match('11'),
match('111'),
]);
// Friendly operators
var fooOrNumber = foo | number;
var fooAndNumber = foo & number;
var notFoo = ~foo;
}
```## Error Messages
Parsers without descriptive error messages can lead to frustrating dead-ends
for end-users. Fortunately, `combinator` is built with error handling in mind.```dart
void main(Parser parser) {
// Append an arbitrary error message to a parser if it is not matched.
var withError = parser.error(errorMessage: 'Hey!!! Wrong!!!');
// You can also set the severity of an error.
var asHint = parser.error(severity: SyntaxErrorSeverity.hint);
// Constructs like `any`, `chain`, and `longest` support this as well.
var foo = longest([
parser.error(errorMessage: 'foo'),
parser.error(errorMessage: 'bar')
], errorMessage: 'Expected a "foo" or a "bar"');
// If multiple errors are present at one location,
// it can create a lot of noise.
//
// Use `foldErrors` to only take one error at a given location.
var lessNoise = parser.foldErrors();
}
```## Whitespaces
Handling optional whitespace is dead-easy:```dart
void main(Parser parser) {
var optionalSpace = parser.space();
}
```## For Programming Languages
`combinator` was conceived to make writing parsers for complex grammars easier,
namely programming languages. Thus, there are functions built-in to make common constructs
easier:```dart
void main(Parser parser) {
var array = parser
.separatedByComma()
.surroundedBySquareBrackets(defaultValue: []);
var braces = parser.surroundedByCurlyBraces();
var sep = parser.separatedBy(match('!').space());
}
```## Differences between this and Petitparser
* `combinator` makes extensive use of Dart's dynamic typing
* `combinator` supports detailed error messages (with configurable severity)
* `combinator` keeps track of locations (ex. `line 1: 3`)