| @@ -123,10 +123,19 @@ def main(fobj, start, print=print): | |||||
| lark_inst = Lark(fobj, parser="lalr", lexer="contextual", start=start) | lark_inst = Lark(fobj, parser="lalr", lexer="contextual", start=start) | ||||
| gen_standalone(lark_inst, print) | 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: | if output is None: | ||||
| output = partial(print, file=out) | 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('# The file was automatically generated by Lark v%s' % lark.__version__) | ||||
| output('__version__ = "%s"' % lark.__version__) | output('__version__ = "%s"' % lark.__version__) | ||||
| output() | output() | ||||
| @@ -139,13 +148,23 @@ def gen_standalone(lark_inst, output=None, out=sys.stdout): | |||||
| output(code) | output(code) | ||||
| data, m = lark_inst.memo_serialize([TerminalDef, Rule]) | 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') | 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() | make_warnings_comments() | ||||
| parser = ArgumentParser(prog="prog='python -m lark.tools.standalone'", description="Lark Stand-alone Generator Tool", | 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') | 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("old_start", nargs='?', help=SUPPRESS) | ||||
| parser.add_argument('-c', '--compress', action='store_true', default=0, help="Enable compression") | |||||
| ns = parser.parse_args() | ns = parser.parse_args() | ||||
| if ns.old_start is not None: | if ns.old_start is not None: | ||||
| warn('The syntax `python -m lark.tools.standalone <grammar-file> <start>` is deprecated. Use the -s option') | warn('The syntax `python -m lark.tools.standalone <grammar-file> <start>` is deprecated. Use the -s option') | ||||
| ns.start.append(ns.old_start) | ns.start.append(ns.old_start) | ||||
| lark_inst, out = build_lalr(ns) | 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() | |||||