Beispiel #1
0
def main():

    global production_list, ntl, nt_list, tl, t_list

    firstfollow.main()

    print("\tFIRST AND FOLLOW OF NON-TERMINALS")
    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)
        print(nt)
        print("\tFirst:\t", firstfollow.get_first(nt))
        print("\tFollow:\t", firstfollow.get_follow(nt), "\n")

    augment_grammar()
    nt_list = list(ntl.keys())
    t_list = list(tl.keys()) + ['$']

    table = make_table(calc_states())

    print("\tLR(0) TABLE\n")
    for i, j in table.items():
        print(i, "\t", j)

    return
    def start(self):
        pl = self.text.get("1.0", END).split("\n") + ['']
        print("pl   ", pl)
        self.head.config(text="First and Follow of Non-Terminals")
        self.text.delete("1.0", END)
        self.master.geometry("700x700")
        self.cont.config(command=self.more)

        global nt_list, t_list

        firstfollow.production_list = firstfollow.main(pl)

        for nt in ntl:
            firstfollow.compute_first(nt)
            firstfollow.compute_follow(nt)
            self.text.insert(END, nt)
            self.text.insert(
                END, "\tFirst:\t{}\n".format(firstfollow.get_first(nt)))
            self.text.insert(
                END, "\tFollow:\t{}\n\n".format(firstfollow.get_follow(nt)))
        #self.text.config(state=DISABLED)

        augment_grammar()  #just make sentences into a list
        nt_list = list(ntl.keys())
        t_list = list(tl.keys()) + ['$']

        #self.text.insert(END, "{}\n".format(nt_list))
        #self.text.insert(END, "{}\n".format(t_list))
        self.text.see(END)
        self.text.config(state=DISABLED)
Beispiel #3
0
def main(inputFile):
    global production_list, ntl, nt_list, tl, t_list
    firstfollow.main(inputFile)

    print("\tFIRST AND FOLLOW OF NON-TERMINALS")
    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)
        print(nt)
        print("\tFirst:\t", firstfollow.get_first(nt))
        print("\tFollow:\t", firstfollow.get_follow(nt), "\n")

    augment_grammar()
    nt_list = list(ntl.keys())
    t_list = list(tl.keys()) + ['$']

    print(nt_list)
    print(t_list)

    j = calc_states()

    ctr = 0
    for s in j:
        print("I{}:".format(ctr))
        for i in s:
            print("\t", i)
        ctr += 1

    table = make_table(j)

    print("\n\t---- LR(1) TABLE----")
    print()

    sr, rr = 0, 0

    for i, j in table.items():
        print(i, "\t", j)
        s, r = 0, 0

        for p in j.values():
            if p != 'accept' and len(p) > 1:
                p = list(p)
                if ('r' in p[0]):
                    r += 1
                else:
                    s += 1
                if ('r' in p[1]):
                    r += 1
                else:
                    s += 1
        if r > 0 and s > 0:
            sr += 1
        elif r > 0:
            rr += 1

    print("\n", sr, "s/r conflicts |", rr, "r/r conflicts")
    stringHandler(inputFile)

    return
Beispiel #4
0
def main():

    global production_list, ntl, nt_list, tl, t_list

    firstfollow.main()

    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)

    augment_grammar()
    nt_list = list(ntl.keys())
    t_list = list(tl.keys()) + ['$']

    print(nt_list)
    print(t_list)

    j = calc_states()

    if (sys.argv[1] == 'i'):
        ctr = 0
        st = ""
        for s in j:
            st += "Item{}:".format(ctr)
            for i in s:
                st += "\t" + i + "\n"
            ctr += 1

        print("ST:")
        print(st)
        #st = "\n".join(st)
        #write_to_file = open("temp_clr_items.txt", 'w')
        #write_to_file.write(st)
        #write_to_file.close()

    elif (sys.argv[1] == 't'):
        table = make_table(j)
        sr, rr = 0, 0

        for i, j in table.items():
            s, r = 0, 0

            for p in j.values():
                if p != 'accept' and len(p) > 1:
                    p = list(p)
                    if ('r' in p[0]): r += 1
                    else: s += 1
                    if ('r' in p[1]): r += 1
                    else: s += 1
            if r > 0 and s > 0: sr += 1
            elif r > 0: rr += 1

        print("\n", sr, "s/r conflicts |", rr, "r/r conflicts")

    else:
        print("Invalid command line argument!")

    return
