| @@ -29,6 +29,8 @@ Most importantly, Lark will save you time and prevent you from getting parsing h | |||
| Lark has no dependencies. | |||
| [](https://travis-ci.org/erezsh/lark) | |||
| ### Hello World | |||
| Here is a little program to parse "Hello, World!" (Or any other similar phrase): | |||
| @@ -60,6 +62,52 @@ See more [examples in the wiki](https://github.com/erezsh/lark/wiki/Examples) | |||
| ## List of Features | |||
| - Builds a parse-tree (AST) automagically, based on the structure of the grammar | |||
| - **Earley** parser | |||
| - Can parse *ALL* context-free grammars | |||
| - Full support for ambiguity in grammar | |||
| - **LALR(1)** parser | |||
| - Competitive with PLY | |||
| - **EBNF** grammar | |||
| - **Unicode** fully supported | |||
| - **Python 2 & 3** compatible | |||
| - Automatic line & column tracking | |||
| - Standard library of terminals (strings, numbers, names, etc.) | |||
| - Import grammars from Nearley.js | |||
| - Extensive test suite [](https://codecov.io/gh/erezsh/lark) | |||
| - And much more! | |||
| See the full list of [features in the wiki](https://github.com/erezsh/lark/wiki/Features) | |||
| ### Performance comparison | |||
| | Code | CPython Time | PyPy Time | CPython Mem | PyPy Mem | |||
| |:-----|:-------------|:------------|:----------|:--------- | |||
| | **Lark - LALR(1)** | 4.7s | 1.2s | 70M | 134M | | |||
| | PyParsing | 32s | 3.5s | 443M | 225M | | |||
| | funcparserlib | 8.5s | 1.3s | 483M | 293M | | |||
| | Parsimonious | | 5.7s | | 1545M | | |||
| Check out the [JSON tutorial](/docs/json_tutorial.md#conclusion) for more details on how the comparison was made. | |||
| ### Feature comparison | |||
| | Library | Algorithm | Grammar | Builds tree? | Supports ambiguity? | Can handle every CFG? | |||
| |:--------|:----------|:----|:--------|:------------|:------------ | |||
| | **Lark** | Earley/LALR(1) | EBNF+ | Yes! | Yes! | Yes! | | |||
| | [PLY](http://www.dabeaz.com/ply/) | LALR(1) | Yacc-like BNF | No | No | No | | |||
| | [PyParsing](http://pyparsing.wikispaces.com/) | PEG | Parser combinators | No | No | No\* | | |||
| | [Parsley](https://pypi.python.org/pypi/Parsley) | PEG | EBNF-like | No | No | No\* | | |||
| | [funcparserlib](https://github.com/vlasovskikh/funcparserlib) | Recursive-Descent | Parser combinators | No | No | No | | |||
| | [Parsimonious](https://github.com/erikrose/parsimonious) | PEG | EBNF | Yes | No | No\* | | |||
| (\* *According to Wikipedia, it remains unanswered whether PEGs can really parse all deterministic CFGs*) | |||
| ### Projects using Lark | |||
| - [mappyfile](https://github.com/geographika/mappyfile) - a MapFile parser for working with MapServer configuration | |||
| @@ -85,28 +133,6 @@ You can use the output as a regular python module: | |||
| 0.38981434460254655 | |||
| ``` | |||
| ## List of Features | |||
| - Builds a parse-tree (AST) automagically, based on the structure of the grammar | |||
| - **Earley** parser | |||
| - Can parse *ALL* context-free grammars | |||
| - Full support for ambiguity in grammar | |||
| - **LALR(1)** parser | |||
| - Competitive with PLY | |||
| - **EBNF** grammar | |||
| - **Unicode** fully supported | |||
| - **Python 2 & 3** compatible | |||
| - Automatic line & column tracking | |||
| - Standard library of terminals (strings, numbers, names, etc.) | |||
| - Import grammars from Nearley.js | |||
| - Extensive test suite | |||
| - And much more! | |||
| See the full list of [features in the wiki](https://github.com/erezsh/lark/wiki/Features) | |||
| [](https://codecov.io/gh/erezsh/lark) | |||
| [](https://travis-ci.org/erezsh/lark) | |||
| ## Comparison to other parsers | |||
| ### Lark does things a little differently | |||
| @@ -130,32 +156,6 @@ See the full list of [features in the wiki](https://github.com/erezsh/lark/wiki/ | |||
| - You don't have to worry about terminals (regexps) or rules colliding | |||
| - You can repeat expressions without losing efficiency (turns out that's a thing) | |||
| ### Performance comparison | |||
| | Code | CPython Time | PyPy Time | CPython Mem | PyPy Mem | |||
| |:-----|:-------------|:------------|:----------|:--------- | |||
| | **Lark - LALR(1)** | 4.7s | 1.2s | 70M | 134M | | |||
| | PyParsing | 32s | 3.5s | 443M | 225M | | |||
| | funcparserlib | 8.5s | 1.3s | 483M | 293M | | |||
| | Parsimonious | | 5.7s | | 1545M | | |||
| Check out the [JSON tutorial](/docs/json_tutorial.md#conclusion) for more details on how the comparison was made. | |||
| ### Feature comparison | |||
| | Library | Algorithm | Grammar | Builds tree? | Supports ambiguity? | Can handle every CFG? | |||
| |:--------|:----------|:----|:--------|:------------|:------------ | |||
| | **Lark** | Earley/LALR(1) | EBNF+ | Yes! | Yes! | Yes! | | |||
| | [PLY](http://www.dabeaz.com/ply/) | LALR(1) | Yacc-like BNF | No | No | No | | |||
| | [PyParsing](http://pyparsing.wikispaces.com/) | PEG | Parser combinators | No | No | No\* | | |||
| | [Parsley](https://pypi.python.org/pypi/Parsley) | PEG | EBNF-like | No | No | No\* | | |||
| | [funcparserlib](https://github.com/vlasovskikh/funcparserlib) | Recursive-Descent | Parser combinators | No | No | No | | |||
| | [Parsimonious](https://github.com/erikrose/parsimonious) | PEG | EBNF | Yes | No | No\* | | |||
| (\* *According to Wikipedia, it remains unanswered whether PEGs can really parse all deterministic CFGs*) | |||
| ## License | |||
| Lark uses the [MIT license](LICENSE). | |||