Deterministick SA zhora nadol Gramatiky a jazyky LLk

  • Slides: 50
Download presentation
Deterministická SA zhora nadol Gramatiky a jazyky LL(k) a ich analýza

Deterministická SA zhora nadol Gramatiky a jazyky LL(k) a ich analýza

Gramatiky LL(k) n n Umožňujú deterministickú SA Umožňuje deterministickú SA zhora nadol – robí

Gramatiky LL(k) n n Umožňujú deterministickú SA Umožňuje deterministickú SA zhora nadol – robí sa teda ľavá derivácia Cena za determinizmus je vyjadrená potrebou poznať ďalších k symbolov zo vstupu za práve vyšetrovaným symbolom Na základe tohoto – tzv. vopred prezretého reťazca pozostávajúceho z najviac k nasledujúcich symbolov dokáže rozšriešiť problém výberu zodpovedajúcej alternatívy pravej strany pravidla

Funkcia FIRST Umožňuje určiť množinu reťazcov danej dľžky, ktoré možno generovať z VF, ktorá

Funkcia FIRST Umožňuje určiť množinu reťazcov danej dľžky, ktoré možno generovať z VF, ktorá je jej argumentom n Nech G = (N, T, P, S) je BKG, k je celé kladné číslo, (N T )*. Potom pre G je FIRSTk ( ) = { w / w T*, |w| k a *w, alebo |w| = k a *wx pre nejaké x} Funckia FIRSTk ( ) dáva teda množinu všetkých terminálnych reťazcov, ktoré možno derivovať z a ich dĺžka je menšia ako k, alebo tvoria prefix dĺžky k VF, ktorú možno derivovať z . n

Gramatika LL(k) df BKG G = (N, T, P, S) je LL(k) ak pre

Gramatika LL(k) df BKG G = (N, T, P, S) je LL(k) ak pre každé dve ľavé derivácie tvaru S *w. A w *wx S *w. A w *wy Pre ktoré ak FIRSTk (x ) = FIRSTk (y ) tak =

Poznámky k definícii n n n Definícia hovorí, že ak je „ďalších k symbolov“

Poznámky k definícii n n n Definícia hovorí, že ak je „ďalších k symbolov“ rovnakých, musí existovať iba jedna laternatíva pravej strany pravidla pre A. Budeme hovoriť, že BKG je LL, ak je LL(k) pre nejaké k Budeme hovoriť, že jazyk je LL ak ho možno špecifikovať gramatikou LL(k) pre nejaké k

Od derivácií k pravidlám G Uvedená definícia LL gramatiky je príliš všeobecná na praktické

Od derivácií k pravidlám G Uvedená definícia LL gramatiky je príliš všeobecná na praktické využitie – je nereálne vyšetrovať všetky ľavé derivácie n Snahou je určiť vlastnosti LL gramatiky z jej pravidiel n Dopracujeme sa k tomu postupne n

Vlastnosť LL a ľavé VF BKG G = (N, T, P, S) je LL(k)

Vlastnosť LL a ľavé VF BKG G = (N, T, P, S) je LL(k) ak pre každé dve rôzne pravidlá z P A a všetky ľavé VF w. A platí FIRSTk ( ) = n

Od jednoduchých gramatík BKG G = (N, T, P, S) bez e-pravidiel nazývame jednoduchá

Od jednoduchých gramatík BKG G = (N, T, P, S) bez e-pravidiel nazývame jednoduchá LL(1) ak pre každý neterminál A sa všetky jeho alternatívy začínajú rôznymi terminálnymi symbolmi n BKG G = (N, T, P, S) bez e-pravidiel je LL(1) ak pre všetky neterminály z N a zodpovedajúce pravidlo z P A 1 | 2 |. . . | n Platí FIRST 1( i ) FIRST 1( j ) = pre i j n

Ošetrenie e-pravidiel n Nech G = (N, T, P, S) je BKG, k je

Ošetrenie e-pravidiel n Nech G = (N, T, P, S) je BKG, k je celé kladné číslo, (N T )*. Potom pre G je FOLLOWk ( ) = { w / S * , w FIRSTk( ) }

