|
|
@@ -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() |