
# Lip
Lip provides powerful parser combinators for creating reusable and flexible parsers.
# Why Lip?
* Easy to understand - uses intuitive combinators like keep and skip
* Compact - takes less than an hour to learn this library fully
* Flexible and composable parser combinators
* Efficient - minimal backtracking
* Built-in support for precise, located error messages
* Keep track of extra states like line number and instruction index
* Extensible - create your own combinators if needed
```rust
// Parse an (x, y) position pair
use lip::*;
.skip(token(","))
.keep(int())
.run("2,3", ()); // run this parser on string "2,3" without extra states
// when parsing finished, position == (2, 3)
```
# Tutorial
Reading the [parser combinator](https://bodil.lol/parser-combinators/) by Bodil is an excellent way to know how parser combinators work.
# License
MIT
# Credits
Based on Bodil's [Parser Combinator Tutorial](https://bodil.lol/parser-combinators/) and Evan's [elm/paser](https://github.com/elm/parser).