git @ Cat's Eye Technologies ALPACA / master src / alpaca / ast.py
master

Tree @master (Download .tar.gz)

ast.py @masterraw · history · blame

# encoding: UTF-8

class AST(object):
    children_attrs = ()
    child_attrs = ()
    value_attrs = ()

    def __init__(self, **kwargs):
        self.attrs = {}
        for attr in self.children_attrs:
            self.attrs[attr] = kwargs.pop(attr, [])
            for child in self.attrs[attr]:
                assert isinstance(child, AST), \
                  "child %r of %r is not an AST node" % (child, self)        
        for attr in self.child_attrs:
            self.attrs[attr] = kwargs.pop(attr, None)
            child = self.attrs[attr]
            assert isinstance(child, AST), \
              "child %r of %r is not an AST node" % (child, self)        
        for attr in self.value_attrs:
            self.attrs[attr] = kwargs.pop(attr, None)
        assert (not kwargs), "extra arguments supplied to {} node: {}".format(self.type, kwargs)

    @property
    def type(self):
        return self.__class__.__name__

    def __repr__(self):
        return "%s(%r)" % (self.__class__.__name__, self.attrs)

    def __getattr__(self, name):
        if name in self.attrs:
            return self.attrs[name]
        raise AttributeError(name)

    def all_children(self):
        for attr in self.children_attrs:
            for child in self.attrs[attr]:
                yield child
                for subchild in child.all_children():
                    yield subchild
        for attr in self.child_attrs:
            child = self.attrs[attr]
            yield child
            for subchild in child.all_children():
                yield subchild


class Alpaca(AST):
    children_attrs = ('defns',)
    child_attrs = ('playfield',)


class Neighbourhood(AST):
    children_attrs = ('children',)


class Playfield(AST):
    value_attrs = ('value',)


class CharRepr(AST):
    value_attrs = ('value',)


class StateDefn(AST):
    children_attrs = ('rules', 'classes',)
    child_attrs = ('char_repr',)
    value_attrs = ('id',)


class ClassDecl(AST):
    value_attrs = ('id',)


class ClassDefn(AST):
    children_attrs = ('rules', 'classes',)
    value_attrs = ('id',)


class NbhdDefn(AST):
    children_attrs = ('children',)
    value_attrs = ('id',)


class Rule(AST):
    child_attrs = ('expr', 'state_ref',)


class StateRefEq(AST):
    value_attrs = ('id',)


class StateRefRel(AST):
    value_attrs = ('value',)


class NbhdRef(AST):
    value_attrs = ('id',)


class Adjacency(AST):
    child_attrs = ('rel', 'nbhd',)
    value_attrs = ('count',)


class Relational(AST):
    child_attrs = ('lhs', 'rhs',)


class Not(AST):
    child_attrs = ('expr',)


class BoolOp(AST):
    child_attrs = ('lhs', 'rhs',)
    value_attrs = ('op',)


class BoolLit(AST):
    value_attrs = ('value',)