Mercurial > lcfOS
view python/asmnodes.py @ 230:88a1e0baef65
Added some tests for IR-code
author | Windel Bouwman |
---|---|
date | Sat, 13 Jul 2013 19:53:44 +0200 |
parents | 1c7364bd74c7 |
children | 83781bd10fdb |
line wrap: on
line source
""" Assembler AST nodes """ class ANode: def __eq__(self, other): return self.__repr__() == other.__repr__() class ALabel(ANode): def __init__(self, name): self.name = name def __repr__(self): return '{0}:'.format(self.name) class AComment(ANode): def __init__(self, name): self.txt = name def __repr__(self): return '; {}'.format(self.txt) class AInstruction(ANode): def __init__(self, mnemonic, operands): self.mnemonic = mnemonic self.operands = operands def __repr__(self): ops = ', '.join(map(str, self.operands)) return '{0} {1}'.format(self.mnemonic, ops) class AExpression(ANode): def __add__(self, other): assert isinstance(other, AExpression) return ABinop('+', self, other) def __mul__(self, other): assert isinstance(other, AExpression) return ABinop('*', self, other) class ABinop(AExpression): def __init__(self, op, arg1, arg2): self.op = op self.arg1 = arg1 self.arg2 = arg2 def __repr__(self): return '{0} {1} {2}'.format(self.op, self.arg1, self.arg2) class AUnop(AExpression): def __init__(self, operation, arg): self.operation = operation self.arg = arg def __repr__(self): return '{0} {1}'.format(self.operation, self.arg) class ASymbol(AExpression): def __init__(self, name): self.name = name def __repr__(self): return self.name class ANumber(AExpression): def __init__(self, n): assert type(n) is int self.n = n self.number = n def __repr__(self): return '{0}'.format(self.n)