Beispiel #5
0
def main():

    global production_list, ntl, nt_list, tl, t_list

    firstfollow.main()

    # print("\tFIRST AND FOLLOW OF NON-TERMINALS")
    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)
        # print(nt)
        # print("\tFirst:\t", firstfollow.get_first(nt))
        # print("\tFollow:\t", firstfollow.get_follow(nt), "\n")

    augment_grammar()
    nt_list = list(ntl.keys())
    t_list = list(tl.keys()) + ['$']

    table = make_table(calc_states())

    print("\n======== TABLE ===========\n")
    # for i, j in table.items():
    # 	print(i, "\t", j)

    sys.stdout.write("\t{}\t{}\n".format('\t'.join(t_list),
                                         '\t'.join(nt_list)))

    for i, j in table.items():
        sys.stdout.write("\n{}\t".format(i))
        for sym in t_list + nt_list:
            if sym in table[i].keys():
                if type(table[i][sym]) != type(set()):
                    sys.stdout.write("{}\t".format(table[i][sym]))
                else:
                    sys.stdout.write("{}\t".format(', '.join(table[i][sym])))
            else:
                sys.stdout.write("\t")
        sys.stdout.write("\n")
        s, r = 0, 0

        for p in j.values():
            if p != 'accept' and len(p) > 1:
                p = list(p)
                if ('r' in p[0]): r += 1
                else: s += 1
                if ('r' in p[1]): r += 1
                else: s += 1
        if r > 0 and s > 0: sr += 1
        elif r > 0: rr += 1

    return
def closure(items):  #just make new produces sentences, items= closure
    print("items", items)

    def exists(newitem,
               items):  #just check if newitem is in items with same lookahead
        for i in items:
            if i == newitem and sorted(set(i.lookahead)) == sorted(
                    set(newitem.lookahead)):
                return True
        return False

    global production_list

    while True:
        flag = 0
        for i in items:

            if i.index('.') == len(i) - 1: continue

            Y = i.split('->')[1].split('.')[1][0]  #expected symbol

            if i.index('.') + 1 < len(i) - 1:
                lastr = list(
                    firstfollow.compute_first(i[i.index('.') + 2]) -
                    set(chr(1013)))

            else:
                lastr = i.lookahead

            for prod in firstfollow.production_list:
                head, body = prod.split('->')

                if head != Y: continue

                newitem = Item(Y + '->.' + body, lastr)

                if not exists(newitem, items):
                    items.append(newitem)
                    flag = 1
        if flag == 0: break
    return items
Beispiel #7
0
def closure(items):
    def exists(newitem, items):

        for i in items:
            if i == newitem and sorted(set(i.lookahead)) == sorted(
                    set(newitem.lookahead)):
                return True
        return False

    global production_list

    while True:
        flag = 0
        for i in items:

            if i.index('.') == len(i) - 1: continue

            Y = i.split('->')[1].split('.')[1][0]

            if i.index('.') + 1 < len(i) - 1:
                lastr = list(
                    firstfollow.compute_first(i[i.index('.') + 2]) -
                    set(chr(1013)))

            else:
                lastr = i.lookahead

            for prod in production_list:
                head, body = prod.split('->')

                if head != Y: continue

                newitem = Item(Y + '->.' + body, lastr)

                if not exists(newitem, items):
                    items.append(newitem)
                    flag = 1
        if flag == 0: break

    return items
