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)