view python/ppci/asmnodes.py @ 334:6f4753202b9a

Added more recipes
author Windel Bouwman
date Thu, 13 Feb 2014 22:02:08 +0100
parents python/asmnodes.py@83781bd10fdb
children
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 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)