from AST import ASTNode, getParseTreeNodes from TypeNodes import InterNode, ClassNode from Environment import Env, CompEnv # compilation unit class CompNode(ASTNode): # always list all fields in the init method to show the class structure def __init__(self, parseTree): self.parseTree = parseTree self.packageName = '' self.importNames = [] self.env = None self.typeDcl = None self.children = [] for node in parseTree.children: if node.name == 'packageDcl': nameNodes = getParseTreeNodes(['ID', 'COMPID'], node) for n in nameNodes: self.packageName = n.lex elif node.name == 'importDcls': nameNodes = getParseTreeNodes(['ID', 'COMPID', 'IMPORTALL'], node) for n in nameNodes: self.importNames.append(n.lex) elif node.name == 'topDcls': typeNode = getParseTreeNodes('classDcl', node) if not typeNode: typeNode = getParseTreeNodes('interfaceDcl', node) self.typeDcl = InterNode(typeNode[0]) else: self.typeDcl = ClassNode(typeNode[0]) # always populate the children list self.children.append(self.typeDcl) def buildEnv(self, parentEnv): env = CompEnv(parentEnv, self.importNames, self.packageName) # env.addtoEnv(self.typeDcl) # # add imports # for i in self.importNames: # pName = i.split('.*') # check if it's import all # if len(pName) == 2: # nodes = parentEnv.getNodesByPackage(pName[0]) # for k, v in nodes: # if k in env.map: # raise Exception('ERROR: Declaration of {} is already in current Environment, cannot import it again'.format(pName + '.' + typeDcl.name)) # env.map[k] = v # else: # node = parentEnv.getNode(pName[0]) # env.addtoEnv(node) self.env = env return env