430 likes | 613 Views
Prekladová a atribútová gramatika. Prekladov é gramatiky. Vychádzajú z predpokladov: Jednoduchej SDTS Každé pravidlo má tvar: A x 0 B 1 x 1 ... B n x n , y 0 B 1 y 1 …B n y n , Množiny vstupných a výstupných symbolov sú di s junktné T D =
E N D
Prekladové gramatiky Vychádzajú z predpokladov: • Jednoduchej SDTS Každé pravidlo má tvar: A x0B1x1 ... Bnxn , y0B1y1 …Bnyn , Množiny vstupných a výstupných symbolov sú disjunktné T D = • Potom možno každé pravidlo SDTS písať ako pravidlo gramatiky, teda v tvare A x0y0B1x1y1 ... Bnxnyn
Prekladové gramatiky Df Prekladovou gramatikou (PG) budeme nazývať BKG Gp = ( N, T D, P, S ) pričom T D = Vstupným / výstupným homomorfizmom hi / ho prekladovej gramatiky Gp nazývame zobrazenie hi : N T D N T {e } ho : N T D N D {e }
Vstupný a výstupný homomorfizms hi(X) = X pre X N T ;Inak hi(X) = e ho(X) = X pre X N D ;Inak ho(X) = e Rozšírenie na definičné obory (N T D )* hi(e) = ho(e) = e hi(X) = hi(X) hi() ho(X) = ho(X) ho() X N T D (N T D )*
Preklad špecifikovaný PG Nech Gp = ( N, T D, R, S ), pričom T D = Potom preklad P(Gp) špecifikovaný Gp je definovaný ako: P(Gp) = { (hi(w), ho(w) ) / w L (Gp)} Reaťazec w nazývane charakteristickou vetou – reťazcom prekladu P(Gp) Ak (x, y) P(Gp) , potom x T* nazývame vstupná veta alebo vstupný reťazec, y D*nazývame výstupná veta alebo výstupný reťazec – prekladom reťazca x
Sémantická jednoznačnosť Preklad, v ktoromkaždej vstupnej vete zodpovedá jediná výstupná veta nazývame jednoznačný. Prekladová gramatika sa nazýva sémanticky jednoznačná ak neobsahuje žiadne dve pravidlá tvaru A | Pre ktoré platí hi() =hi()
Príklad • Majme nasledujúcu prekladovú gramatiku G = ({E, T, F}, {+, *, a, (, ) } {+’, *’, a’}, P, E) P: E E + T+’ | T T T * F*’ | F F ( E ) |a a’
Preklad (derivácia) reťazca(a + a ) * a E E + T+’ | T T T * F*’ | F F ( E ) |a a’ E T T * F *’ F * F *’ (E) * F *’ (E + T +’ ) * F *’ (a a’ + T +’ ) * F *’ (a a’ + F +’ ) * F *’
Preklad (derivácia) reťazca(a + a ) * a; Cont. E E + T+’ | T T T * F*’ | F F ( E ) |a a’ (a a’ + a a’+’ ) * F *’ (a a’ + a a’+’ ) * a a’*’ Charakteristická veta: (a a’ + a a’+’ ) * a a’*’ Vstupná veta: (a + a) * a Výstupná veta: a’ a’ +’ a’ *’
Prekladový strom • Prekladový strom je derivačný strom, ktorý zodpovedá derivácii charakteristickej vety
Prekladový strom k prekladu reťazca (a + a ) * a E T T F * *’ F a a’ E ( ) E + T +’ T F F a a’ a a’
Atribútové gramatiky • Gramatiky ako špecifikačné prostriedky umožňujú cez deriváciu generovať vety jazyka • Umožňujú kontrolu štruktúry jazyka • Neumožňujú počas derivácie tok informácií spojených so symbolmia brať takdo úvahy kontext • Už sme povedali že jednotlivé časti prekladača zdielajú „spoločnú pamäť“ – tabuľku symbolov • Toto umožňujú atribútové gramatiky cez atribúty pripojené k symbolom gramatiky
Atribútové gramatiky df Pod atribútovou gramatikou AG rozumieme trojicu AG = (G, TA, F) Kde G je BKG, TA je množina typov atribútov F je množina sémantických pravidiel
Gramatika v AG G = (N, T, P, S) je BKG, ktorej pravidlá budeme písať v tvare p: X0 X1X2 ... Xnp alebo Xp,0 Xp,1 Xp,2 ... Xp,np Čo nám umožní identifikovať miesto symbolu v pravidle. Tak ako doteraz , aj v prípade atribútových gramatík sa budeme snažiť zápis riešiť lexikograficky a budeme naďalej využívať kontext a vyhnúť sa tak indexovaniu
Atribúty TA je množina typov atribútov. Pre každý symbol X N T existujú disjuktné množiny D(X) typov dedičných atribútov,S(X) typov syntetizovaných atribútov. D(X) = pre X T – ošetrujú sa iným spôsobom D(X) = pre X = S – ako uvidíme, začiatočný symbol „môže dediť“ z operačného prostredia A(X) = D(X) S(X) TA = A(X) X N T
Sémantické pravidlá F Sú spojené so syntaktickými pravidlami gramatiky. Slúžia na vyhodnocovanie atribútov spojených s každým symbolom gramatiky. Súčasne sa zabezpečuje tok informácií – atribútov spojených so symbolmi gramatiky počas derivácie.
Vyhodnotenie atribútov • Ku každému výskytu symbolu Xk v pravidle p: X0 X1X2 ... Xnp , 0 k np, Sú pripojené atribúty, ktorých typy určuje A(Xk) . Atribút pripojený k Xk v pravidle „p“ označujeme (p, t, k) • Pre každý dedičný atribút neterminálu na pravej strane pravidla a každý syntetizovaný atribút ľavých strán pravidla existuje v F sémantické pravidlo pre vyhodnotenie príslušného atribútu z atribútov ostatných symbolov pravidla. • Syntetizované atribúty terminálov sa ošetrujú samostatne
Množina závislostí Množina závislostí Zp,t,k je množina atribútov, ktoré používa sémantické pravidlo fp,t,k na výpočet hodnoty atribútu (p, t, k)
Zápis Ako som uviedol, budeme využívať kontext Ak je pravidlo známe – p vynecháme. Ako výberový operátor hodnoty typu atribútu daného symbolu budeme používať „ .“. Teda ak je pravidlo p: X0 X1X2 ... Xnp Potom hodnotu typu atribútu t, symbolu Xk budeme označovať Xk . t.
Sémanticky vyhodnotený derivačný strom Nech AG = (G, TA, F) je atribútová gramatika, w L(G), potom sémanticky vyhodnoteným derivačným stromom pre w je derivačný strom D vety w v G rozšírený takto: • Nech u0 je vrchol v D, ohodnotený X. Ak A(X) = { t1 , t2 , … , tn}, potom k ohodnoteniu vrchola u sa pripoja atribúty { t1 , t2 , … , tn}, • Nech u0 je vnútorný vrcholD ohodnotený Xp,0 priami nasledovníci u1,u2, …, un sú ohodnotení Xp,1 , Xp,2 , … , Xp,n . Potom sa k vrcholom ui pripoja atribúty vyhodnotené na základe sémantického pravidla fp, t,i .
Vyhodnotenie atribútov sémantickým pravidlom fp, t k Ak tkD (Xp,k) pre 1 k n, resp. t0S (Xp,0) a v F je sémantické pravidlo fp,t,k : (p, t, k) := V, kde V je výraz s atribútmi zo Zp,t,k , potom hodnota atribútu t pripojeného k vrcholu uk je rovná hodnote výrazu V, v ktorom je atribút (p, t’, j) pre 1 j n, t’A(Xp,j), nahradený hodnotou atribútu t’ pripojeného k vrcholu uj .
Zobrazenie vyhodnotenia atribútov pre p: X0 X1X2 ... Xnp Syntetizované atribúty X0 Dedičné atribúty X0 X0 Sémantické pravidlá pre p da X1 sa sa da sa da X2 Xn
Ošetrenie terminálov • Terminálne symboly sa „ošetrujú“ v rámci lexikálnej analýzy. • V rámci sémanticky vyhodnoteného derivačného stromu už hovoríme iba o atribútovaných reťazcoch – symbolom sú už atribúty priradené a vyhodnotené.
Príklad Nasledujúcou atribútovou gramatikou špecifikujeme spôsob vyhodnocovania aritmetického výrazu. Hodnotu číslice získame funkciou kód, teda napr. z ASCII kódu G = ({E, T, F}, {0,1, …, 9}, P, E) TA = {v} Priradenie: E, T, F ako syntetizovaný atribút.
Pravidlá – syntaktické a sémantické Syntax Sémantika E E + T E0.v := E1.v + T.v E T E.v := T.v T T * F T0.v := T1.v * F.v T F T.v := F.v F (E) F.v := E.v F C F.v := C.v F FC F0.v := 10 * F1.v + C.v C 0 |1 | … | 9 C.v := kód(č) pre každú číslicu
Sémanticky vyhodnotený derivačný strom E v:=171 v:=19 * 9 T v:=19 T * F v:=9 F v:=19 E v:=17+2 C v:=9 ( ) v:=2 E v:=17 + T T v:=9 v:=17 v:=2 9 F F v:=10*1+7 C v:=2 F v:=1 C v:=7 C v:=2 v:=1 2 7 v:=7 1 v:=1
Poučenie z príkladu • Aby sme mohli vyhodnoť sémantické pravidlo, musíme poznať hodnoty atribútov v príslušnej množine závislostí (musíme vedieť vykonať príkaz := , teda vyhodnotiť výraz V na pravej strane :=. To poznáme) • Vyhodnotenie atribútov sa uskutočňuje pechádzaním derivačného stromu metódou „pre order“ – ľavou deriváciou vytvárame derivačný strom, potom sa vraciame s postupným vyhodnotením atribútov • Derivačný strom nemusí byť vyhodnotiteľný jedným prechodom (dokonca môžu vznikať cykly)
LA – atribútové gramatiky Nech AG = (G, TA, F) je atribútová gramatika, v ktorej každá množina závislostí spĺňa Podmienku Zp,t,k D(Xp,0) ni=1S(Xp,i) Kde pre k = 0 je t S (Xp,0) , pre 1 k n je t D (Xp,k) Potom atribúty derivačného stromu možno vyhodnotiť jedným prechodom, ak Zp,t,k ni=kS(Xp,i) = Pre 1 k n , t D (Xp,k)
Inými slovami Jedným prechodom derivačným stromom možno atribúty vyhodnotiť vtedy, ak v každom kroku prechodu stromu spôsobom „pre – order“ poznáme všetky potrebné hodnoty. To znamená, že atribúty vnútorného vrcholu môžu závisieť iba od toho, - čo symbol, ktorým je ohodnotený „zdedil“ – získali sme to počas prechodu k danému vrcholu, (nesieme ich prechádzaním „pre-order“) alebo - od toho, čo možno zosyntetizovať z atribútov, ktoré sú v strome „pod ním“ (prinesieme ich, keď sa budeme vracať)
Atribútová prekladová gramatika APG je trojica APG = (G, TA, F) Kde G je prekladová gramatika TA množina typov atribútov F je množina sémantických pravidiel Rovnako sú stanovené aj podmienky vyhodnotenia atribútov jedným prechodm – budeme hovoriť o LA APG
Príklad Majme danú gramatiku jazyka zjednodušených deklarácií jazyka typu algol / C G= ({S, D, L}, {i, , , ; , real, int, bool}, P, S}) S D D real L ; D int L ; D bool L ; L i L L, i
Poznámky • Symbol i repreentuje identifikátor a jeho atribútom bude meno identifikátora • Chceme špecifikovať preklad deklarácií do postupnosti príkazov DCL(i, typ, adr), kde i je meno identifikátora, typ je označenie jeho typu, adr udáva adresu pridelenú premennej s identifikátorom i. • Vytvoríme si zodpovedajúcu APG.
PG pre preklad deklarácií Východisko - príkaz DCL potrebujeme generovať pre každú premennú => objaví sa ako výstupný symbool k „identifikátoru premennej“. Vytvoríme najprv PG. Jej pravidlá budú: S D D real L ; D int L ; D bool L ; L i DCL L L, iDCL Gp =({S, D, L}, {i, , , ; , real, int, bool} {DCL}, P, S})
APG pre preklad deklarácií Atribúty: Identifkátor i – požadujeme jeho meno. Bude jeho atribútom. Textový tvar získame cez funkciu text. Výstupný symbol DCL – požadujeme aby dodal ifnformácie - meno identifikátora deklarovanej premennej, - jej typ - jej adresu Preto symbol DCL bude mať atribúty: meno, typ a adr
Tok informácií pri derivácii Aby sme zabezpečili „tok“ informácií, budú uvedené atribúty pripojené aj k ostatným neterminálom Bázovú adresu ukladania premenných získame / zdedíme z operačného prostredia – bude to prvá voľná adresa na ukladanie premenných Alokáciou adresy premennej treba určiť „novú“ prvú voľnú adresu. Práve to nám umožňuje syntetizovaný atribút, ktorý „zvýši“ pôvodnú „prvú voľnú“ adresu, ktorú „zdedil“ a ponúkne ju ako „dedičstvo“ pre ďalší symbol. Preto atribút adr bude dedičný a syntetizovaný.
Tok informácií pri derivácii – zdielanie informácie • Z programovacích jazykov vieme, že meno typu platí pre celý zoznam premenných uvedených v danej deklarácii. Preto treba zabezpečiť aj tok „tejto informácie“ a umožniť jej zdielanie všetkými premennými v danom zozname. • Maná dedičných a syntetizovaných atribútov budú mať prefixy d resp. s.
Pravidlá APG Syntax Sémantika S D D.dadr := S.dadr S.sadr := D.sadr D real L ; L.dadr := D.dadr D.sadr := L.sadr L.dtyp := real D int L ; Analogicky až na int D bool L ; Analogicky až na bool
Pravidlá APG Cont, L i DCLDCL.did := text (i) DCL.dtyp := L.dtyp DCL.dadr := L.dadr L.sadr := L.dadr + 1 L L, i DCL L1.dtyp := L0.dtyp L1.dadr := L0.dadr DCL.did := text (i) DCL.dtyp := L0.dtyp DCL.dadr := L1.sadr L0.sadr := L1.sadr + 1
Poznámky • Adresu sme zvyšovali o „1“. V realite treba zohľadniť dĺžku slova • V DS budeme používať skrátené zápisy da a sa pre dadr a sadr. Uvedieme ich hneď pri derivácii.
Sémanticky vyhodnotený DS S da sa D da sa L dtyp, da,sa int +1 ; , i L dtyp,da,sa text(i)-ic DCL did,dtyp,da +1 <ic, int, baza+2> , L dtyp,da,sa did,dtyp,da i text(i)-ib DCL +1 <ib, int, baza+1 i text(i)-ia DCL did,dtyp,da <ia, int, baza>