This is the recommended process for working with Lark:
Collect or create input samples, that demonstrate key features or behaviors in the language you’re trying to parse.
Write a grammar. Try to aim for a structure that is intuitive, and in a way that imitates how you would explain your language to a fellow human.
Try your grammar in Lark against each input sample. Make sure the resulting parse-trees make sense.
Use Lark’s grammar features to shape the tree: Get rid of superfluous rules by inlining them, and use aliases when specific cases need clarification.
Of course, some specific use-cases may deviate from this process. Feel free to suggest these cases, and I’ll add them to this page.
Browse the Examples to find a template that suits your purposes.
Read the tutorials to get a better understanding of how everything works. (links in the main page)
Use the Cheatsheet (PDF) for quick reference.
Use the reference pages for more in-depth explanations. (links in the main page)
Grammars may contain non-obvious bugs, usually caused by rules or terminals interfering with each other in subtle ways.
When trying to debug a misbehaving grammar, the following methodology is recommended:
Usually, by the time you get to a minimal grammar, the problem becomes clear.
But if it doesn’t, feel free to ask us on gitter, or even open an issue. Post a reproducing code, with the minimal grammar and input, and we’ll do our best to help.
By default Lark silently resolves Shift/Reduce conflicts as Shift. To enable warnings pass debug=True
. To get the messages printed you have to configure the logger
beforehand. For example:
import logging
from lark import Lark, logger
logger.setLevel(logging.DEBUG)
collision_grammar = '''
start: as as
as: a*
a: "a"
'''
p = Lark(collision_grammar, parser='lalr', debug=True)
Lark can generate a stand-alone LALR(1) parser from a grammar.
The resulting module provides the same interface as Lark, but with a fixed grammar, and reduced functionality.
Run using:
python -m lark.tools.standalone
For a play-by-play, read the tutorial
It is possible to import Nearley grammars into Lark. The Javascript code is translated using Js2Py.
See the tools page for more information.