Beispiel #8
0
def main():
    column_names = ["stack", "Input"]
    stack_df = pd.DataFrame(columns=column_names)
    global production_list, ntl, nt_list, tl, t_list
    user_gram = firstfollow.main()

    print("\tFIRST AND FOLLOW OF NON-TERMINALS")
    print("NTLIT IS", ntl)
    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)
        st.write("For: ", nt)
        print(nt)
        st.write("First", firstfollow.get_first(nt))
        st.write("Follow", firstfollow.get_follow(nt))

        print("\tFirst:\t", firstfollow.get_first(nt))
        print("\tFollow:\t", firstfollow.get_follow(nt), "\n")

    augment_grammar()
    nt_list = list(ntl.keys())
    t_list = list(tl.keys()) + ['$']

    print(nt_list)
    print(t_list)

    j = calc_states()

    ctr = 0
    for s in j:
        st.write("Item", ctr)
        print("Item{}:".format(ctr))
        for i in s:
            st.text(str(i))
            print("\t", i)
        ctr += 1

    table = make_table(j)
    # print("table is ", table)
    print(
        '_____________________________________________________________________'
    )
    print("\n\tCLR(1) TABLE\n")
    sym_list = nt_list + t_list
    sr, rr = 0, 0
    print(
        '_____________________________________________________________________'
    )
    print('\t|  ', '\t|  '.join(sym_list), '\t\t|')
    print(
        '_____________________________________________________________________'
    )
    listI = list()
    listJ = list()
    for i, j in table.items():
        listI.append(i)
        to_append_j = (list(
            j.get(sym, ' ') if type(j.get(sym)) in (
                str, None) else next(iter(j.get(sym, ' ')))
            for sym in sym_list))
        listJ.append(to_append_j)
        print(
            i, "\t|  ", '\t|  '.join(
                list(
                    j.get(sym, ' ') if type(j.get(sym)) in (
                        str, None) else next(iter(j.get(sym, ' ')))
                    for sym in sym_list)), '\t\t|')
        s, r = 0, 0

        for p in j.values():
            if p != 'accept' and len(p) > 1:
                p = list(p)
                if ('r' in p[0]): r += 1
                else: s += 1
                if ('r' in p[1]): r += 1
                else: s += 1
        if r > 0 and s > 0: sr += 1
        elif r > 0: rr += 1

    nt_list.insert(0, "SN")
    df_columns = nt_list + t_list
    df = pd.DataFrame(columns=df_columns)

    for i in range(len(listJ)):
        listJ[i].insert(0, i)
        df.loc[len(df)] = listJ[i]

    st.title("CLR1 Table")
    st.dataframe(df)
    df.to_csv("check.csv")

    print(
        '_____________________________________________________________________'
    )
    st.write(sr, "S/R conflicts")
    st.write(rr, "R/R Conficlts")
    print("\n", sr, "s/r conflicts |", rr, "r/r conflicts")
    print(
        '_____________________________________________________________________'
    )
    print("Enter the string to be parsed")

    Input = user_gram + '$'
    print("printinf this", Input)
    st.write("Input string to be parsed is", Input)

    try:
        stack = ['0']
        a = list(table.items())

        print("productions\t:", production_list)

        import json
        jsonString = json.dumps(production_list)
        st.text("The Prodcution rule is: ")
        st.write(jsonString)
        # st.write(json.dumps(jsonString))
        print('stack', "\t \t\t \t", 'Input')

        s = ''.join(str(v) for v in stack)
        new_stack = []
        new_stack.append(s)
        stack_df.at[0, 'stack'] = (new_stack)
        # print("new stack is", new_stack)

        i = ''.join(str(v) for v in Input)
        new_input = []
        new_input.append(i)
        stack_df.at[0, 'Input'] = (new_input)
        # print("new input is", new_input)

        print(*stack, "\t \t\t \t", *Input, sep="")
        i_counter = 1
        j_counter = 1
        while (len(Input) != 0):
            b = list(a[int(stack[-1])][1][Input[0]])
            if (b[0][0] == "s"):
                #s=Input[0]+b[0][1:]
                stack.append(Input[0])
                stack.append(b[0][1:])
                Input = Input[1:]

                s = ''.join(str(v) for v in stack)
                new_stack = []
                new_stack.append(s)
                stack_df.at[i_counter, 'stack'] = (new_stack)
                print("new stack is", new_stack)

                i = ''.join(str(v) for v in Input)
                new_input = []
                new_input.append(i)
                stack_df.at[j_counter, 'Input'] = (new_input)
                print("new input is", new_input)

                print(*stack, "\t \t\t \t", *Input, sep="")
                i_counter = i_counter + 1
                j_counter = j_counter + 1

            elif (b[0][0] == "r"):
                s = int(b[0][1:])
                #print(len(production_list),s)
                l = len(production_list[s]) - 3
                #print(l)
                prod = production_list[s]
                l *= 2
                l = len(stack) - l
                stack = stack[:l]
                s = a[int(stack[-1])][1][prod[0]]
                #print(s,b)
                stack += list(prod[0])
                stack.append(s)

                s = ''.join(str(v) for v in stack)
                new_stack = []
                new_stack.append(s)
                stack_df.at[i_counter, 'stack'] = (new_stack)
                print("new stack is", new_stack)

                i = ''.join(str(v) for v in Input)
                new_input = []
                new_input.append(i)
                stack_df.at[i_counter, 'Input'] = (new_input)
                print("new input is", new_input)

                print(*stack, "\t \t\t \t", *Input, sep="")
                i_counter = i_counter + 1
                j_counter = j_counter + 1
            elif (b[0][0] == "a"):
                st.write("String Accepted.")
                print("\n\tString Accepted\n")
                break
    except:
        print('\n\tString INCORRECT for given Grammar!\n')
        st.write("String INCORRECT for given Grammar")
    st.title("Parsing Table for CLR Parser")
    stack_df.to_csv("stack.csv")
    st.dataframe(stack_df)
    return
