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 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)