|
- #
- # This example demonstrates scanless parsing using the earley_nolex frontend
- #
- # Using a lexer for configuration files is tricky, because values don't
- # have to be surrounded by delimiters.
- # In this example with skip lexing and let the Earley parser resolve the ambiguity.
- #
- # Future versions of lark will make it easier to write these kinds of grammars.
- #
- # Another approach is to use the contextual lexer. It is less powerful than the scanless approach,
- # but it can handle some ambiguity in lexing and it's much faster since it uses LALR(1).
- # See examples/conf.py for an example of that approach.
- #
-
- from lark import Lark, Transformer
-
- parser = Lark(r"""
- start: _nl? section+
- section: "[" name "]" _nl item+
- item: name "=" value _nl
- name: /[a-zA-Z_]/ /\w/*
- value: /./+
- _nl: (_CR? _LF)+
-
- _CR : /\r/
- _LF : /\n/
- """, parser="earley_nolex")
-
- class RestoreTokens(Transformer):
- value = ''.join
- name = ''.join
-
-
- def test():
- sample_conf = """
- [bla]
-
- a=Hello
- this="that",4
- """
-
- r = parser.parse(sample_conf)
- print(RestoreTokens().transform(r).pretty())
-
- if __name__ == '__main__':
- test()
|