from .iobject import IObject
from .iexpression import IVar, IVarAccess
from ...utility.formatting import indent, wrapblock
from ...utility import translateKwds
import abc
__all__ = [
'IAssign', 'IBlock', 'ICase', 'ICaseCons', 'ICaseLit', 'IConsBranch'
, 'IExempt', 'IFreeDecl', 'ILitBranch', 'INodeAssign', 'IReturn'
, 'IStatement', 'IVarAssign', 'IVarDecl'
]
[docs]
class IBlock(IObject):
def __init__(self, vardecls, assigns, stmt, **kwds):
self.vardecls = tuple(vardecls)
self.assigns = tuple(assigns)
self.stmt = stmt
IObject.__init__(self, **kwds)
@property
def children(self):
return self.vardecls + self.assigns + (self.stms,)
def __str__(self):
lines = [str(x) for x in self.vardecls] \
+ [str(x) for x in self.assigns] \
+ [str(self.stmt)]
return '\n'.join(lines)
def __repr__(self):
return 'IBlock(vardecls=%r, assigns=%r, stmt=%r)' % (
self.vardecls, self.assigns, self.stmt
)
[docs]
class IFreeDecl(IObject):
def __init__(self, vid, **kwds):
self.vid = vid
IObject.__init__(self, **kwds)
@property
def lhs(self):
return IVar(self.vid)
def __str__(self):
return 'free %s' % IVar(self.vid)
def __repr__(self):
return 'IFreeDecl(vid=%r)' % self.vid
[docs]
class IVarDecl(IObject, metaclass=abc.ABCMeta):
def __init__(self, vid, **kwds):
self.vid = vid
IObject.__init__(self, **kwds)
@property
def lhs(self):
return IVar(self.vid)
def __str__(self):
return 'var %s' % IVar(self.vid)
def __repr__(self):
return 'IVarDecl(vid=%r)' % self.vid
IVarDecl.register(IFreeDecl)
[docs]
class IVarAssign(IObject):
def __init__(self, vid, expr, **kwds):
self.vid = vid
self.expr = expr
IObject.__init__(self, **kwds)
_fields_ = 'vid', 'expr'
@property
def lhs(self):
return IVar(self.vid)
@property
def rhs(self):
return self.expr
@property
def children(self):
return self.expr,
def __str__(self):
return '%s <- %s' % (IVar(self.vid), self.expr)
def __repr__(self):
return 'IVarAssign(vid=%r, expr=%r)' % (self.vid, self.expr)
[docs]
class INodeAssign(IObject):
def __init__(self, vid, path, expr, **kwds):
self.vid = vid
self.path = path
self.expr = expr
IObject.__init__(self, **kwds)
_fields_ = 'vid', 'path', 'expr'
@property
def lhs(self):
return IVarAccess(self.vid, self.path)
@property
def rhs(self):
return self.expr
@property
def children(self):
return self.expr,
def __str__(self):
return '%s <- %s' % (
IVarAccess(self.vid, self.path), self.expr
)
def __repr__(self):
return 'INodeAssign(vid=%r, path=%r, expr=%r)' % (
self.vid, self.path, self.expr
)
[docs]
class IAssign(IObject, metaclass=abc.ABCMeta):
pass
IAssign.register(IVarAssign)
IAssign.register(INodeAssign)
[docs]
class IExempt(IObject):
def __str__(self):
return 'exempt'
def __repr__(self):
return 'IExempt()'
[docs]
class IReturn(IObject):
def __init__(self, expr, **kwds):
self.expr = expr
IObject.__init__(self, **kwds)
@property
def children(self):
return self.expr,
def __str__(self):
return 'return %s' % self.expr
def __repr__(self):
return 'IReturn(expr=%r)' % self.expr
[docs]
class ICase(IObject):
def __init__(self, vid, branches, **kwds):
self.vid = vid
self.branches = branches
IObject.__init__(self, **kwds)
_fields_ = 'vid', 'branches'
@property
def var(self):
return IVar(self.vid)
@property
def children(self):
return self.branches
def __str__(self):
return 'case %s of\n%s' % (
self.var
, indent(self.branches)
)
def __repr__(self):
return '%s(vid=%r, branches=%r)' % (
type(self).__name__, self.vid, self.branches
)
[docs]
class ICaseCons(ICase): pass
[docs]
class ICaseLit(ICase): pass
[docs]
class IConsBranch(IObject):
@translateKwds({'name': 'symbolname'})
def __init__(self, symbolname, arity, block, **kwds):
self.symbolname = symbolname
self.arity = arity
self.block = block
IObject.__init__(self, **kwds)
_fields_ = 'symbolname', 'arity', 'block'
@property
def children(self):
return self.block,
def __str__(self):
return '%s %s->%s' % (self.symbolname, ''.join('_ ' * self.arity), wrapblock(self.block))
def __repr__(self):
return 'IConsBranch(symbolname=%r, arity=%r, block=%r)' % (
self.symbolname, self.arity, self.block
)
[docs]
class ILitBranch(IObject):
def __init__(self, lit, block, **kwds):
self.lit = lit
self.block = block
IObject.__init__(self, **kwds)
@property
def children(self):
return self.lit, self.block
def __str__(self):
return '%s ->%s' % (self.lit, wrapblock(self.block))
def __repr__(self):
return 'ILitBranch(lit=%r, block=%r)' % (self.lit, self.block)
[docs]
class IStatement(IObject, metaclass=abc.ABCMeta):
pass
IStatement.register(IAssign)
IStatement.register(IBlock)
IStatement.register(ICaseCons)
IStatement.register(ICaseLit)
IStatement.register(IExempt)
IStatement.register(IReturn)
IStatement.register(IVarDecl)