|
@@ -24,7 +24,32 @@ A **parsing algorithm** is an algorithm that takes a grammar definition and a se |
|
|
|
|
|
|
|
|
Grammars in Lark are based on [EBNF](https://en.wikipedia.org/wiki/Extended_Backus–Naur_form) syntax, with several enhancements. |
|
|
Grammars in Lark are based on [EBNF](https://en.wikipedia.org/wiki/Extended_Backus–Naur_form) syntax, with several enhancements. |
|
|
|
|
|
|
|
|
Lark grammars are composed of a list of definitions and directives, each on its own line. A definition is either a named rule, or a named terminal. |
|
|
|
|
|
|
|
|
EBNF is basically a short-hand for common BNF patterns. |
|
|
|
|
|
|
|
|
|
|
|
Optionals are expanded: |
|
|
|
|
|
|
|
|
|
|
|
```ebnf |
|
|
|
|
|
a b? c -> (a c | a b c) |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
Repetition is extracted into a recursion: |
|
|
|
|
|
|
|
|
|
|
|
```ebnf |
|
|
|
|
|
a: b* -> a: _b_tag |
|
|
|
|
|
_b_tag: (_b_tag b)? |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
And so on. |
|
|
|
|
|
|
|
|
|
|
|
Lark grammars are composed of a list of definitions and directives, each on its own line. A definition is either a named rule, or a named terminal, with the following syntax, respectively: |
|
|
|
|
|
|
|
|
|
|
|
```c |
|
|
|
|
|
rule: <EBNF EXPRESSION> |
|
|
|
|
|
| etc. |
|
|
|
|
|
|
|
|
|
|
|
TERM: <EBNF EXPRESSION> // Rules aren't allowed |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Comments** start with `//` and last to the end of the line (C++ style) |
|
|
**Comments** start with `//` and last to the end of the line (C++ style) |
|
|
|
|
|
|
|
|