Browse Source

Added optional compression to standalone parser

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.11.0
Erez Sh 4 years ago
parent
commit
6a9759d620
1 changed files with 34 additions and 12 deletions
  1. +34
    -12
      lark/tools/standalone.py

+ 34
- 12
lark/tools/standalone.py View File

@@ -123,10 +123,19 @@ def main(fobj, start, print=print):
lark_inst = Lark(fobj, parser="lalr", lexer="contextual", start=start)
gen_standalone(lark_inst, print)

def gen_standalone(lark_inst, output=None, out=sys.stdout):
def gen_standalone(lark_inst, output=None, out=sys.stdout, compress=False):
if output is None:
output = partial(print, file=out)

import pickle, zlib, base64
def compressed_output(obj):
s = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
c = zlib.compress(s)
output(repr(base64.b85encode(c)))

def output_decompress(name):
output('%(name)s = pickle.loads(zlib.decompress(base64.b85decode(%(name)s)))' % locals())

output('# The file was automatically generated by Lark v%s' % lark.__version__)
output('__version__ = "%s"' % lark.__version__)
output()
@@ -139,13 +148,23 @@ def gen_standalone(lark_inst, output=None, out=sys.stdout):
output(code)

data, m = lark_inst.memo_serialize([TerminalDef, Rule])
output('DATA = (')
# pprint(data, width=160)
output(data)
output(')')
output('MEMO = (')
output(m)
output(')')
output('import pickle, zlib, base64')
if compress:
output('DATA = (')
compressed_output(data)
output(')')
output_decompress('DATA')
output('MEMO = (')
compressed_output(m)
output(')')
output_decompress('MEMO')
else:
output('DATA = (')
output(data)
output(')')
output('MEMO = (')
output(m)
output(')')


output('Shift = 0')
@@ -156,16 +175,19 @@ def gen_standalone(lark_inst, output=None, out=sys.stdout):



if __name__ == '__main__':
def main():
make_warnings_comments()
parser = ArgumentParser(prog="prog='python -m lark.tools.standalone'", description="Lark Stand-alone Generator Tool",
parents=[lalr_argparser], epilog='Look at the Lark documentation for more info on the options')
parser.add_argument("old_start", nargs='?', help=SUPPRESS)
parser.add_argument('-c', '--compress', action='store_true', default=0, help="Enable compression")
ns = parser.parse_args()
if ns.old_start is not None:
warn('The syntax `python -m lark.tools.standalone <grammar-file> <start>` is deprecated. Use the -s option')
ns.start.append(ns.old_start)
lark_inst, out = build_lalr(ns)
gen_standalone(lark_inst, out=out)
gen_standalone(lark_inst, out=out, compress=ns.compress)

if __name__ == '__main__':
main()

Loading…
Cancel
Save