Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- productions=[]
- tempProd=[]
- nterminals=[]
- extra=[]
- first={}
- follow={}
- # n = int(input("Number of Grammers: "))
- # for i in range (0,n):
- # g= input("")
- # a=g[3:].split("|")
- # for j in a:
- # productions.append(g[:3]+j)
- # productions=["P->i","P->c","P->nTs","Q->P","Q->aS","Q->bSc","R->b","R->$","S->c","S->Rn","S->$","T->RSq",]
- # productions=["E->TX","X->+TX","X->$","T->FY","Y->*FY","Y->$","F->(E)","F->i",]
- # productionsFollow=["E->TX","X->+TX","X->$","T->FY","Y->*FY","Y->$","F->(E)","F->i",
- productions=["S->(A)","S->$","A->TE","E->&TE","E->$","T->(A)","T->a","T->b","T->c",]
- # productions=["X->a","X->$","Y->b","Y->$","Z->c","Z->$","A->XYZ",]
- # productions=["X->a","X->$","Y->b","Y->$","Z->c","Z->$","A->XYZ",]
- tempProd=["S->(A)","S->$","A->TE","E->&TE","E->$","T->(A)","T->a","T->b","T->c",]
- #sort lowercase first
- print("Sorting")
- productions.sort(key=lambda p: p[3].lower())
- [print(i) for i in productions]
- print("\nNon Terminals:")
- for i in productions:
- if i[0] not in nterminals:
- nterminals.extend(i[0])
- [print(i) for i in nterminals]
- print("\nInitial Dictionaries:")
- for i in range(0,len(nterminals)):
- first[nterminals[i]]=[]
- [print(f"{i}:{j}") for i,j in first.items()]
- #for terminal symbols
- for i in range(0,len(nterminals)):
- for j in range(0,len(productions)):
- if nterminals[i]==productions[j][0]:
- if((productions[j][3].isupper()==False) or productions[j][3]=="$"):
- first[nterminals[i]].extend(productions[j][3])
- print("\nAfter appending terminals:")
- [print(f"{i}:{j}") for i,j in first.items()]
- #List out productions starting with a Non-Terminal
- print("productions starting with a Non-Terminal")
- [extra.append(i) for i in productions if i[3].isupper()]
- [print(i) for i in extra]
- for i in range(0,len(extra)):
- for j in extra[i][3:]:
- if j.isupper():
- if '$' in first[j]:
- first[j].remove('$')
- first[extra[i][0]].extend(first[j])
- first[j].extend('$')
- elif '$' not in first[j]:
- first[extra[i][0]].extend(first[j])
- break
- elif j.isupper()==False:
- first[extra[i][0]].extend(j)
- break
- #To Uniquely Identify
- for i in first.keys():
- first[i]=list(set(first[i]))
- print("\nFirst FUnction:")
- [print(f"First({i})={j}") for i,j in first.items()]
- #--------------------------------FOLLOW FUNCTION-----------------------
- print("\n\nInitial Follow Dictionary:")
- for i in range(0,len(nterminals)):
- follow[nterminals[i]]=[]
- [print(f"{i}:{j}") for i,j in follow.items()]
- print("\nNon Terminal:")
- for i in nterminals:
- print(i)
- print("\nProduction:")
- for i in tempProd:
- print(i)
- print("Main Follow:")
- # for i in range(0,len(tempProd)): # productions[i]
- # for j in range(0,len(nterminals)): #nterminals[j]
- # for k in tempProd[i][3:]:
- # if k.isupper():
- temp=0
- for i in range(0,len(tempProd)): # productions[i]
- flag=0
- for k in tempProd[i][3:]:
- print(k)
- if k.isupper()==False and flag==1:
- print(k)
- print(temp)
- follow[temp].extend(k)
- break
- #follow[k-1].append(k)
- if k.isupper():
- temp=k
- flag=1
- print("\n")
- #To Uniquely Identify
- for i in follow.keys():
- follow[i]=list(set(follow[i]))
- print("\nFollw FUnction:")
- [print(f"First({i})={j}") for i,j in follow.items()]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement