380 likes | 675 Views
Kopa FOLLOW. Kopa FOLLOW(X) – to termināļu kopa, kas kādā sentenciālajā formā var parādīties aiz netermināļa X. Kopā FOLLOW nevar būt ε. Kopas FOLLOW veidošanas likumi. 1. Ja S - starta simbols un $ - ievada beigu pazīme, tad $ FOLLOW(S). Varam uzskatīt, ka ir jauns starta
E N D
Kopa FOLLOW(X) – to termināļu kopa, kas kādā sentenciālajā formā var parādīties aiz netermināļa X. Kopā FOLLOW nevar būt ε .
Kopas FOLLOW veidošanas likumi • 1. Ja S - starta simbols un $ - ievada beigu pazīme, tad $FOLLOW(S) Varam uzskatīt, ka ir jauns starta simbols S’ un produkcija S’S$
Kopas FOLLOW veidošanas likumi (turp.) • 2. Ja ir produkcija AB , tad visi FIRST() elementi, izņemot ε pieder FOLLOW(B). FOLLOW(B)=FOLLOW(B)(FIRST()-ε)
Kopas FOLLOW veidošanas likumi (turp.) • 3. Ja ir produkcija AB vai AB, kur • εFIRST(), tad visi FOLLOW(A) elementi pieder kopai FOLLOW(B) Ievērojiet, kaskam pieder! FOLLOW(B)=FOLLOW(B)FOLLOW(A)
Nerekursīvā paredzošā analīze Kādu produkciju kuro reizi lietot? Veidojam paredzošās analīzes tabulu. Divdimensiju masīvs M[A,a] neterminālis terminālis
Paredzošās analīzes tabulas izmantošana • Katrā brīdī tiek aplūkots simbols X steka virsotnē un tekošais ievada simbols a. • Ja X=a=$, analizators beidz darbu un paziņo par veiksmīgām darba beigām. • 2. Ja X=a≠$, analizators izņem X no steka un pārvieto ievada nolasīšanas kursoru uz nākošo simbolu.
Paredzošās analīzes tabulas izmantošana(turp.) 3. Ja X ir neterminālis, tiek aplūkots tabulas ierakstsM[X,a] . Ja ieraksts ir X produkcija, tad X steka virsotnē tiek aizvietots ar šīs produkcijas labo pusi. Ja ieraksts ir “error”, tad tiek izdots kļūdas paziņojums.
Paredzošās analīzes tabulas veidošana 1.Katrai gramatikas produkcijai A ((NT)*) tiek izpildīts 2. un 3. solis. 2.Katram terminālim a, kur aFIRST(), tabulas rūtiņā M[A,a] tiek pievienots ieraksts A . Ievērojiet, ka šeit FIRST tiek rēķināta produkcijas labajai pusei!
Paredzošās analīzes tabulas veidošana 3. Ja FIRST(), tad katram terminālim b , kur bFOLLOW(A), tabulas rūtiņā M[A,b] tiek pievienots ieraksts A . Ja FIRST(), bet $FOLLOW(A), tabulas rūtiņā M[A,$] tiek pievienots ieraksts A .
Paredzošās analīzes tabulas veidošana 4. Katru līdz šim nedefinētu tabulas rūtiņu aizpilda ar norādi uz kļūdu (“error”).
FIRST(ABA)={a,c,d} FIRST(CD)={c,d} FIRST(a)={a} FIRST(EF)={e,f,ε} FIRST(b)={b} FIRST(c)={c} FIRST(ε)={ε} FIRST(d)={d} FIRST(eE)={e} FIRST(ε)={ε} FIRST(fF)={f} FIRST(ε)={ε} • SABA • ACD • Aa • BEF • Bb • Cc • Cε • Dd • EeE • Eε • FfF • Fε
SABA • ACD • Aa • BEF • Bb • Cc • Cε • Dd • EeE • Eε • FfF • Fε FOLLOW(S)={$} FOLLOW(A)={$,a,b,c,d,e,f} FOLLOW(B)={a,c,d} FOLLOW(C)={d} FOLLOW(D)={$,a,b,c,d,e,f} FOLLOW(E)={a,c,d,f} FOLLOW(F)={a,c,d}
Steks augša Bija šāds pieraksts Turpmāk ērtāks būs šāds pieraksts
Piemērs Novērst kreiso rekursiju!
Piemērs Atrast kopas FIRST un FOLLOW!
LL(1) gramatikām nevienā rūtiņā nevar būt vairāk par vienu ierakstu