def main(): print("dasm: Simple dcpu assembler\n") l = lark.Lark(grammar.grammar, start="start") parser = argparse.ArgumentParser(description='dcpu assembler') parser.add_argument("-i", help="Assembly input file", action="store", metavar="<input file>", type=str, required=True, dest="input_filename") parser.add_argument( "-o", help="Binary output file basename (without file extension)", metavar="<output file base name>", action="store", type=str, required=False, dest="output_filebase") args = parser.parse_args() try: fn = args.input_filename with open(fn) as f: lines = f.readlines() except: print(f"ERROR: Cannot open file {fn}") return 2 contents = "".join(lines) t = l.parse(contents) # print(t.pretty()) # print(t) n = dcpuTransformer().transform(t) program = Program(n.children) (path, name) = os.path.split(fn) # remove path if args.output_filebase == None: outfn_noext = os.path.splitext(name)[0] # remove extension else: outfn_noext = args.output_filebase program.write_as_bin(outfn_noext + ".bin") program.write_as_memfile(outfn_noext + ".mem") program.write_as_cfile(outfn_noext + ".c") program.write_as_listing(outfn_noext + ".list", lines) program.write_symbols(outfn_noext + ".symbols") program.write_as_simdata(outfn_noext + ".sim", lines) size = program.end_address - program.start_address + 1 print(f"File '{name}' assembled\nOutput size: {size} words")