diff options
Diffstat (limited to 'Lib/compiler/ast.py')
-rw-r--r-- | Lib/compiler/ast.py | 689 |
1 files changed, 689 insertions, 0 deletions
diff --git a/Lib/compiler/ast.py b/Lib/compiler/ast.py new file mode 100644 index 0000000..9c214d4 --- /dev/null +++ b/Lib/compiler/ast.py @@ -0,0 +1,689 @@ +import types + +nodes = {} + +def flatten(list): + l = [] + for elt in list: + if type(elt) is types.TupleType: + for elt2 in flatten(elt): + l.append(elt2) + elif type(elt) is types.ListType: + for elt2 in flatten(elt): + l.append(elt2) + else: + l.append(elt) + return l + +def asList(nodes): + l = [] + for item in nodes: + if hasattr(item, "asList"): + l.append(item.asList()) + else: + if type(item) is types.TupleType: + l.append(tuple(asList(item))) + elif type(item) is types.ListType: + l.append(asList(item)) + else: + l.append(item) + return l + +class Node: + def __init__(self, *args): + self._children = args + self.lineno = None + def __getitem__(self, index): + return self._children[index] + def __repr__(self): + return "<Node %s>" % self._children[0] + def __len__(self): + return len(self._children) + def __getslice__(self, low, high): + return self._children[low:high] + def getChildren(self): + return tuple(flatten(self._children[1:])) + def getType(self): + return self._children[0] + def asList(self): + return tuple(asList(self._children)) + +class EmptyNode(Node): + def __init__(self): + self.lineno = None + +class Module(Node): + nodes['module'] = 'Module' + + def __init__(self, doc, node): + self.doc = doc + self.node = node + self._children = ('module', doc, node) + + def __repr__(self): + return "Module(%s,%s)" % self._children[1:] + +class Stmt(Node): + nodes['stmt'] = 'Stmt' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('stmt', nodes) + + def __repr__(self): + return "Stmt(%s)" % self._children[1:] + +class Function(Node): + nodes['function'] = 'Function' + + def __init__(self, name, argnames, defaults, flags, doc, code): + self.name = name + self.argnames = argnames + self.defaults = defaults + self.flags = flags + self.doc = doc + self.code = code + self._children = ('function', + name, argnames, defaults, flags, doc, code) + + def __repr__(self): + return "Function(%s,%s,%s,%s,%s,%s)" % self._children[1:] + +class Lambda(Node): + nodes['lambda'] = 'Lambda' + + def __init__(self, argnames, defaults, flags, code): + self.argnames = argnames + self.defaults = defaults + self.flags = flags + self.code = code + self._children = ('lambda', argnames, defaults, flags, code) + + def __repr__(self): + return "Lambda(%s,%s,%s,%s)" % self._children[1:] + +class Classdef(Node): + nodes['classdef'] = 'Classdef' + + def __init__(self, name, bases, doc, code): + self.name = name + self.bases = bases + self.doc = doc + self.code = code + self._children = ('classdef', name, bases, doc, code) + + def __repr__(self): + return "Classdef(%s,%s,%s,%s)" % self._children[1:] + +class Pass(EmptyNode): + nodes['pass'] = 'Pass' + _children = ('pass',) + def __repr__(self): + return "Pass()" + +class Break(EmptyNode): + nodes['break'] = 'Break' + _children = ('break',) + def __repr__(self): + return "Break()" + +class Continue(EmptyNode): + nodes['continue'] = 'Continue' + _children = ('continue',) + def __repr__(self): + return "Continue()" + +class For(Node): + nodes['for'] = 'For' + + def __init__(self, assign, list, body, else_): + self.assign = assign + self.list = list + self.body = body + self.else_ = else_ + self._children = ('for', assign, list, body, else_) + + def __repr__(self): + return "For(%s,%s,%s,%s)" % self._children[1:] + +class While(Node): + nodes['while'] = 'While' + + def __init__(self, test, body, else_): + self.test = test + self.body = body + self.else_ = else_ + self._children = ('while', test, body, else_) + + def __repr__(self): + return "While(%s,%s,%s)" % self._children[1:] + +class If(Node): + """if: [ (testNode, suiteNode), ...], elseNode""" + nodes['if'] = 'If' + + def __init__(self, tests, else_): + self.tests = tests + self.else_ = else_ + self._children = ('if', tests, else_) + + def __repr__(self): + return "If(%s,%s)" % self._children[1:] + +class Exec(Node): + nodes['exec'] = 'Exec' + + def __init__(self, expr1, expr2, expr3): + self.expr1 = expr1 + self.expr2 = expr2 + self.expr3 = expr3 + self._children = ('exec', expr1, expr2, expr3) + + def __repr__(self): + return "Exec(%s,%s,%s)" % self._children[1:] + +class From(Node): + nodes['from'] = 'From' + + def __init__(self, modname, names): + self.modname = modname + self.names = names + self._children = ('from', modname, names) + + def __repr__(self): + return "From(%s,%s)" % self._children[1:] + +class Import(Node): + nodes['import'] = 'Import' + + def __init__(self, names): + self.names = names + self._children = ('import', names) + + def __repr__(self): + return "Import(%s)" % self._children[1:] + +class Raise(Node): + nodes['raise'] = 'Raise' + + def __init__(self, expr1, expr2, expr3): + self.expr1 = expr1 + self.expr2 = expr2 + self.expr3 = expr3 + self._children = ('raise', expr1, expr2, expr3) + + def __repr__(self): + return "Raise(%s,%s,%s)" % self._children[1:] + +class Tryfinally(Node): + nodes['tryfinally'] = 'Tryfinally' + + def __init__(self, try_, fin): + self.try_ = try_ + self.fin = fin + self._children = ('tryfinally', try_, fin) + + def __repr__(self): + return "Tryfinally(%s,%s)" % self._children[1:] + +class Tryexcept(Node): + nodes['tryexcept'] = 'Tryexcept' + + def __init__(self, try_, excs, else_): + self.try_ = try_ + self.excs = excs + self.else_ = else_ + self._children = ('tryexcept', try_, excs, else_) + + def __repr__(self): + return "Tryexcept(%s,%s,%s)" % self._children[1:] + +class Return(Node): + nodes['return'] = 'Return' + + def __init__(self, value): + self.value = value + self._children = ('return', value) + + def __repr__(self): + return "Return(%s)" % self._children[1:] + +class Const(Node): + nodes['const'] = 'Const' + + def __init__(self, value): + self.value = value + self._children = ('const', value) + + def __repr__(self): + return "Const(%s)" % self._children[1:] + +class Print(Node): + nodes['print'] = 'Print' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('print', nodes) + + def __repr__(self): + return "Print(%s)" % self._children[1:] + +class Printnl(Node): + nodes['printnl'] = 'Printnl' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('printnl', nodes) + + def __repr__(self): + return "Printnl(%s)" % self._children[1:] + +class Discard(Node): + nodes['discard'] = 'Discard' + + def __init__(self, expr): + self.expr = expr + self._children = ('discard', expr) + + def __repr__(self): + return "Discard(%s)" % self._children[1:] + +class Assign(Node): + nodes['assign'] = 'Assign' + + def __init__(self, nodes, expr): + self.nodes = nodes + self.expr = expr + self._children = ('assign', nodes, expr) + + def __repr__(self): + return "Assign(%s,%s)" % self._children[1:] + +class AssTuple(Node): + nodes['ass_tuple'] = 'AssTuple' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('ass_tuple', nodes) + + def __repr__(self): + return "AssTuple(%s)" % self._children[1:] + +class AssList(Node): + nodes['ass_list'] = 'AssList' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('ass_list', nodes) + + def __repr__(self): + return "AssList(%s)" % self._children[1:] + +class AssName(Node): + nodes['ass_name'] = 'AssName' + + def __init__(self, name, flags): + self.name = name + self.flags = flags + self._children = ('ass_name', name, flags) + + def __repr__(self): + return "AssName(%s,%s)" % self._children[1:] + +class AssAttr(Node): + nodes['ass_attr'] = 'AssAttr' + + def __init__(self, expr, attrname, flags): + self.expr = expr + self.attrname = attrname + self.flags = flags + self._children = ('ass_attr', expr, attrname, flags) + + def __repr__(self): + return "AssAttr(%s,%s,%s)" % self._children[1:] + +class List(Node): + nodes['list'] = 'List' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('list', nodes) + + def __repr__(self): + return "List(%s)" % self._children[1:] + +class Dict(Node): + nodes['dict'] = 'Dict' + + def __init__(self, keys): + self.keys = keys + self._children = ('dict', keys) + + def __repr__(self): + return "Dict(%s)" % self._children[1:] + +class Not(Node): + nodes['not'] = 'Not' + + def __init__(self, expr): + self.expr = expr + self._children = ('not', expr) + + def __repr__(self): + return "Not(%s)" % self._children[1:] + +class Compare(Node): + nodes['compare'] = 'Compare' + + def __init__(self, expr, ops): + self.expr = expr + self.ops = ops + self._children = ('compare', expr, ops) + + def __repr__(self): + return "Compare(%s,%s)" % self._children[1:] + +class Name(Node): + nodes['name'] = 'Name' + + def __init__(self, name): + self.name = name + self._children = ('name', name) + + def __repr__(self): + return "Name(%s)" % self._children[1:] + +class Global(Node): + nodes['global'] = 'Global' + + def __init__(self, names): + self.names = names + self._children = ('global', names) + + def __repr__(self): + return "Global(%s)" % self._children[1:] + +class Backquote(Node): + nodes['backquote'] = 'Backquote' + + def __init__(self, node): + self.node = node + self._children = ('backquote', node) + + def __repr__(self): + return "Backquote(%s)" % self._children[1:] + +class Getattr(Node): + nodes['getattr'] = 'Getattr' + + def __init__(self, expr, attrname): + self.expr = expr + self.attrname = attrname + self._children = ('getattr', expr, attrname) + + def __repr__(self): + return "Getattr(%s,%s)" % self._children[1:] + +class CallFunc(Node): + nodes['call_func'] = 'CallFunc' + + def __init__(self, node, args): + self.node = node + self.args = args + self._children = ('call_func', node, args) + + def __repr__(self): + return "CallFunc(%s,%s)" % self._children[1:] + +class Keyword(Node): + nodes['keyword'] = 'Keyword' + + def __init__(self, name, expr): + self.name = name + self.expr = expr + self._children = ('keyword', name, expr) + + def __repr__(self): + return "Keyword(%s,%s)" % self._children[1:] + +class Subscript(Node): + nodes['subscript'] = 'Subscript' + + def __init__(self, expr, flags, subs): + self.expr = expr + self.flags = flags + self.subs = subs + self._children = ('subscript', expr, flags, subs) + + def __repr__(self): + return "Subscript(%s,%s,%s)" % self._children[1:] + +class Ellipsis(EmptyNode): + nodes['ellipsis'] = 'Ellipsis' + _children = ('ellipsis',) + def __repr__(self): + return "Ellipsis()" + +class Sliceobj(Node): + nodes['sliceobj'] = 'Sliceobj' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('sliceobj', nodes) + + def __repr__(self): + return "Sliceobj(%s)" % self._children[1:] + +class Slice(Node): + nodes['slice'] = 'Slice' + + def __init__(self, expr, flags, lower, upper): + self.expr = expr + self.flags = flags + self.lower = lower + self.upper = upper + self._children = ('slice', expr, flags, lower, upper) + + def __repr__(self): + return "Slice(%s,%s,%s,%s)" % self._children[1:] + +class Assert(Node): + nodes['assert'] = 'Assert' + + def __init__(self, expr1, expr2): + self.expr1 = expr1 + self.expr2 = expr2 + self._children = ('assert', expr1, expr2) + + def __repr__(self): + return "Assert(%s,%s)" % self._children[1:] + +class Tuple(Node): + nodes['tuple'] = 'Tuple' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('tuple', nodes) + + def __repr__(self): + return "Tuple(%s)" % self._children[1:] + +class Or(Node): + nodes['or'] = 'Or' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('or', nodes) + + def __repr__(self): + return "Or(%s)" % self._children[1:] + +class And(Node): + nodes['and'] = 'And' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('and', nodes) + + def __repr__(self): + return "And(%s)" % self._children[1:] + +class Bitor(Node): + nodes['bitor'] = 'Bitor' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('bitor', nodes) + + def __repr__(self): + return "Bitor(%s)" % self._children[1:] + +class Bitxor(Node): + nodes['bitxor'] = 'Bitxor' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('bitxor', nodes) + + def __repr__(self): + return "Bitxor(%s)" % self._children[1:] + +class Bitand(Node): + nodes['bitand'] = 'Bitand' + + def __init__(self, nodes): + self.nodes = nodes + self._children = ('bitand', nodes) + + def __repr__(self): + return "Bitand(%s)" % self._children[1:] + +class LeftShift(Node): + nodes['<<'] = 'LeftShift' + + def __init__(self, (expr, shift)): + self.expr = expr + self.shift = shift + self._children = ('<<', (expr, shift)) + + def __repr__(self): + return "LeftShift(%s,%s)" % self._children[1:] + +class RightShift(Node): + nodes['>>'] = 'RightShift' + + def __init__(self, (expr, shift)): + self.expr = expr + self.shift = shift + self._children = ('>>', (expr, shift)) + + def __repr__(self): + return "RightShift(%s,%s)" % self._children[1:] + +class Add(Node): + nodes['+'] = 'Add' + + def __init__(self, (left, right)): + self.left = left + self.right = right + self._children = ('+', (left, right)) + + def __repr__(self): + return "Add(%s)" % self._children[1:] + +class Sub(Node): + nodes['-'] = 'Sub' + + def __init__(self, (left, right)): + self.left = left + self.right = right + self._children = ('-', (left, right)) + + def __repr__(self): + return "Sub(%s)" % self._children[1:] + +class Mul(Node): + nodes['*'] = 'Mul' + + def __init__(self, (left, right)): + self.left = left + self.right = right + self._children = ('*', (left, right)) + + def __repr__(self): + return "Mul(%s)" % self._children[1:] + +class Div(Node): + nodes['/'] = 'Div' + + def __init__(self, (left, right)): + self.left = left + self.right = right + self._children = ('/', (left, right)) + + def __repr__(self): + return "Div(%s)" % self._children[1:] + +class Mod(Node): + nodes['%'] = 'Mod' + + def __init__(self, (left, right)): + self.left = left + self.right = right + self._children = ('%', (left, right)) + + def __repr__(self): + return "Mod(%s)" % self._children[1:] + +class Power(Node): + nodes['power'] = 'Power' + + def __init__(self, (left, right)): + self.left = left + self.right = right + self._children = ('power', (left, right)) + + def __repr__(self): + return "Power(%s)" % self._children[1:] + +class UnaryAdd(Node): + nodes['unary+'] = 'UnaryAdd' + + def __init__(self, node): + self.node = node + self._children = ('unary+', node) + + def __repr__(self): + return "UnaryAdd(%s)" % self._children[1:] + +class UnarySub(Node): + nodes['unary-'] = 'UnarySub' + + def __init__(self, node): + self.node = node + self._children = ('unary-', node) + + def __repr__(self): + return "UnarySub(%s)" % self._children[1:] + +class Invert(Node): + nodes['invert'] = 'Invert' + + def __init__(self, node): + self.node = node + self._children = ('invert', node) + + def __repr__(self): + return "Invert(%s)" % self._children[1:] + +# now clean up the nodes dictionary +klasses = globals() +for k in nodes.keys(): + nodes[k] = klasses[nodes[k]] + +# Local Variables: +# mode:python +# indent-tabs-mode: nil +# py-indent-offset: 2 +# py-smart-indentation: nil +# End: |