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)