def red():

    flag = 1
    for each in variables.productions:
        if len(redStack) >= (len(each) - 3) and redStack[-(len(each) - 3) :] == each[2:-1]:
            if variables.flag[10] == True:
                print "\n The matched handel is:",
                prnt(redStack[-(len(each) - 3) :], 3)

            if variables.flag[8] == True:  # Printing stack symbols before reduction if flag is set
                print "\nThe stack before reduction is:"
                prnt(redStack, 2)

            if variables.flag[7] == True:  # Printing the reduction if the flag is set
                prnt(each, 1)

            redStack[-(len(each) - 3) :] = each[-1:]  # Performing reduction on stack
            semantics.semRed(2, each[0] - 1)
            flag = 0  # Reduction found, reset flag

            if variables.flag[8] == True:  # Printing stack symbols after reduction if flag is set
                print "\n The stack after reduction is:"
                prnt(redStack, 2)

            break

    if flag == 1:
        print "\nError, reduction not found"
        sys.exit()
def reduction(rQueue):
    global vStack
    flag = 0  # Used to indicate error
    flag1 = 0

    if len(redStack) == 0:
        redStack.append(rQueue[0])  # Initializing the reduction stack

        semantics.semRed(1, variables.var[0])
        variables.var.pop(0)

        rQueue.pop(0)

    if len(rQueue) == 0:
        red()

    while len(rQueue) > 0 and flag == 0:

        ch = variables.matrix[redStack[-1:][0] - 1][rQueue[0] - 1]  # Finding the entry in symbol matrix
        if (
            variables.flag[9] == True
        ):  # Printing the top of the stack, input symbol and relation between them if flag is set
            print "\nTop of the stack:", variables.symbols[
                redStack[-1:][0] - 1
            ], ",", "Input symbol:", variables.symbols[rQueue[0] - 1], ",", "Relation:",
            if ch == 1:
                print "Equal to."
            elif ch == 2:
                print "Greater than."
            elif ch == 3:
                print "Less than."
            elif ch == 0:
                print "No relation."

        if ch == 1 or ch == 3:  # Stacking the first queue symbol if the relations is "equal to" or "less than"
            redStack.append(rQueue[0])

            semantics.semRed(1, variables.var[0])
            # Call to semantic reduction

            variables.var.pop(0)  # Removing the input variable after inserting it into the semantic stack

            rQueue.pop(0)

        if ch == 2:  # Performing reduction if reduction is "greater than"
            red()

            if flag1 == 0:
                flag1 = 1
                vStack = len(redStack)

        if ch == 0:
            print "\nError, no relation between top element of the stack and first element in the queue"
            flag = 1  # Setting flag to indicate error if entry in symbol matrix not found

    if flag != 1:
        bStack[:] = redStack[:]  # Backing up reduction stack if symbol queue is parsed successfully

    elif flag == 1:
        print "\nElements removed from the stack:"
        prnt(redStack[vStack:], 3)
        print "\nElenents ignored from the input:"
        prnt(rQueue, 3)
        redStack[:] = bStack[:]  # Undoing reductions if error occurs (Panic Recovery)