1.05k likes | 1.25k Views
Preklad a jeho špecifikácia. Prekladač a preklad. Prekladač sme si definovali ako: Program, ktorý transformuje (preloží) program V zdrojovom jazyku – zdrojový program Do cieľového jazyka – cieľový program V procese prekladu / v preklade vystupujú teda dva jazyky : zdrojový a cieľový
E N D
Prekladač a preklad Prekladač sme si definovali ako: • Program, ktorý transformuje (preloží) program • V zdrojovom jazyku – zdrojový program • Do cieľového jazyka – cieľový program V procese prekladu / v preklade vystupujú teda dva jazyky : zdrojový a cieľový Vstupným programom / jazykom prekladu budeme nazývať – zdrojový program / jazyk Výstupným programom / jazykom prekladu budeme nazývať – cieľový program / jazyk
Preklad df Nech T je vstupná a D výstupná abeceda. Potom formálnym prekladom jazyka L1 T* – zdrojového jazyka, do jazyka L2 D* – cieľového jazyka, budeme nazývať reláciu C L1 x L2 Ak ( x, y ) C potom y nazývame výstupom alebo prekladom x.
Príklad Ako príklady prekladov aritmetických výrazov z infixového zápisu (operátor je medzi operandami) do postfixového zápisu (operátor je za operandami) možno uviesť: (a, a ) ( a + b, a b + ) ( a + b * c, a b c * + ) (( a + b ) * c , a b + c * ) ( sin , sin )
Špecifikácia Na špecifikáciu jazykov sme si definovali prostriedky:generatívne – gramatiky, akceptačné – automaty.
Špecifikácia prekladu Aj teraz hľadáme konečný mechanizmus / procedúru Teraz potrebuje špecifikovať dvojice Vieme ich však, ako jazyky, špecifikovať samostatne Túto znalosť využijeme. Hľadaný mechanizmus / procedúra bude „kompozíciou“ špecifikácií vstupného a výstupného jazyka Intuitívne je to OK: programu zodpovedá program, cyklu zodpovedá cyklus, podmienenému príkazu podmienený príkaz, ...
Spôsoby špecifikácie • Generatívne – bude generovať iba tie dvojice, ktoré sú prvkom danej relácie – prekladu • Akceptačne – procedúra rozhodne, či predložená dvojica je prvkom danej relácie – prekladu, alebo nie
Prostriedky špecifikácie prekladu • Generatívne • syntaxou riadené prekladové schémy SDTS (Syntax Directed Translation Scheme) • Prekladové gramatiky • Akceptačne – prekladové automaty
SDTS Syntaxou riadenou prekladovou schémou C (ďalej iba SDTS) budeme nazývať 5 ticu: C = ( N, T, D, R, S ) Kde N je množina neterminálov, T je množina vstupných terminálov - vstupná abeceda D je množina výstupných terminálov - výstupná abeceda S je začiatočný symbol – je to neterminál R je množina pravidiel
Pravidlá SDTS • Pravidlá R SDTS majú tvar A , Kde : A N, ( N T)* ( N D)* Pričom neterminály v sú permutáciou neterminálov a zodpovedajúce si neterminály v a sú jednoznačne definované hovoríme, že sú vzájomne viazané .
Prekladová forma Analogický ako sme definovali vetnú formu, definujeme teraz prekladovú formu (zoberieme do úvahy dvojice) Pre prekladovú schému C = ( N, T, D, R, S ) Budeme prekladovú formu definovať nad ( N T)* x ( N D)* s jednoznačným priradením zodpovedajúcich si – viazaných - neterminálov. Definovať ju budeme rekurzívne takto:
Prekladová forma df • ( S, S) je prekladová forma a neterminály S si navzájom zodpovedajú – sú viazané, • Ak ( A, A )je prekladová forma , v ktorej vyznačené neterminály A sú viazané a A γ , γ je pravidlo z R, potom aj ( γ , γ )je prekladová forma, v ktorej neterminály v γ a γ sú viazané takým spôsobom ako v pravidle A γ , γ . Poznámka: viazanosť neterminálov sa vyznačuje lexikograficky – v prípade nejasnosti budeme používať horný index
Derivácia Nad prekladovým formami možno definovať reláciu derivácie takto: Medzi prekladovými formami ( A, A ) a ( γ , γ ) platí relácia derivácie práve vtedy, ak v pravidlách R je pravidlo A γ , γ Podobne ako v gramatikách zavedieme: Stupeň relácie k, reflexívny a tranzitívny uzáver * a tranzitívny uzáver + .
Preklad špecifikovaný SDTS df Nech C = ( N, T, D, R, S ) je SDTS. Potom preklad P(C), špecifikovaný SDTS C, je definovaný takto: P(C) = { (x , y) / (S, S) * (x, y), x T*, y D*}
Príklad Majme SDTS: C = ({E, T, F}, {+, *, a, (, ) }, {+, *, a}, R, E) R: E E + T, E T + E T, T T T * F, T F * T F, F F ( E ), E F a, a Táto SDTS špecifikuje preklad aritmetického výrazu z infixového zápisu do postfixového zápisu.
E E + T, E T + E T, T T T * F, T F * T F, F F ( E ), E F a, a Príklad prekladových foriem (E, E) - definitoricky (E + T, E T +) – pretože v R je pravidlo E E + T, E T +
E E + T, E T + E T, T T T * F, T F * T F, F F ( E ), E F a, a Príklad derivácie Preklad reťazca a * ( a + a ) možno získať nasledujúcou deriváciou. Ukážeme si aj viazanosť a potrebu ju vyznačiť. (E, E) Treba rozhodnúť, ktoré pravidlo použiť (T, T) (T * F, T F *)Viazanosť neterminálov je jasná (F * F, F F *) Viazanosť neterminálov už nie je jasná. Vyznačíme ju. (F1 * F2, F1 F2 *) (a * F, a F *)Viazanosť neterminálov je znova jasná
E E + T, E T + E T, T T T * F, T F * T F, F F ( E ), E F a, a Príklad derivácie Cont. (a * (E) , a E *) (a * (E + T), a E T + *) (a * (T1 + T2) , a T1 T2 + * ) (a * (F + T) , a F T + *) (a * (a + T) , a a T + *) (a * (a + F) , a a F + *) (a * (a + a) , a a a + *) Prekladom reťazca a * (a + a) je reťazec a a a + *
Preklad a vstupná a výstupná gramatika • Vstupný a výstupný jazyk prekladu je špecifikovaný gramatikou, ktorú tiež voláme vstupná a výstupná. • Ich vzťah k SDTS špecifikujúcej zodpovedajúci preklad je nasledujúci
SDTS a a vstupná a výstupná gramatika Nech C = ( N, T, D, R, S ) je SDTS. Potom vstupnou / výstupnou gramatikou SDTS C nazývame gramatiky Gi , Go definované takto: Gi= ( N, T, Pi, S) Pi = {A / A , je v R } Go= ( N, D, Po, S) Po = {A / A , je v R }
Sémanticky jednoznačná SDTS SDTS C = ( N, T, D, R, S ) je sémanticky jednoznačná, ak v R neexistujú žiadne dve pravidlá tvaru: A , A ,
Jednoduchá SDTS Nech C = ( N, T, D, R, S ) je SDTS. Potom SDTS C budeme nazývať jednoduchá SDTS, ak pre každé pravidlo A , platí, že viazané neterminálne symboly sú v rovnakom poradí v i v . Preklad špecifikovaný jednoduchou SDTS nazývame jednoduchý syntaxou riadený prekld. Poznámka: viazanosť neterminálov jednoduchej SDTS je priamočiara – daná kontextom.
Príklad Preklad jazyka aritmetických výrazov v infixovom tvare do jazyka aritmetických výrazov v prefixovom tvare možno špecifikovať SDTS C: C = ({E, T, F}, {+, *, a, (, ) }, {plus, krat, (, ), a}, R, E) R: E E + T, plus (E , T) E T, T T T * F, krat (T , F ) T F, F F ( E ), E F a, a
Preklad (a + a) * a E E + T, plus (E , T) E T, T T T * F, krat (T , F ) T F, F F ( E ), E F a, a (E, E) (T, T) (T * F, krat (T , F )) (F * F, krat ( F, F)) (( E ) * F, krat ( E , F)) (( E + T) * F, krat ( (plus ( E , T) ), F)) (( T + T) * F, krat ( (plus ( T , T) ), F)) (( F + T) * F, krat ( (plus ( F , T) ), F))
Preklad (a + a) * a Cont. (( a + T) * F, krat ( (plus ( a , T) ), F)) (( a + F) * F, krat ( (plus ( a , F) ), F))) (( a + a) * F, krat ( (plus ( a , a) ), F)) (( a + a) * a, krat ( (plus ( a , a) ), a))
Regulárny preklad Analogicky ako pri gramatikách, možno aj pri SDTS urobiť obmedzenia na pravidlá a dostať tak triedy prekladov. Začneme tým najjednoduchším – regulárnym prekladom. Spolu s ním zavedieme aj akceptačný spôsob špecifikácie prekladu – prekladový automat. Aj pri prekladových automatoch budeme vychádzať zo špecifikácie jazyka.
Konečný prekladový automat Konečným prekladovým automatom budeme nazývať šesticu M = (Q, T, D, δ , q0, F) kde Q je (konečná) množina stavov, T je (konečná) množina vstupných symbolov – vstupná abeceda D je (konečná) množina výstupných symbolov – výstupná abeceda q0 je začiatočný stav, q0 Q F je množina koncových stavov δje zobrazenie Q x (T { e }) 2Q x D *
Poznámky Konečný prekladový automat (KPA) je vo všeobecnosti nedeterministický KPA umožňuje e-prechody – vstup sa neberie do úvahy ( nič sa ani v danom prechode zo vstupu neakceptuje) V každom kroku (prechode) generuje na výstup reťazec výstupných terminálov, možno aj prázdny reťazec (D*) Činnosť sa aj v tomto prípade definuje pomocou prechodového zobrazenia
Konfigurácia KPA Nech M = (Q, T, D, δ , q0, F) je KPA. Potom nad Q x T* x D* definujeme konfiguráciu KPA M ako trojicu (q, x, y) kde q Q x T* , y D* Začiatočná konfigurácia: (q0 , u, e), kde u je vstupný reťazec Koncová konfigurácia: (qf , e, v) kde qf F je koncový stav v je výstupný reťazec.
Relácia prechodu Nech M = (Q, T, D, δ , q0, F) je KPA. Potom nad množinou konfigurácií Q x T* x D* definujeme reláciu prechodu nasledujúcim spôsobom. Ak a T { e } x T* , y D* , z D* Potom (q, ax, y) (r, x, yz) práve vtedy, ak δ(q, a) obsahuje (r, z) Analogický ako pre KA možno definovať stupeň a uzávery relácie prechodu n , * , +
Reprezentácia relácie prechodu Analogická ako pri KA - prechodovou tabuľkou, - prvky sú dvojice, prípadne množiny dvojíc - stavovým diagramom - ak δ(q, i) obsahuje (p, o)ohodnotenie hrany z q do p je v tvare i / o (– vstup / výstup)
Preklad špecifikovaný KPA Nech M = (Q, T, D, δ , q0, F) je KPA. Potom preklad P(M) špecifikovaný KPA M je definovaný nasledujúcim spôsobom: P(M) = {(u , v) / (q0 , u, e) * (qf , e, v) ; u T*,vD* , qf F } Preklad špecifikovaný KPA nazývame regulárny preklad.
Príklad Majme KPA M = ({qn , qp , qf}, {0, 1 }, {0, 1}, , qp , {qf })
Reprezentácia stavovým diagramom 0 / 0 1 / 1 0 / 0 qp Štart qn 1 / 1 e / 0 e / 1 qf
Činnosť KPA M zisťuje paritu binárneho reťazca. Ako výstup dáva pôvodný reťazec doplnený „0“ v prípade nepárneho počtu „1“ –tiek, „1“ v prípade párneho počtu „1“ –tiek. Činnosť si ukážeme pre vstupné reťazce 101 a 111 (qp , 101, e) (qn , 01, 1) (qn , 1, 10) (qp , e, 101) (qf , e, 1011)
Preklad reťazca 111 (qp , 111, e) (qn , 11, 1) (qp , 1, 11) (qn , e, 111) (qf , e, 1110)
Determinizmus KPA KPA M = (Q, T, D, δ , q0, F) budeme nazývať deterministickým, ak pre všetky stavy z Q platí jedna z nasledujúcich podmienok • δ(q, a) obsahuje nanajvýš jeden prvok pre každé a T a δ(q, e) = , alebo • δ(q, e) obsahuje nanajvýš jeden prvok a δ(q, a) = pre každé a T
Príklad Majme KPA M = ({q0 , q1 }, {+, -, . , 0, 1 }, {+, -, . , 0, 1}, , q0 , {q1 })
Činnosť KPA M vynecháva nevýznamné „0“ pred číslom zapísaným v binárnom tvare. Preklad reťazca–000101.01 je: (q0 , –000101.01, e) (q0 , 000101.01, – ) (q0 , 00101.01, – ) (q0 , 0101.01, – ) (q0 , 101.01, – ) (q1 , 01.01, –1 ) (q1 , 1.01, –10 ) (q1 ,.01, –101 ) (q1 , 01, –101. ) (q1 , 1, –101.0 ) (q1 , e, –101.01 )
Viac výstupov pre jeden vstup KPA môže dávať pre jeden vstup aj viac výstupov. Ak M = (Q, T, D, δ , q0, F) je KPA, potom M(x) = { y / (x, y) P(M) } M(L) = M( x ) X L
Viazanosť KA a KPA Nech K = (Q, T, δ , q0, F) je KA a M = (Q, T, D, λ , q0, F) je KPA Potom automaty K a M nazývame viazanými, ak pre všetky (q, a) Q x T δ( q, a ) = { p / ( p, b ) λ( q, a ), pre b D*}.
Vzájomný vzťah SDTS a KPA Nech C = (N, T, D, R, S) je SDTS, ktorej vstupná i výstupná gramatika sú regulárne gramatiky, teda každé pravidlo z R má jeden z tvarov C aB, bB C a, b Kde C, B sú neterminály, a je vstupný, b výstupný terminál, Potom možno vytvoriť KPA M = (Q, T, D, δ , q0, F) pre ktorý platí, že P (M) = P (C)
Konštrukcia Konštrukcia: Q = N {A}, pričom A N T = T D = D q0 = S F = { A } : pre všetky a T, b D, B N, C N platí: ak B a , b R tak (A , b) (B, a) ak B aC , bC P tak (C , b) (B, a) (A, a) = ø
Zásobníkové prekladové automaty Zásobníkovým prekladovým automatom budeme nazývať osmicu H = (Q, T, Z, D, δ , q0, z0, F) kde Q je množina stavov, T je množina vstupných symbolov – vstupná abeceda Z je množina symbolov zásobníka D je množina výstupných symbolov – výstupná abeceda q0 je začiatočný stav, q0 Q z0 je začiatočný symbol zásobníka F je množina koncových stavov δje zobrazenie Q x (T { e }) x Z 2 Q x Z* x D*
Poznámky Zásobníkový prekladový automat (ZPA) je vo všeobecnosti nedeterministický ZPA umožňuje e-prechody – vstup sa neberie do úvahy ( nič sa ani v danom prechode zo vstupu neakceptuje) V každom kroku (prechode) generuje - na vrch zásobníka reťazec symbolov zásobníka, možno aj prázdny reťazec - na výstup reťazec výstupných terminálov, možno aj prázdny reťazec Činnosť sa aj v tomto prípade definuje pomocou prechodového zobrazenia
Konfigurácia ZPA Nech H = (Q, T, Z, D, δ , q0, z0, F) je ZPA. Potom nad Q x T* x Z*x D* definujeme konfiguráciu ZPA M ako štvoricu (q, u, , v) kde q Q u T* , Z*, v D* Začiatočná konfigurácia: (q0, i,z0,e), kde i je vstupný reťazec Koncová konfigurácia: (qf , e,,o) kde qf F je koncový stav o je výstupný reťazec.
Relácia prechodu Nech H= (Q, T, Z, D, δ , q0, z0, F) je ZPA. Potom nad množinou konfigurácií Q x T* x Z*x D* definujeme reláciu prechodu nasledujúcim spôsobom. Ak a T { e } ;x T* y, w D* ; z Z ; , Z*; Potom (q, ax, z, y) (r, x, , yw) práve vtedy, ak δ(q, a, z) obsahuje (r,, w) Analogický ako pre KPA možno definovať stupeň a uzávery relácie prechodu n , * , +
Preklad Nech H= (Q, T, Z, D, δ , q0, z0, F) je ZPA. Potom preklad P(H), špecifikovaný ZPA H je definovaný takto: P(H) = { (u, v) / (q0 , u, z0 , e) *(qf , e, , v), qf F, u T* , Z*, v D*} Preklad s prázdnym zásobníkom Pe(H) = { (u, v) / (q0 , u, z0 , e) *(qf , e, e , v), qf F, u T* , v D*} Poznámka: oba prípady špecifikujú tú istú triedu prekladov. Existuje ekvivalentný ZPA
Príklad Majme nasledujúci ZPA H: H = ({q}, {a, +, *}, {+, *, E}, {a, +, *}, δ, q, {q}) δ: δ(q, a, E) = {(q, e, a)} δ(q, +, E) = {(q, EE+, e)} δ(q, *, E) = {(q, EE*, e)} δ(q, e, +) = {(q, e, +)} δ(q, e, *) = {(q, e, *)} KPA špecifikuje preklad z prefixového zápisu do postfixového zápisu.
Preklad reťazca +*aaa δ: δ(q, a, E) = {(q, e, a)} δ(q, +, E) = {(q, EE+, e)} δ(q, *, E) = {(q, EE*, e)} δ(q, e, +) = {(q, e, +)} δ(q, e, *) = {(q, e, *)} (q, +*aaa, E, e) (q, *aaa, EE+, e) (q, aaa, EE*E+, e) (q, aa, E*E+, a) (q, a, *E+, aa) (q, a, E+, aa*) (q, e, +, aa*a) (q, e, e, aa*a+)