Rozšírenie FIRST a FOLLOW Funkcie FIRST a FOLLOW možno rozšíriť na množiny takto n

Rozšírenie FIRST a FOLLOW Funkcie FIRST a FOLLOW možno rozšíriť na množiny takto n Nech G = (N, T, P, S) je BKG a M (N T)*. Potom n FIRSTk(M) = {w / w FIRSTk( ), pre nejaké M } n FOLLOWk(M) = {w / w FOLLOWk( ), pre nejaké M } n

LL(1) G BKG G = (N, T, P, S) je LL(1) práve vtedy, ak

LL(1) G BKG G = (N, T, P, S) je LL(1) práve vtedy, ak pre každé dve pravidlá z P n A a. A pričom platí, že FIRST 1 ( FOLLOW 1(A) ) = n Silná LL(k) gramatika – uvedená vlastnosť platí pre ľubovolné celé k.

Podmienky pre LL(1) BKG G = (N, T, P, S) je LL(1) práve vtedy,

Podmienky pre LL(1) BKG G = (N, T, P, S) je LL(1) práve vtedy, ak pre všetky neterminály A a zodpovedajúce pravidlá A 1 | 2 |. . . | n platí: 1. Ak i *w, w T+, j *u, u T+, tak FIRST 1( i ) FIRST 1( j ) = pre 1 i, j n, i j. Podmienka FIRST-FIRST 2. Ak i *e, t. j. e FIRST 1( i ) pre niektoré i, potom FIRST 1( j ) FOLLOW 1(A ) = pre 1 j n, i j Podmienka FIRST-FOLLOW

Niektoré vlastnosti LL gramatík Zľava rekurzívna G nie je LL(k) pre žiadne k n

Niektoré vlastnosti LL gramatík Zľava rekurzívna G nie je LL(k) pre žiadne k n Ak G 1 a G 2 sú LL(k), potom je rozhodnuteľné, či sú ekvivaletné, teda či L(G 1) = L(G 2) n

Transformácia LL(k) gramatík Motív transformácie je hľadanie ekvivalentnej LL(k) gramatiky s čo najmenším k

Transformácia LL(k) gramatík Motív transformácie je hľadanie ekvivalentnej LL(k) gramatiky s čo najmenším k – zvyčajne k = 1. n Postup – cez odstraňovanie negatívnych vlastností n Gramatiky programovacích jazykov to zvyčajne umožňujú. n Najčastejšie sa používajú dve transformácie - odstránenie ľavej rekurzie - faktorizácia Tieto transformácie zvyčajne postačujú n

Odstránenie ľavej rekurzie n n Gramatika je rekurzívna – zľava / sprava, ak obsahuje

Odstránenie ľavej rekurzie n n Gramatika je rekurzívna – zľava / sprava, ak obsahuje aspoň jeden neterminál rekurzívny – zľava /sprava Neterminál A z G je rekurzívny, ak existuje derivácia A + A pre nejaké , (N T )*, pričom , nemôžu byť súčasne prázdne. Ak je prázdne , A je zľava rekurzívny, ak , tak sprava. Samozrejme, že hľadáme ekvivaletnú gramatiku Odstránenie ľavej rekurzie je známe z úpravy gramatiky na Greibachovej normálny tvar

Pravidlá transformácie Nech G = (N, T, P, S) je BKG, v ktorej A

Pravidlá transformácie Nech G = (N, T, P, S) je BKG, v ktorej A A 1 | A 2 |. . . | A n | 1| 2 |. . . | m sú všetky pravidlá v P s neterminálom A na ľavej strane a žiadne i pre i= 1, 2, . . . , m nezačína neterminálom A. Potom gramatika G’ = (N {A ’}, T, P’, S) , v ktorej uvedené pravidlá nahradíme pravidlami A 1| 2 |. . . | m | 1 A’| 2 A’|. . . | m A’ A’ 1 | 2 |. . . | n | 1 A’| 2 A’|. . . | n. A’ je s G ekvivalentná, teda L(G’) = L(G)

Poznámky k transformácii Uvedená transformácia odstraňuje ľavú rekurziu n Uvedená transformácia neodstraňuje rekurziu –

