mirror of
https://github.com/fluencelabs/lalrpop
synced 2025-04-24 18:52:16 +00:00
62 lines
3.1 KiB
Markdown
62 lines
3.1 KiB
Markdown
# LALRPOP
|
|
|
|
[](https://gitter.im/lalrpop/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
|
|
[](https://travis-ci.org/lalrpop/lalrpop)
|
|
|
|
LALRPOP is a Rust parser generator framework with *usability* as its
|
|
primary goal. You should be able to write compact, DRY, readable
|
|
grammars. To this end, LALRPOP offers a number of nifty features:
|
|
|
|
0. Nice error messages in case parser constructor fails.
|
|
1. Macros that let you extract common parts of your grammar. This
|
|
means you can go beyond simple repetition like `Id*` and define
|
|
things like `Comma<Id>` for a comma-separated list of identifiers.
|
|
2. Macros can also create subsets, so that you easily do something
|
|
like `Expr<"all">` to represent the full range of expressions, but
|
|
`Expr<"if">` to represent the subset of expressions that can appear
|
|
in an `if` expression.
|
|
3. Builtin support for operators like `*` and `?`.
|
|
4. Compact defaults so that you can avoid writing action code much of the
|
|
time.
|
|
5. Type inference so you can often omit the types of nonterminals.
|
|
|
|
Despite its name, LALRPOP in fact uses LR(1) by default (though you
|
|
can opt for LALR(1)), and really I hope to eventually move to
|
|
something general that can handle all CFGs (like GLL, GLR, LL(\*),
|
|
etc).
|
|
|
|
### Documentation
|
|
|
|
[The LALRPOP book] covers all things LALRPOP -- or at least it intends
|
|
to! Here are some tips:
|
|
|
|
- The [tutorial] covers the basics of setting up a LALRPOP parser.
|
|
- For the impatient, you may prefer the [quick start guide] section, which describes
|
|
how to add LALRPOP to your `Cargo.toml`.
|
|
- The [advanced setup] chapter shows how to configure other aspects of LALRPOP's
|
|
preprocessing.
|
|
- If you have any questions join our [gitter lobby].
|
|
|
|
### Example Uses
|
|
|
|
- [LALRPOP] is itself implemented in LALRPOP.
|
|
- [Gluon] is a statically typed functional programming language.
|
|
- [Gleam](https://github.com/gleam-lang/gleam/blob/master/src/grammar.lalrpop) is a statically typed functional programming language for the Erlang VM.
|
|
- [RustPython] is Python 3.5+ rewritten in Rust
|
|
- [Solang] is Ethereum Solidity rewritten in Rust
|
|
|
|
[The LALRPOP book]: http://lalrpop.github.io/lalrpop/
|
|
[quick start guide]: http://lalrpop.github.io/lalrpop/quick_start_guide.html
|
|
[advanced setup]: http://lalrpop.github.io/lalrpop/advanced_setup.html
|
|
[tutorial]: http://lalrpop.github.io/lalrpop/tutorial/index.html
|
|
[LALRPOP]: https://github.com/lalrpop/lalrpop/blob/8034f3dacc4b20581bd10c5cb0b4f9faae778bb5/lalrpop/src/parser/lrgrammar.lalrpop
|
|
[Gluon]: https://github.com/gluon-lang/gluon/blob/d7ce3e81c1fcfdf25cdd6d1abde2b6e376b4bf50/parser/src/grammar.lalrpop
|
|
[RustPython]: https://github.com/RustPython/RustPython/blob/master/parser/src/python.lalrpop
|
|
[Solang]: https://github.com/hyperledger-labs/solang/blob/master/src/parser/solidity.lalrpop
|
|
[gitter lobby]: https://gitter.im/lalrpop/Lobby
|
|
|
|
### Contributing
|
|
|
|
You **really** should read `CONTRIBUTING.md` if you intend to change LALRPOP's own grammar.
|