Mercurial > lcfOS
view python/ir/module.py @ 163:8104fc8b5e90
Added visitor to c3
author | Windel Bouwman |
---|---|
date | Mon, 18 Mar 2013 20:13:57 +0100 |
parents | 9683a4cd848f |
children | 4348da5ca307 |
line wrap: on
line source
from .symboltable import SymbolTable # Types: class Type: def __init__(self): pass class IntegerType(Type): def __init__(self, bits): super().__init__() self.bits = bits class VoidType(Type): pass class FunctionType(Type): def __init__(self, resultType, parameterTypes): super().__init__() assert type(parameterTypes) is list self.resultType = resultType self.parameterTypes = parameterTypes # Default types: i8 = IntegerType(8) i16 = IntegerType(16) i32 = IntegerType(32) void = VoidType() # IR-Structures: class Module: """ Main container for a piece of code. Contains globals and functions. """ def __init__(self, name): self.name = name self.functions = [] # Do functions come out of symbol table? self.globs = [] # TODO: are globals in symbol table? self.symtable = SymbolTable() Globals = property(lambda self: self.globs) Functions = property(lambda self: self.functions) def __repr__(self): return 'IR-mod {0}'.format(self.name) class Argument: def __init__(self, argtype, name, function): self.t = argtype self.name = name self.function = function class Function: def __init__(self, name, functiontype): super().__init__() self.name = name self.functiontype = functiontype self.basicblocks = [] self.arguments = [] BasicBlocks = property(lambda self: self.basicblocks) Arguments = property(lambda self: self.arguments) ReturnType = property(lambda self: self.functiontype.returnType) FunctionType = property(lambda self: self.functiontype) def __repr__(self): return 'FUNC {0}'.format(self.name) class BasicBlock: """ A basic block represents a sequence of instructions without jumps and branches. """ def __init__(self): super().__init__() self.instructions = [] self.label = None def getInstructions(self): return self.instructions Instructions = property(getInstructions) def printIr(md): print(md) for g in md.Globals: print(g) for f in md.Functions: print(f) for bb in f.BasicBlocks: print('{0}:'.format(bb)) for ins in bb.Instructions: print(' {0}'.format(ins)) print()