Beispiel #9
0
def main():

    global production_list, ntl, nt_list, tl, t_list    

    firstfollow.main()

    print("\tFIRST AND FOLLOW OF NON-TERMINALS")
    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)
        print(nt)
        print("\tFirst:\t", firstfollow.get_first(nt))
        print("\tFollow:\t", firstfollow.get_follow(nt), "\n")  
    

    augment_grammar()
    nt_list=list(ntl.keys())
    t_list=list(tl.keys()) + ['$']

    print(nt_list)
    print(t_list)

    j=calc_states()

    ctr=0
    for s in j:
        print("Item{}:".format(ctr))
        for i in s:
            print("\t", i)
        ctr+=1

    table=make_table(j)
    print('_____________________________________________________________________')
    print("\n\tCLR(1) TABLE\n")
    sym_list = nt_list + t_list
    sr, rr=0, 0
    print('_____________________________________________________________________')
    print('\t|  ','\t|  '.join(sym_list),'\t\t|')
    print('_____________________________________________________________________')
    for i, j in table.items():
            
        print(i, "\t|  ", '\t|  '.join(list(j.get(sym,' ') if type(j.get(sym))in (str , None) else next(iter(j.get(sym,' ')))  for sym in sym_list)),'\t\t|')
        s, r=0, 0

        for p in j.values():
            if p!='accept' and len(p)>1:
                p=list(p)
                if('r' in p[0]): r+=1
                else: s+=1
                if('r' in p[1]): r+=1
                else: s+=1      
        if r>0 and s>0: sr+=1
        elif r>0: rr+=1
    print('_____________________________________________________________________')
    print("\n", sr, "s/r conflicts |", rr, "r/r conflicts")
    print('_____________________________________________________________________')
    print("Enter the string to be parsed")
    Input=input()+'$'
    try:
        stack=['0']
        a=list(table.items())
        '''print(a[int(stack[-1])][1][Input[0]])
        b=list(a[int(stack[-1])][1][Input[0]])
        print(b[0][0])
        print(a[0][1]["S"])'''
        print("productions\t:",production_list)
        print('stack',"\t \t\t \t",'Input')
        print(*stack,"\t \t\t \t",*Input,sep="")
        while(len(Input)!=0):
            b=list(a[int(stack[-1])][1][Input[0]])
            if(b[0][0]=="s" ):
                #s=Input[0]+b[0][1:]
                stack.append(Input[0])
                stack.append(b[0][1:])
                Input=Input[1:]
                print(*stack,"\t \t\t \t",*Input,sep="")
            elif(b[0][0]=="r" ):
                s=int(b[0][1:])
                #print(len(production_list),s)
                l=len(production_list[s])-3
                #print(l)
                prod=production_list[s]
                l*=2
                l=len(stack)-l
                stack=stack[:l]
                s=a[int(stack[-1])][1][prod[0]]
                #print(s,b)
                stack+=list(prod[0])
                stack.append(s)
                print(*stack,"\t \t\t \t",*Input,sep="")
            elif(b[0][0]=="a"):
                print("\n\tString Accepted\n")
                break
    except:
        print('\n\tString INCORRECT for given Grammar!\n')
    return 
