def WHILE():
    Fun.object_gen()
    Config.Iteratables[-1] = Classes.COND_STATEMENT()

    line_list = []

    line_split = Config.Iteratables[-2].line_list[
        Config.Iteratables[-2].line_number].split()

    if line_split[-1] == "DO":
        del line_split[-1]

    Config.Iteratables[-1].Cond = line_split
    stat = Config.Iteratables[-1].Cond  # Conditional Statement
    cond = Config.Iteratables[-1].Cond

    if len(cond) == 4:
        Config.Iteratables[-1].Cond = Fun.comp(cond[1], cond[3], cond[2])

    while True:
        Config.Iteratables[-2].line_number += 1
        try:
            Config.Iteratables[-2].cur_line = Config.Iteratables[-2].line_list[
                Config.Iteratables[-2].line_number]

            line_list.append(Config.Iteratables[-2].cur_line)
            line_split = Config.Iteratables[-2].cur_line.split()

            if line_split[0] == "WHILE":
                Classes.Loop_Counts.While += 1

            if line_split[0] == "ENDWHILE" and Classes.Loop_Counts.While == 0:
                del line_list[-1]
                break

            if line_split[0] == "ENDWHILE":
                Classes.Loop_Counts.While -= 1

        except IndexError:
            pass

    # Config.Iteratables[-2].line_number -= 1
    Config.Iteratables[-1].line_list = line_list

    while Config.Iteratables[-1].Cond:

        while Config.Iteratables[-1].line_number < len(
                Config.Iteratables[-1].line_list):
            cur_line = Config.Iteratables[-1].line_list[
                Config.Iteratables[-1].line_number]
            main(cur_line)
            Config.Iteratables[-1].line_number += 1

        Config.Iteratables[-1].line_number = 0
        Config.Iteratables[-1].Cond = Fun.comp(stat[1], stat[3], stat[2])
    del Config.Iteratables[-1]
def REPEAT():
    Fun.object_gen()
    Config.Iteratables[-1] = Classes.COND_STATEMENT()

    line_list = []

    while True:
        Config.Iteratables[-2].line_number += 1
        try:
            Config.Iteratables[-2].cur_line = Config.Iteratables[-2].line_list[
                Config.Iteratables[-2].line_number]

            line_list.append(Config.Iteratables[-2].cur_line)
            line_split = Config.Iteratables[-2].cur_line.split()

            if line_split[0] == "REPEAT":
                Classes.Loop_Counts.Repeat += 1

            if line_split[0] == "UNTIL" and Classes.Loop_Counts.Repeat == 0:

                Config.Iteratables[-1].Cond = line_split
                stat = Config.Iteratables[-1].Cond  # Conditional Statement
                cond = Config.Iteratables[-1].Cond

                if len(cond) == 4:
                    Config.Iteratables[-1].Cond = Fun.comp(
                        cond[1], cond[3], cond[2])

                del line_list[-1]
                break

            if line_split[0] == "UNTIL":
                Classes.Loop_Counts.Repeat -= 1

        except IndexError:
            pass

    # Config.Iteratables[-2].line_number -= 1
    Config.Iteratables[-1].line_list = line_list

    while True:

        while Config.Iteratables[-1].line_number < len(
                Config.Iteratables[-1].line_list):
            cur_line = Config.Iteratables[-1].line_list[
                Config.Iteratables[-1].line_number]
            main(cur_line)
            Config.Iteratables[-1].line_number += 1

        Config.Iteratables[-1].line_number = 0
        Config.Iteratables[-1].Cond = Fun.comp(stat[1], stat[3], stat[2])

        if Config.Iteratables[-1].Cond:
            break
    del Config.Iteratables[-1]
def IF():
    Fun.object_gen()
    Config.Iteratables[-1] = Classes.COND_STATEMENT()

    found_endif = False
    alt_lines = True
    line_list = []

    line_split = Config.Iteratables[-2].line_list[
        Config.Iteratables[-2].line_number].split()

    if line_split[-1] == "THEN":
        del line_split[-1]
    else:
        Config.Iteratables[-2].line_number += 1

    Config.Iteratables[-1].Cond = line_split
    cond = Config.Iteratables[-1].Cond
    if len(cond) == 4:
        Config.Iteratables[-1].Cond = Fun.comp(cond[1], cond[3], cond[2])

    if Config.Iteratables[-1].Cond:

        while True:

            Config.Iteratables[-2].line_number += 1
            try:
                Config.Iteratables[-2].cur_line = Config.Iteratables[
                    -2].line_list[Config.Iteratables[-2].line_number]

                line_list.append(Config.Iteratables[-2].cur_line)
                line_split = Config.Iteratables[-2].cur_line.split()

                if line_split[0] == "IF":
                    Classes.Loop_Counts.If += 1

                if line_split[0] == "ENDIF" and Classes.Loop_Counts.If == 0:
                    found_endif = True
                    del line_list[-1]
                    break

                if line_split[0] == "ELSE" and Classes.Loop_Counts.If == 0:
                    del line_list[-1]
                    break

                if line_split[0] == "ENDIF":
                    Classes.Loop_Counts.If -= 1

            except IndexError:
                pass

        Config.Iteratables[-1].line_list = line_list
        while not found_endif:
            Config.Iteratables[-2].line_number += 1
            Config.Iteratables[-2].cur_line = Config.Iteratables[-2].line_list[
                Config.Iteratables[-2].line_number]
            line_split = Config.Iteratables[-2].cur_line.split()
            if line_split[0] == "IF":
                Classes.Loop_Counts.If += 1
            if line_split[0] == "ENDIF":
                if Classes.Loop_Counts.If == 0:
                    break
                else:
                    Classes.Loop_Counts.If -= 1

    else:
        Classes.Loop_Counts.If = 1
        while not (Classes.Loop_Counts.If == 1 and line_split[0] == "ELSE"):
            Config.Iteratables[-2].line_number += 1
            Config.Iteratables[-2].cur_line = Config.Iteratables[-2].line_list[
                Config.Iteratables[-2].line_number]
            line_split = Config.Iteratables[-2].cur_line.split()
            if line_split[0] == "IF":
                Classes.Loop_Counts.If += 1
            if line_split[0] == "ENDIF":
                Classes.Loop_Counts.If -= 1
            if Classes.Loop_Counts.If == 0 and line_split[0] == "ENDIF":
                alt_lines = False
                break

        while Classes.Loop_Counts.If > 0 and line_split[
                0] != "ENDIF" and alt_lines:

            Config.Iteratables[-2].line_number += 1
            try:
                Config.Iteratables[-2].cur_line = Config.Iteratables[
                    -2].line_list[Config.Iteratables[-2].line_number]

                line_list.append(Config.Iteratables[-2].cur_line)
                line_split = Config.Iteratables[-2].cur_line.split()

                if line_split[0] == "IF":
                    Classes.Loop_Counts.If += 1
                if line_split[0] == "ENDIF":
                    Classes.Loop_Counts.If -= 1
                    del line_list[-1]

            except IndexError:
                pass
        Config.Iteratables[-1].line_list = line_list

    while Config.Iteratables[-1].line_number < len(
            Config.Iteratables[-1].line_list):
        cur_line = Config.Iteratables[-1].line_list[
            Config.Iteratables[-1].line_number]
        main(cur_line)
        Config.Iteratables[-1].line_number += 1
    del Config.Iteratables[-1]