diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 0885cd4..6603580 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -18,11 +18,11 @@ set(MODULE_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/compile.py) set(MODULE_C_FILES "") foreach(MODULE ${SRC_MODULES}) - get_filename_component(NAME ${MODULE} NAME_WLE) - set(MODULE_OUT modules/${NAME}.c) + get_filename_component(ID ${MODULE} NAME_WLE) + set(MODULE_OUT modules/${ID}.c) add_custom_command( OUTPUT ${MODULE_OUT} - COMMAND python ${MODULE_COMPILER} ${MODULE} ${MODULE_OUT} + COMMAND python ${MODULE_COMPILER} ${MODULE} ${MODULE_OUT} ${ID} DEPENDS ${MODULE} ${MODULE_COMPILER} ) list(APPEND MODULE_C_FILES ${MODULE_OUT}) diff --git a/lang/compile.py b/lang/compile.py index 04e1f22..f706ae4 100755 --- a/lang/compile.py +++ b/lang/compile.py @@ -285,12 +285,13 @@ return (func, lines) class ASTMetadata(): - def __init__(self, name, uses): + def __init__(self, id, name, uses): + self.id = id self.name = name self.uses = uses def __repr__(self): - return 'ASTMetadata(name=%s, uses=%s)' % (self.name, self.uses) + return 'ASTMetadata(id=%s, name=%s, uses=%s)' % (self.id, self.name, self.uses) def parse_keyvalue(lines, key): line = lines[0] @@ -300,7 +301,7 @@ value = ' '.join(line[1:]) return (value, lines) -def parse_metadata(lines): +def parse_metadata(lines, id): (module, lines) = parse_keyvalue(lines, "Module") if module is None: print("no module name? line: %s" % (' '.join(line))) @@ -313,12 +314,12 @@ else: lines = cur_lines break - metadata = ASTMetadata(module, use_list) + metadata = ASTMetadata(id, module, use_list) return (metadata, lines) -def parse_toplevel(lines): +def parse_toplevel(lines, id): ast = [] - (metadata, lines) = parse_metadata(lines) + (metadata, lines) = parse_metadata(lines, id) if metadata is None: return None ast.append(metadata) @@ -447,12 +448,13 @@ return 'IRJumpAlways(name=%s)' % (self.name) class IRMetadata(): - def __init__(self, name, uses): + def __init__(self, id, name, uses): + self.id = id self.name = name self.uses = uses def __repr__(self): - return 'IRMetadata(name=%s, uses=%s)' % (self.name, self.uses) + return 'IRMetadata(id=%s, name=%s, uses=%s)' % (self.id, self.name, self.uses) ## IR Generator @@ -587,9 +589,7 @@ return IRFunction(name, ast.args, ir) def generate_ir_metadata(ast): - name = ast.name - uses = ast.uses - return IRMetadata(ast.name, ast.uses) + return IRMetadata(ast.id, ast.name, ast.uses) def generate_ir(ast): ir = [] @@ -844,7 +844,8 @@ return call def generate_metadata(node): - output = "// Module: %s\n" % (node.name) + output = "// Module: %s\n" % (node.id) + output += "// Name: %s\n" % (node.name) output += "// Requires: %s\n" % (node.uses) output += "\n" return output @@ -872,12 +873,12 @@ ## Main wrapper -def compile(code): +def compile(code, id): lines = tokenize(code) if not lines: print("Failed to tokenize file") return None - ast = parse_toplevel(lines) + ast = parse_toplevel(lines, id) if not ast: print("Failed to parse file") return None @@ -898,8 +899,9 @@ if __name__ == "__main__": input = open(sys.argv[1], "r") output = open(sys.argv[2], "w") + id = sys.argv[3] code = input.read() - c_code = compile(code) + c_code = compile(code, id) if c_code: output.write(c_code) input.close()