def main():

    global production_list, ntl, nt_list, tl, t_list

    firstfollow.main()

    print("\tFIRST AND FOLLOW OF NON-TERMINALS")
    for nt in ntl:
        firstfollow.compute_first(nt)
        firstfollow.compute_follow(nt)
        print(nt)
        print("\tFirst:\t", firstfollow.get_first(nt))
        print("\tFollow:\t", firstfollow.get_follow(nt), "\n")

    augment_grammar()
    nt_list = list(ntl.keys())
    t_list = list(tl.keys()) + ['$']

    print(nt_list)
    print(t_list)

    j = calc_stateslalr1()

    ctr = 0
    for s in j:
        print("Item{}:".format(ctr))
        for i in s:
            print("\t", i)
        ctr += 1

    table = make_tablelalr1(j)
    print("table ")

    print("\n\tCLR(1) TABLE\n")

    sr, rr = 0, 0

    for i, j in table.items():
        print(i, "\t", j)
        s, r = 0, 0

        for p in j.values():
            if p != 'accept' and len(p) > 1:
                p = list(p)
                if ('r' in p[0]): r += 1
                else: s += 1
                if ('r' in p[1]): r += 1
                else: s += 1
        if r > 0 and s > 0: sr += 1
        elif r > 0: rr += 1

    print("\n", sr, "s/r conflicts |", rr, "r/r conflicts")

    # sys.stdout.write('.')
    sys.stdout.write("\t{}\t{}\n".format('\t'.join(t_list),
                                         '\t'.join(nt_list)))

    for i, j in table.items():
        sys.stdout.write("\n{}\t".format(i))
        for sym in t_list + nt_list:
            if sym in table[i].keys():
                if type(table[i][sym]) != type(set()):
                    sys.stdout.write("{}\t".format(table[i][sym]))
                else:
                    sys.stdout.write("{}\t".format(', '.join(table[i][sym])))
            else:
                sys.stdout.write("\t")
        sys.stdout.write("\n")
        s, r = 0, 0

        for p in j.values():
            if p != 'accept' and len(p) > 1:
                p = list(p)
                if ('r' in p[0]): r += 1
                else: s += 1
                if ('r' in p[1]): r += 1
                else: s += 1
        if r > 0 and s > 0: sr += 1
        elif r > 0: rr += 1

    return
