Created
March 26, 2012 17:45
-
-
Save ikeikeikeike/2207434 to your computer and use it in GitHub Desktop.
core.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
def flatten(seq): | |
l = [] | |
for elt in seq: | |
t = type(elt) | |
if t is tuple or t is list: | |
for elt2 in flatten(elt): | |
l.append(elt2) | |
else: | |
l.append(elt) | |
return l | |
def flatten_nodes(seq): | |
return [n for n in flatten(seq) if isinstance(n, Node)] | |
nodes = {} | |
class Node(object): | |
"""main nodes tree.""" | |
def getChildren(self): | |
pass # implemented by subclasses | |
def __iter__(self): | |
for n in self.getChildren(): | |
yield n | |
def asList(self): # for backwards compatibility | |
return self.getChildren() | |
def getChildNodes(self): | |
pass # implemented by subclasses | |
class Discard(Node): | |
def __init__(self, expr, lineno=None): | |
self.expr = expr | |
self.lineno = lineno | |
def getChildren(self): | |
return self.expr, | |
def getChildNodes(self): | |
return self.expr, | |
def __repr__(self): | |
return "Discard(%s)" % (repr(self.expr),) | |
class Add(Node): | |
def __init__(self, leftright, lineno=None): | |
self.left = leftright[0] | |
self.right = leftright[1] | |
self.lineno = lineno | |
def getChildren(self): | |
return self.left, self.right | |
def getChildNodes(self): | |
return self.left, self.right | |
def __repr__(self): | |
return "Add((%s, %s))" % (repr(self.left), repr(self.right)) | |
class Div(Node): | |
def __init__(self, leftright, lineno=None): | |
self.left = leftright[0] | |
self.right = leftright[1] | |
self.lineno = lineno | |
def getChildren(self): | |
return self.left, self.right | |
def getChildNodes(self): | |
return self.left, self.right | |
def __repr__(self): | |
return "Div((%s, %s))" % (repr(self.left), repr(self.right)) | |
class Sub(Node): | |
def __init__(self, leftright, lineno=None): | |
self.left = leftright[0] | |
self.right = leftright[1] | |
self.lineno = lineno | |
def getChildren(self): | |
return self.left, self.right | |
def getChildNodes(self): | |
return self.left, self.right | |
def __repr__(self): | |
return "Sub((%s, %s))" % (repr(self.left), repr(self.right)) | |
class Mul(Node): | |
def __init__(self, leftright, lineno=None): | |
self.left = leftright[0] | |
self.right = leftright[1] | |
self.lineno = lineno | |
def getChildren(self): | |
return self.left, self.right | |
def getChildNodes(self): | |
return self.left, self.right | |
def __repr__(self): | |
return "Mul((%s, %s))" % (repr(self.left), repr(self.right)) | |
class Name(Node): | |
""" Name > Identifier """ | |
def __init__(self, name, lineno=None): | |
self.name = intern(name) | |
self.lineno = lineno | |
def getChildren(self): | |
return tuple(self.name) | |
def getChildNodes(self): | |
return tuple() | |
def __repr__(self): | |
return "Name(%s)" % (repr(self.name), ) | |
class Const(Node): | |
""" STRING | NUMBER """ | |
def __init__(self, value, lineno=None): | |
self.value = value | |
self.lineno = lineno | |
def getChildren(self): | |
return tuple(self.value) | |
def getChildNodes(self): | |
return tuple() | |
def __repr__(self): | |
return "Const(%s)" % (repr(self.value), ) | |
class UnaryAdd(Node): | |
def __init__(self, expr, lineno=None): | |
self.expr = expr | |
self.lineno = lineno | |
def getChildren(self): | |
return self.expr, | |
def getChildNodes(self): | |
return self.expr, | |
def __repr__(self): | |
return "UnaryAdd(%s)" % (repr(self.expr),) | |
class UnarySub(Node): | |
def __init__(self, expr, lineno=None): | |
self.expr = expr | |
self.lineno = lineno | |
def getChildren(self): | |
return self.expr, | |
def getChildNodes(self): | |
return self.expr, | |
def __repr__(self): | |
return "UnarySub(%s)" % (repr(self.expr),) | |
class AssName(Node): | |
def __init__(self, name, flags, lineno=None): | |
self.name = name | |
self.flags = flags | |
self.lineno = lineno | |
def getChildren(self): | |
return self.name, self.flags | |
def getChildNodes(self): | |
return () | |
def __repr__(self): | |
return "AssName(%s, %s)" % (repr(self.name), repr(self.flags)) | |
class Assign(Node): | |
def __init__(self, nodes, expr, lineno=None): | |
self.nodes = nodes | |
self.expr = expr | |
self.lineno = lineno | |
def getChildren(self): | |
children = [] | |
children.extend(flatten(self.nodes)) | |
children.append(self.expr) | |
return tuple(children) | |
def getChildNodes(self): | |
nodelist = [] | |
nodelist.extend(flatten_nodes(self.nodes)) | |
nodelist.append(self.expr) | |
return tuple(nodelist) | |
def __repr__(self): | |
return "Assign(%s, %s)" % (repr(self.nodes), repr(self.expr)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment