CompNode.py 2.18 KiB
from AST import ASTNode, getParseTreeNodes
from TypeNodes import InterNode, ClassNode
from Environment import Env
# 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 = [] # list of strings representing names getting imported
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 = Env(None) # global environment is not the parent Env, each file don't have access to all the stuff in global env
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