1import codecs 2import sys 3import json 4 5from lark import Lark 6from lark.grammar import RuleOptions, Rule 7from lark.lexer import TerminalDef 8 9import argparse 10 11argparser = argparse.ArgumentParser(prog='python -m lark.tools.serialize') #description='''Lark Serialization Tool -- Stores Lark's internal state & LALR analysis as a convenient JSON file''') 12 13argparser.add_argument('grammar_file', type=argparse.FileType('r'), help='A valid .lark file') 14argparser.add_argument('-o', '--out', type=argparse.FileType('w'), default=sys.stdout, help='json file path to create (default=stdout)') 15argparser.add_argument('-s', '--start', default='start', help='start symbol (default="start")', nargs='+') 16argparser.add_argument('-l', '--lexer', default='standard', choices=['standard', 'contextual'], help='lexer type (default="standard")') 17 18 19def serialize(infile, outfile, lexer, start): 20 lark_inst = Lark(infile, parser="lalr", lexer=lexer, start=start) # TODO contextual 21 22 data, memo = lark_inst.memo_serialize([TerminalDef, Rule]) 23 outfile.write('{\n') 24 outfile.write(' "data": %s,\n' % json.dumps(data)) 25 outfile.write(' "memo": %s\n' % json.dumps(memo)) 26 outfile.write('}\n') 27 28 29def main(): 30 if len(sys.argv) == 1 or '-h' in sys.argv or '--help' in sys.argv: 31 print("Lark Serialization Tool - Stores Lark's internal state & LALR analysis as a JSON file") 32 print("") 33 argparser.print_help() 34 else: 35 args = argparser.parse_args() 36 serialize(args.grammar_file, args.out, args.lexer, args.start) 37 38if __name__ == '__main__': 39 main()