diff --git a/CompNode.py b/CompNode.py index d77cc1cd44d69dbcbf4f491dff50b52108a2995c..98db3153f24eb7549343c890e0d7e55e56139aba 100644 --- a/CompNode.py +++ b/CompNode.py @@ -35,18 +35,17 @@ class CompNode(ASTNode): 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) - + # # 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 diff --git a/LineNodes.py b/LineNodes.py index eb8e27167fbafe37796e8ca65b1f47fdfe029fa4..0e3013b0eb2a1629e3cad93a5bb010b365cf6c44 100644 --- a/LineNodes.py +++ b/LineNodes.py @@ -1,37 +1,37 @@ from AST import ASTNode, getParseTreeNodes, getTypeName from Environment import Env +from WordNodes import ExprNode -# expr -class ExprNode(ASTNode): +# containing line level nodes: block, for/while/if, declaration + +# block +class BlockNode(ASTNode): + # always list all fields in the init method to show the class structure + def __init__(self, parseTree): + self.parseTree = parseTree + self.statements = StatementsNode(parseTree.children[1]) # block LBRACK statements RBRACK + self.env = None + self.children = self.statements + # a wrapper around statementsNode use to check double declaration within a block + +class VarDclNode(ASTNode): # always list all fields in the init method to show the class structure def __init__(self, parseTree): self.parseTree = parseTree - self.left = '' - self.op = '' - self.right = None # another expr + self.dclType = '' + self.name = '' + self.assign = None # AssignNode, can be None + self.statements = [] # list of nodes representing statements in a block self.env = None self.children = [] + # input is : statement type variableDcl SEMICO - # def buildEnv(self, parentEnv): - # env = Env(parentEnv) - # # env.addtoEnv() - # - # - # self.env = env - # return env -# block -class BlockNode(ASTNode): + +class ForNode(ASTNode): # always list all fields in the init method to show the class structure def __init__(self, parseTree): self.parseTree = parseTree - self.statements = [] # list of statements in a block + self.statements = [] # list of nodes representing statements in a block self.env = None self.children = [] - - # def buildEnv(self, parentEnv): - # env = Env(parentEnv) - # # env.addtoEnv() - # - # self.env = env - # return env diff --git a/MemberNodes.py b/MemberNodes.py index 0785aad65a18c8021d3a3ffa9926219a466f343c..445f8c631652f86ee870976bba807efed4eff167 100644 --- a/MemberNodes.py +++ b/MemberNodes.py @@ -1,5 +1,6 @@ from AST import ASTNode, getParseTreeNodes, getTypeName -from LineNodes import ExprNode, BlockNode +from LineNodes import BlockNode +from WordNodes import ExprNode from Environment import Env from collections import OrderedDict diff --git a/TypeNodes.py b/TypeNodes.py index 2d82d993a32954f1d73b210f7a65dee42e6d51f0..e9b13005b07ff9f4796e4010c8e30cf6f9c62ec3 100644 --- a/TypeNodes.py +++ b/TypeNodes.py @@ -52,11 +52,20 @@ class ClassNode(ASTNode): def buildEnv(self, parentEnv): env = Env(parentEnv) - for c in self.children: - env.addtoEnv(c) + for m in self.methods: + env.addtoEnv(m) + for f in self.fields: + env.addtoEnv(f) + # not adding constructor to the environment, since it's in the type namespace + # when looking for a constructor, look for a class with the same name, and look in its constructors field self.env = env return env + def getConstructor(self, argTypes): + for c in self.constructors: + if c.paramTypes == argTypes: + return c + ##################################################################### # interface class InterNode(ASTNode):