git @ Cat's Eye Technologies Tamsin / master src / tamsin / codenode.py
master

Tree @master (Download .tar.gz)

codenode.py @masterraw · history · blame

# encoding: UTF-8

# Copyright (c)2014 Chris Pressey, Cat's Eye Technologies.
# Distributed under a BSD-style license; see LICENSE for more information.


# TODO: some of these are definitely hierarchical, and some are definitely
# not.  make the distinction.  make the latter more like 3-address-code.


class CodeNode(object):
    def __init__(self, *args, **kwargs):
        self.args = list(args)
        self.kwargs = kwargs

    def append(self, item):
        self.args.append(item)

    def __getitem__(self, key):
        if key in self.kwargs:
            return self.kwargs[key]
        return self.args[key]

    def __repr__(self):
        return "%s(%s%s)" % (
            self.__class__.__name__,
            (', '.join([repr(a) for a in self.args]) + ', ') if self.args else '',
            ', '.join('%s=%r' % (key, self.kwargs[key]) for key in self.kwargs) if self.kwargs else ''
        )


class Program(CodeNode):
    """Represents a target program."""
    pass


class Prototype(CodeNode):
    """Represents a prototype for a subroutine in a target program."""
    pass


class Subroutine(CodeNode):
    """Represents a subroutine in a target program."""
    def __init__(self, module, prod, formals, children):
        self.module = module
        self.prod = prod
        self.formals = formals
        self.children = children

    def __repr__(self):
        return "Subroutine(%r, %r, %r, %r)" % (
            self.module, self.prod, self.formals, self.children
        )


class Block(CodeNode):
    pass


class If(CodeNode):
    pass


class While(CodeNode):
    pass


class And(CodeNode):
    pass


class Not(CodeNode):
    pass


class DeclareLocal(CodeNode):
    pass


class GetVar(CodeNode):
    """name is the name of the target-language variable."""
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "GetVar(%r)" % (self.name)


class SetVar(CodeNode):
    """ref is a VariableRef for the target-language variable.
    expr is an expression."""
    def __init__(self, ref, expr):
        self.ref = ref
        self.expr = expr

    def __repr__(self):
        return "SetVar(%r, %r)" % (self.ref, self.expr)


class Concat(CodeNode):
    def __init__(self, name, lhs, rhs):
        self.name = name
        self.lhs = lhs
        self.rhs = rhs

    def __repr__(self):
        return "Concat(%r, %r, %r)" % (self.name, self.lhs, self.rhs)


class Unifier(CodeNode):
    pass


class PatternMatch(CodeNode):
    pass


class Return(CodeNode):
    pass


class DeclState(CodeNode):
    pass


class SaveState(CodeNode):
    pass


class RestoreState(CodeNode):
    pass


class Builtin(CodeNode):
    pass


class Call(CodeNode):
    pass


class NoMatch(CodeNode):
    pass


class Truth(CodeNode):
    pass


class Falsity(CodeNode):
    pass


class VariableRef(CodeNode):
    pass


class MkAtom(CodeNode):
    pass


class MkConstructor(CodeNode):
    """Represents some code in the target program to make a constructor."""
    def __init__(self, text, children):
        self.text = text
        self.children = children

    def __repr__(self):
        return "MkConstructor(%r, %r)" % (
            self.text, self.children
        )

class ScannerPushEngine(CodeNode):
    pass


class ScannerPopEngine(CodeNode):
    pass


class GetMatchedVar(CodeNode):
    pass