|
|
@@ -0,0 +1,74 @@ |
|
|
|
# Recipes |
|
|
|
|
|
|
|
A collection of recipes to use Lark and its various features |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## lexer_callbacks |
|
|
|
|
|
|
|
Use it to interface with the lexer as it generates tokens. |
|
|
|
|
|
|
|
Accepts a dictionary of the form |
|
|
|
|
|
|
|
{TOKEN_TYPE: callback} |
|
|
|
|
|
|
|
Where callback is of type `f(Token) -> Token` |
|
|
|
|
|
|
|
It only works with the standard and contextual lexers. |
|
|
|
|
|
|
|
### Example 1: Replace string values with ints for INT tokens |
|
|
|
|
|
|
|
```python |
|
|
|
from lark import Lark, Token |
|
|
|
|
|
|
|
def tok_to_int(tok): |
|
|
|
return Token.new_borrow_pos(tok.type, int(tok), tok) |
|
|
|
|
|
|
|
parser = Lark(""" |
|
|
|
start: INT* |
|
|
|
%import common.INT |
|
|
|
%ignore " " |
|
|
|
""", parser="lalr", lexer_callbacks = {'INT': tok_to_int}) |
|
|
|
|
|
|
|
print(parser.parse('3 14 159')) |
|
|
|
``` |
|
|
|
|
|
|
|
Prints out: |
|
|
|
|
|
|
|
```python |
|
|
|
Tree(start, [Token(INT, 3), Token(INT, 14), Token(INT, 159)]) |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
### Example 2: Collect all comments |
|
|
|
```python |
|
|
|
from lark import Lark |
|
|
|
|
|
|
|
comments = [] |
|
|
|
|
|
|
|
parser = Lark(""" |
|
|
|
start: INT* |
|
|
|
|
|
|
|
COMMENT: /#.*/ |
|
|
|
|
|
|
|
%import common (INT, WS) |
|
|
|
%ignore COMMENT |
|
|
|
%ignore WS |
|
|
|
""", parser="lalr", lexer_callbacks={'COMMENT': comments.append}) |
|
|
|
|
|
|
|
parser.parse(""" |
|
|
|
1 2 3 # hello |
|
|
|
# world |
|
|
|
4 5 6 |
|
|
|
""") |
|
|
|
|
|
|
|
print(comments) |
|
|
|
``` |
|
|
|
|
|
|
|
Prints out: |
|
|
|
|
|
|
|
```python |
|
|
|
[Token(COMMENT, '# hello'), Token(COMMENT, '# world')] |
|
|
|
``` |
|
|
|
|
|
|
|
*Note: We don't have to return a token, because comments are ignored* |