Beispiel #11
0
def main(lip, nn, tables):
    if nn == 0:
        global production_list, ntl, nt_list, tl, t_list
        firstfollow.main(lip)

        li = []
        li.append("\tFIRST AND FOLLOW OF NON-TERMINALS")
        for nt in ntl:
            firstfollow.compute_first(nt)
            firstfollow.compute_follow(nt)
            li.append(nt)
            s = str("\tFirst:\t")
            s = s + str(firstfollow.get_first(nt))
            li.append(s)
            s = str("\tFollow:\t")
            s = s + str(firstfollow.get_follow(nt))
            li.append(s)

        file = open(
            "C:\\Users\\himanshu\\PycharmProjects\\pythonProject\\first_follow.txt",
            'w')
        for ele in li:
            file.write(ele + '\n')

        file.close()

        li = []
        augment_grammar()
        nt_list = list(ntl.keys())
        t_list = list(tl.keys()) + ['$']

        print(nt_list)
        print(t_list)

        j = calc_states()

        ctr = 0
        for s in j:
            s = str("Item{}:".format(ctr))
            for i in s:
                s = s + str("\t")
                s = s + str(i)
            li.append(s)
            ctr += 1

        file = open(
            "C:\\Users\\himanshu\\PycharmProjects\\pythonProject\\item.txt",
            'w')
        for ele in li:
            file.write(ele + '\n')

        file.close()

        files = open(
            "C:\\Users\\himanshu\\PycharmProjects\\pythonProject\\table.txt",
            'w')

        table = make_table(j)
        print(
            '+--------+-----------------------------------------------------+-------------------+',
            file=files)
        print(
            "|       |           GOTO       |                       ACTION                      |",
            file=files)
        sym_list = nt_list + t_list
        sr, rr = 0, 0
        print(
            '+--------+-----------------------------------------------------+-------------------+',
            file=files)
        print('|\t|  ', '\t|  '.join(sym_list), '\t\t  |', file=files)
        for i, j in table.items():

            print("|",
                  i,
                  "\t|",
                  "  \t|  ".join(
                      list(
                          j.get(sym, ' ') if type(j.get(sym)) in (
                              str, None) else next(iter(j.get(sym, ' ')))
                          for sym in sym_list)),
                  "\t\t  |",
                  file=files)

            s, r = 0, 0

            for p in j.values():
                if p != 'ac' and len(p) > 1:
                    p = list(p)
                    if ('r' in p[0]):
                        r += 1
                    else:
                        s += 1
                    if ('r' in p[1]):
                        r += 1
                    else:
                        s += 1
            if r > 0 and s > 0:
                sr += 1
            elif r > 0:
                rr += 1
        print(
            '+--------+-----------------------------------------------------+-------------------+',
            file=files)
        print(sr, "s/r conflicts |", rr, "r/r conflicts", file=files)

        print(
            '+--------+-----------------------------------------------------+-------------------+',
            file=files)

        files.close()
        return table

    files = open(
        "C:\\Users\\himanshu\\PycharmProjects\\pythonProject\\stack.txt", 'w')
    Input = nn + '$'
    try:
        stack = ['0']
        a = list(tables.items())
        '''print(a[int(stack[-1])][1][Input[0]])
        b=list(a[int(stack[-1])][1][Input[0]])
        print(b[0][0])
        print(a[0][1]["S"])'''
        print("productions\t:", production_list)
        print('stack', "\t \t\t \t", 'Input', file=files)
        for i in stack:
            files.write(i + "\t\t\t\t" + Input + "\n")

        while (len(Input) != 0):
            b = list(a[int(stack[-1])][1][Input[0]])
            if (b[0][0] == "s"):
                # s=Input[0]+b[0][1:]
                stack.append(Input[0])
                stack.append(b[0][1:])
                Input = Input[1:]
                for i in stack:
                    files.write(i)
                files.write("\t\t\t\t" + Input + "\n")

            elif (b[0][0] == "r"):
                s = int(b[0][1:])
                # print(len(production_list),s)
                l = len(production_list[s]) - 3
                # print(l)
                prod = production_list[s]
                l *= 2
                l = len(stack) - l
                stack = stack[:l]
                s = a[int(stack[-1])][1][prod[0]]
                # print(s,b)
                stack += list(prod[0])
                stack.append(s)
                for i in stack:
                    files.write(i)
                files.write("\t\t\t\t" + Input + "\n")

            elif (b[0][0] == "a"):
                print("\n\tString Accepted\n", file=files)
                break
    except:
        print('\n\tString INCORRECT for given Grammar!\n', file=files)

    files.close()
    return