mirror of https://github.com/lark-parser/lark.git
53 lines
979 B
Python
53 lines
979 B
Python
#
|
|
# This example demonstrates 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()
|
|
|