""" Parsing Indentation =================== A demonstration of parsing indentation (“whitespace significant” language) and the usage of the Indenter class. Since indentation is context-sensitive, a postlex stage is introduced to manufacture INDENT/DEDENT tokens. It is crucial for the indenter that the NL_type matches the spaces (and tabs) after the newline. """ from lark import Lark from lark.indenter import Indenter tree_grammar = r""" ?start: _NL* tree tree: NAME _NL [_INDENT tree+ _DEDENT] %import common.CNAME -> NAME %import common.WS_INLINE %declare _INDENT _DEDENT %ignore WS_INLINE _NL: /(\r?\n[\t ]*)+/ """ class TreeIndenter(Indenter): NL_type = '_NL' OPEN_PAREN_types = [] CLOSE_PAREN_types = [] INDENT_type = '_INDENT' DEDENT_type = '_DEDENT' tab_len = 8 parser = Lark(tree_grammar, parser='lalr', postlex=TreeIndenter()) test_tree = """ a b c d e f g """ def test(): print(parser.parse(test_tree).pretty()) if __name__ == '__main__': test()