mirror of https://github.com/lark-parser/lark.git
47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
#
|
|
# 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()
|