Poznámky k transformácii Uvedená transformácia odstraňuje ľavú rekurziu n Uvedená transformácia neodstraňuje rekurziu – ak G obsahuje rekurziu, tak zodpovedajúci jazyk je nekonečný a rekurzia je jediný spôsob jeho špecifikácie n Rekurziu nemožno zamieňať s cyklom (A + A) n

Príklad Majme gramatiku G: G = ({E, T, F}, {+, *, a, (, )

Príklad Majme gramatiku G: G = ({E, T, F}, {+, *, a, (, ) }, P, E) P: E E + T |T T T*F|F F (E)|a Ľahko vidieť, že G je zľava rekurzívna E E+T, T T*F Urobíme transformáciu.

Príklad – transformácia G E E + T |T E’ E’ + T |

Príklad – transformácia G E E + T |T E’ E’ + T | +T E’ T T*F|F T F | F T’ T’ * F | * F T’ F (E)|a E E + T |T T T*F|F F (E)|a

Poznámky k transformácii n n n Gramatika s tranformovanými pravidlami nie je zľava rekurzívna

Poznámky k transformácii n n n Gramatika s tranformovanými pravidlami nie je zľava rekurzívna Je LL(k) ? Je LL(1) ? Že nie je LL(1) vidieť už na prvý pohľad, lebo má pravidlá, ktoré začínajú rovnakým terminálom Vidíme, že viaceré pravidlá majú spoločný prefix. Jeho odstránenie umožňuje faktorizácia

Faktorizácia Nech G = (N, T, P, S) je BKG, v ktorej PA =

Faktorizácia Nech G = (N, T, P, S) je BKG, v ktorej PA = { A 1 | 2 |. . . | n } je podmnožina A – pravidiel, ktorých pravá strana má spoločný prefix , e. Potom gramatika G’ = (N {A ’}, T, P’, S) , kde P’ = P - PA { A A’, A’ 1 | 2 |. . . | n } a A’ je neterminálny symbol je s G ekvivalentná, L(G’) = L(G)

Poznámky Interpretáciu faktorizácie si ľahko možno zapamätať, ak s pravidlom urobíme jednoduchú matematickú operáciu

Poznámky Interpretáciu faktorizácie si ľahko možno zapamätať, ak s pravidlom urobíme jednoduchú matematickú operáciu „vyňatia pred zátvorku“ n A 1 | 2 |. . . | n n A ( 1 | 2 |. . . | n) n A A’ n A’ 1 | 2 |. . . | n n

Príklad Vrátime sa ku gramatike v ktorej odstránili ľavú rekurziu. Zoberme iba pravidlá E

Príklad Vrátime sa ku gramatike v ktorej odstránili ľavú rekurziu. Zoberme iba pravidlá E T |T E’ E T E’’ E’ | e E’ + T | +T E’ E’ +T E’’’ E’ | e n

Poznámky n n n Gramatiku po fakturizácii možno zjednodušiť, keďže viaceré pravidlá majú rovnakú

Poznámky n n n Gramatiku po fakturizácii možno zjednodušiť, keďže viaceré pravidlá majú rovnakú pravú stranu (sú rovnako definoané) Možno to urobiť jednoduchou substitúciou Okrem uvedených dvoch transformácií sú aj ďalšie, ale tými sa zaoberať nebudeme. Pre programovacie jazyky vystačíme s uvedenými pravidlami

Príklad – zednodušenie pravidiel n 1. 2. 3. 4. 5. 6. 7. 8. Gramatika:

Príklad – zednodušenie pravidiel n 1. 2. 3. 4. 5. 6. 7. 8. Gramatika: E T E’ E’ + T E’ E’ e T F T’ T’ * F T’ T’ e F (E) F a

Syntaktická analýza pre LL gramatiky n n Ide o SA zhora nadol – hovoríme

Syntaktická analýza pre LL gramatiky n n Ide o SA zhora nadol – hovoríme tiež o vetnom rozbore (zhora nadol) Modelom je ZA – ale deterministický Keďže stav ZA (je iba 1) nemal vplyv na rozhodovaní „čo robiť“, ZA automat, ako model, sa reprezentuje formou procedúry – algoritmu a hovoríme o algoritme rozboru Vzhľadom na podmienenosť determinizmu znalosťou ďalších k symbolov zo vstupu, algortimus sa nazýva k-prediktívny algoritmus rozboru A

Reprezentácia algoritmu rozboru Reprezentácia vychádza zo ZA a používa: n Vopred prezretý reťazec u

Reprezentácia algoritmu rozboru Reprezentácia vychádza zo ZA a používa: n Vopred prezretý reťazec u n vstupný a výstupný reťazec n Zásobník Z : N T { } - je začiatočný symbol n Riadiacu tabuľku M – reprezentuje zo ZA n Konfiguráciu algoritmu – na opis činnosti n

Riadiaca tabuľka M: Z x T*k {( , i), vylúčenie, prijatie, chyba} Kde (N

Riadiaca tabuľka M: Z x T*k {( , i), vylúčenie, prijatie, chyba} Kde (N T )* i je číslo pravidla s pravou stranou vylúčenie znamená – vylúčenie vrchu zásobníka prijatie znamená úspešné ukončenie analýzy chyba znamená neúspečné ukončenie analýzy

Konfigurácia Pod konfiguráciou prediktívneho algoritmu rozboru sa rozumie trojica ( x, X , )

Konfigurácia Pod konfiguráciou prediktívneho algoritmu rozboru sa rozumie trojica ( x, X , ) Kde x je doteraz nespracovaná časť vstupu, X je obsah zásobníka – X je vrchný symbol zasobníka je doterajší výstup – postupnosť pravidiel (čísel) použitých v ľavej derivácii doteraz spracovanej časti vstupu n

Činnosť n n 1. 2. 3. 4. Opisuje sa pomocou relácie prechodu Používa vopred

Činnosť n n 1. 2. 3. 4. Opisuje sa pomocou relácie prechodu Používa vopred prezretý reťazec u ( x, X , ) ( x, , i ) ak M(X, u)= ( , i) ( ax, a , ) ( x, , ) ak M(X, u)= vylúčenie (e, , ) konfigurácia prijatia M( , e) = prijatie (x, X , ) chybová konfigurácia ak M(X, u) = chyba

Stupeň relácie prechodu, uzávery Stupeň a uzávery relácie prechodu sú definované rovnako pri ZA

Stupeň relácie prechodu, uzávery Stupeň a uzávery relácie prechodu sú definované rovnako pri ZA n Začiatočná konfigurácia: (w, S , e) n Koncová konfigurácia: (e, , ) n Rozpoznanie: (w, S , e) * (e, , ) potom je ľavým rozborom n Zápis: A(w) = n

Syntaktická analýza pre LL(1) G – konštrukcia Vstup: LL(1) gramatika G = (N, T,

Syntaktická analýza pre LL(1) G – konštrukcia Vstup: LL(1) gramatika G = (N, T, P, S) s očíslovanými pravidlami Výstup: tabuľka rozboru M 1. Ak A P s číslom i, potom M(A, a) = ( , i) pre všetky a e, ktoré sú z FIRST 1( ). Ak e FIRST 1( ), tak 2. M(A, b) =( , i) pre všetky b FOLLOW 1(A) M(x, x) = vylúčenie pre všetky x T 3. M( , e) = prijatie 4. M(X, x) = chyba vo všetkých ostatných prípadoch X N T { }, x N {e}

Príklad n 1. 2. 3. 4. 5. 6. 7. 8. Vrátime sa zase ku

Príklad n 1. 2. 3. 4. 5. 6. 7. 8. Vrátime sa zase ku gramatike, ktorú sme transformovali na LL(1) E T E’ E’ + T E’ E’ e T F T’ T’ * F T’ T’ e F (E) F a

Zdôvodnenie E: FIRST 1(T E’) = {}. T E’ FT’E’ (E)T’E’ teda “(“ je

Zdôvodnenie E: FIRST 1(T E’) = {}. T E’ FT’E’ (E)T’E’ teda “(“ je v {} a. T’E’ teda aj “a” je v {} FIRST 1(T E’) = {(, a} preto M(E, () = (TE’, 1) M(E, a) = (TE’, 1) n

Zdôvodnenie Cont E’: máme 2 pravidlá: E’ + T E’ FIRST 1(+T E’) =

Zdôvodnenie Cont E’: máme 2 pravidlá: E’ + T E’ FIRST 1(+T E’) = {+} E’ e FIRST 1(e) = {e} musíme preto vyčísliť FOLLOW 1(E’) E TE’ teda tam patrí „e“ (prvý symbol za E’) E T E’ FT’E’ (E)T’E’ (TE’)T’E’ teda tam patrí aj “)” (znova prvý symbol za E’) FOLLOW 1(E’) = {e, )} Analogicky zvyšok.

Výpočet hodnoty funkcie FIRST Aj teraz budeme hľadať konštruktívny výpočet na základe pravidiel gramatiky

Výpočet hodnoty funkcie FIRST Aj teraz budeme hľadať konštruktívny výpočet na základe pravidiel gramatiky n Najprv si zavedieme funkciu „sčítania“ reťazcov ⊕k n Využijeme obmedzenie dĺžky výsledného reťazca na dĺžku k. Preto aj operátor bude mať index udávajúci dĺžku výsledného reťazca n

Operácia ⊕ Nech T je množina terminálnych symbolov a L 1 T*, L 2

Operácia ⊕ Nech T je množina terminálnych symbolov a L 1 T*, L 2 T*. Potom nad L 1 a L 2 operáciu ⊕k definujeme nasledujúcim spôsobom: L 1 ⊕k L 2 = {w / w = xy ak | xy | k inak w pozostáva z prvých k symbolov reťazca xy, pre nejaké x L 1 a y L 2 } n

Vzťah funkcie FIRST a operácie ⊕k Ak G = (N, T, P, S) je

Vzťah funkcie FIRST a operácie ⊕k Ak G = (N, T, P, S) je BKG a , (N T)* Potom FIRSTk( ) = FIRSTk( ) ⊕k FIRSTk( ) Poznámka: Práve uvedenú vlastnoť funkcie FIRST a operácie ⊕k využívame na výpočet hodnoty funkcie FIRST

Výpočet hodnoty funkcie FIRST Vstup: BKG G = (N, T, P, S) a reťazec

Výpočet hodnoty funkcie FIRST Vstup: BKG G = (N, T, P, S) a reťazec , pričom ho budeme písať v tvare X 1 X 2. . . Xn Výstup: FIRSTk( ) Postup: Predpoklad FIRSTk( ) = FIRSTk(X 1) ⊕k. FIRSTk(X 2) ⊕k. . . ⊕k FIRSTk(Xn) Dôsledok: ak Xi T {e} tak FIRSTk(Xi) = {Xi} V ďalšom skrátime zápis FIRSTk iba na F

Postup výpočtu 1. 2. 3. 4. Fi(a) = {a} pre všetky a T, i

Postup výpočtu 1. 2. 3. 4. Fi(a) = {a} pre všetky a T, i 0 F 0(A) = {x / x T*k a v P existuje pravidlo A x pre ktoré je | x | = k , alebo | x | k a = e} Predpokladajme, že F 0, F 1, . . . , Fi-1 je spočítané pre všetky A N. Potom Fi(A) = Fi-1(A) {x / A Y 1 Y 2 … Yn P a x Fi-1(Y 1) ⊕k Fi-1(Y 2) ⊕k … ⊕k Fi-1(Yn) } Pretože Fi-1(A) Fi(A) T*k pre všetky A a i, musíme v konečnom dôsledku prísť k takému i, že Fi-1(A) = Fi(A) pre veštky A N. Potom FIRSTk(A) = Fi(A)

Príklad Zoberme znova gramatiku, ktorú sme transformovali na LL(1) E T E’ E’ +

Príklad Zoberme znova gramatiku, ktorú sme transformovali na LL(1) E T E’ E’ + T E’ | e T F T’ T’ * F T’ | e F (E)|a n

Postup pre i= 3 F 3(X) = F 2(X) preto FIRST 1(E) = {

Postup pre i= 3 F 3(X) = F 2(X) preto FIRST 1(E) = { (, a } FIRST 1(E’) = { +, e } FIRST 1(T) = { (, a } FIRST 1(T’) = { *, e } FIRST 1(F) = { (, a }

OK

OK