def VAR_ENTRY(self): print "creating create_varEntry." # create a new class table entry for a variable entry = Entry(self.level, '', 'variable', '') while isinstance(self.attr_buffer[-1], int): entry.arraySize.insert(0, self.attr_buffer.pop()) if len(self.attr_buffer) > 1: nameToken = self.attr_buffer.pop() entry.name = nameToken typeToken = self.attr_buffer.pop() entry.type = typeToken # if variable already in scope give warning foundEntry = self.check_var_in_scope(entry) if isinstance(foundEntry, Entry): self.warnings += "\nWarning: Variable " + str( nameToken) + " already exists in scope here: " + str( foundEntry.name) # if type is a UD_Type, put in dict for 'second pass' circular class dependency checking if entry.type != 'int' and entry.type != 'float' and len( self.SymbolTable_stack ) > 1 and self.SymbolTable_stack[1].name != 'program': if self.SymbolTable_stack[1].name.value in self.classUsageDict: if typeToken not in self.classUsageDict[ self.SymbolTable_stack[1].name.value]: self.classUsageDict[ self.SymbolTable_stack[1].name.value].append(typeToken) else: self.classUsageDict[self.SymbolTable_stack[1].name.value] = [] # append the new entry to the class table if self.SymbolTable_stack: self.SymbolTable_stack[-1].addEntry(entry)
def ASSIGNMENT_VAR(self): print 'Assign Var' entry = Entry(self.level, '', 'assignment', '') # get all arithExpr indices specified and save them in the assignment entry while isinstance(self.attr_buffer[-1], list): entry.IDXorPARAMS.insert(0, self.attr_buffer.pop()) if len(self.attr_buffer) > 0: entry.name = self.attr_buffer.pop() entry = self.ensure_var_exist(entry) if entry is not None and len(self.SymbolTable_stack) > 0: self.SymbolTable_stack[-1].addEntry(entry)
def PACK_NEST(self): print 'packing and saving nest' # self.warnings += '\nin pack_nest, ' + str(self.SymbolTable_stack[-1].entries[-1].nest) if len(self.SymbolTable_stack[-1].entries[-1].nest) > 0 and len( self.SymbolTable_stack[-1].entries[-1].nest[-1]) == 0: entry = Entry(self.level, '', 'nest', '') # get all arithExpr indices specified and save them in the assignment entry while isinstance(self.attr_buffer[-1], list): entry.IDXorPARAMS.insert(0, self.attr_buffer.pop()) if len(self.attr_buffer) > 0: entry.name = self.attr_buffer.pop() # should change to ensure nest variable exist... #entry = self.ensure_var_exist(entry) if entry is not None and len(self.SymbolTable_stack) > 0: self.SymbolTable_stack[-1].entries[-1].nest[-1].append(entry) # self.assignmentEntryBuffer = entry else: print 'no nest to pack'
def ADD_FUNC_PARAM_ENTRY(self): print 'adding a function parameter entry.' entry = Entry(self.level, '', 'parameter', '') while isinstance(self.attr_buffer[-1], int): entry.arraySize.insert(0, self.attr_buffer.pop()) if len(self.attr_buffer) > 1: nameToken = self.attr_buffer.pop() entry.name = nameToken.value entry.type = self.attr_buffer.pop().value # if variable already in scope give warning if self.check_var_in_scope(entry): self.warnings += "\nWarning: Parameter name already exists in scope: " + str( nameToken) if self.SymbolTable_stack: self.SymbolTable_stack[-1].addEntry(entry) # modify the type of the function entry two layers back if len(self.SymbolTable_stack) > 1: self.SymbolTable_stack[-2].append_param_to_func_entry_type( self.SymbolTable_stack[-1], entry)