diff --git a/lark/tools/standalone.py b/lark/tools/standalone.py index 4ca57f6..3456c39 100644 --- a/lark/tools/standalone.py +++ b/lark/tools/standalone.py @@ -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 ` 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() \ No newline at end of file