import sys import re import struct op_names = ["MOVI", "MOVR", "GETM", "PUTM", "ADDI", "ADDR", "SUBI", "SUBR", "XORI", "XORR", "NOTI", "NOTR", "MULI", "MULR", "DIVI", "DIVR", "PUSH", "POOP", "CALL", "HALT", "NOPE"] reg_names = ["R0", "R1", "R2", "R3", "S0", "S1", "S2", "S3", "IP", "BP", "SP"] section_names = ["DATA:", "CODE:", "STACK:"] section_flags = {s: i + 1 for i, s in enumerate(section_names)} ops = {s: i for i, s in enumerate(op_names)} regs = {s: i for i, s in enumerate(reg_names)} assembled = bytearray() def to_uint8(data): alphanum = re.compile("^[0-9]+$") if isinstance(data, int): return struct.pack("".format(sys.argv[0])) return with open(sys.argv[1], 'r') as f: gen = (line.strip("\n") for line in f if line != "\n") flag = None for line in gen: if line.startswith(tuple(section_names)): flag = section_flags[line] continue if flag == section_flags["DATA:"]: assemble_data(line) elif flag == section_flags["CODE:"]: assemble_code(line) if not flag: sys.stderr.write("Nothing was assembled! Did you use the section delimiters?\n") with open("./out.gipu", 'wb') as f: f.write(assembled) if __name__ == '__main__': main()